![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
FFMPEG
文章平均质量分 50
Mango酱
这个作者很懒,什么都没留下…
展开
-
FFmpeg调用avformat_open_input时返回错误 -22(Invalid argument)
FFmpeg原创 2022-07-02 10:33:03 · 4073 阅读 · 2 评论 -
关于使用AV_SEEK_FRAME快进缩进时的用法
1 会产生花屏的做法对画面质量硬性要求不太高时可以这样做。1)avformat,用AVSEEK_FLAG_ANY。2)avcodec解码时,AV_CODEC_FLAG_OUTPUT_CORRUPT必须软解(CPU)。2 标准做法对画面质量要求比较高时,最好使用以下的标准做法。1)avformat, 用AVSEEK_FLAG_BACKWARD。2)解码丢帧直到pts >= target_position, 然后再渲染。...原创 2021-03-31 16:32:33 · 612 阅读 · 0 评论 -
关于H264相关的EBSP,RBSP,SODP的说明
1 关于H264相关的EBSP,RBSP,SODP的说明1)EBSP:扩展字节序列载荷(Encapsulated Byte Sequence Payload),它去掉了00 00 01/00 00 00 01这些起始码,但包含了0x3防止竞争码,原因是防止与起始码重复。2)RBSP:原始字节序列载荷(Raw Byte Sequence Payload),字节对齐后的SODP,它在SODP尾部添加了一个1和若干个0用于字节对齐。3)SODP:数据字节流(String Of Data Bits),不对齐原创 2021-03-11 18:12:00 · 1352 阅读 · 0 评论 -
H.264中的熵编码算法(主讲指数哥伦布编码)
以下文章参考于殷文杰的博客。https://yinwenjie.blog.csdn.net/article/details/523015841 熵编码基本概念1)“熵”这一概念原本来自于化学和热力学,用于度量能量退化的指标,即熵越高,物体或系统的做功能力越低。后来香农将这一概念引入到信息论中,用于表示消息的平均信息量。信源的熵通常可以表示信源所发出信息的不确定性,即越是随机的、前后不相关的信息,其熵越高。2)在信息论中,香农提出了信源编码定理。该定理说明了香农熵与信源符号概率之间的关系,说明信息原创 2021-03-11 17:44:40 · 844 阅读 · 0 评论 -
关于ngx_rtmp_hls_append_sps_pps造成的hls: error appenging SPS/PPS NALs错误
关于ngx_rtmp_hls_append_sps_pps造成的hls: error appenging SPS/PPS NALs错误一giao我哩giao。今天在调试同rtmp配合nginx推流的时候,发现推live可以推成功,结果在推hls时出现以上错误,经过一顿猛虎操作,发现nginx错误日志报出了一下图片错误:然后根据这个狗东西回到源码看看是什么原因造成的,看下面图片,看到是先因为在ngx_rtmp_hls_copy拷贝时缺少了5个字节的原因造成的那个狗东西。*in是类似一种节点,里面包含这原创 2020-10-24 15:31:41 · 467 阅读 · 0 评论 -
windows服务器运行ffmpeg报错,mfplat.dll模块已加载但找不到入口点dllregisterserver
windows服务器运行ffmpeg报错-mfplat.dll模块已加载但找不到入口点dllregisterserver1首先找到对应的mfplat.dll版本。我的是将别人win7+64位系统的mfplat.dll即目录在C:\Windows\SysWOW64\拷贝到win7对应的C:\Windows\SysWOW64\目录下。注意:拷贝到电脑的C:\Windows\SysWOW64\而不是 C:\Windows\System32\。2在C:\Windows\System32\目录下找到cm原创 2020-10-12 19:31:48 · 5615 阅读 · 0 评论 -
海康PS转H264的编码思想(带图码流解释)
海康PS转H264的编码思想(带图码流解释)01PS流格式02封装时遇到的重点问题1 海康的PS流发包的顺序到底是如何发送的?根据01PS流格式我们知道他的格式,由PS头,系统头,映射头,PES包(包括包头和视频或者音频数据);但是却不知道他是实际是怎么发包过来的,这也是导致我们编写代码的一个问题,他到底是完整的按一个PS包发过来还是一个个段的先发PS头,再发系统头,再发映射头和最后发PES包,还是先发PS头,再连续发系统头和映射头,然后再发PES包呢?这当时确实也是非常的困扰我,无法下手,于是经过原创 2020-10-11 22:54:21 · 3004 阅读 · 12 评论 -
关于封装海康PS流转H264需要注意的问题
关于封装海康PS流转H264需要注意的问题这里记录一下在实现转码PS成H264后封装成C++代码时遇到的一些坑。1我在封装的时候,将GetH264FromPs函数声明位static,导致传进来的this指针被销毁(静态没有this),造成我的对象数据全部变成负无穷的数字,无法使用,关键他还没有报错,只有打断点才查处理;2C++成员函数不能作为回调函数,因为其有this指针,参数是不一致的,可以使用boost库的funtional+bind去适配,但是对于循环调用C++的成员回调函数,是不行的,或者原创 2020-09-24 21:04:56 · 1115 阅读 · 0 评论 -
14关于FFmpeg九个常见结构体重要字段的总结
关于FFmpeg九个常见结构体重要字段的总结1 封装上下文AVFormatContexttypedef struct AVFormatContext { ff_const59 struct AVInputFormat *iformat;//输入文件的AVInputFormat结构体,指明码流数据用到封装格式。例如flv,mkv。 可认为是存放文件的头部信息。例如flv的头部。输入时由avformat_open_input()自行设置,我们只需要使用即可。 ff_const59 struct AVOu原创 2020-12-04 14:31:33 · 629 阅读 · 0 评论 -
13关于FFmpeg的pts转时基时的计算步骤(包括无输入流地址和有输入流地址)
关于FFmpeg的pts转时基时的计算步骤(包括无输入流地址和有输入流地址)理解前提:相关计算格式://1 s与内部时基ms的转换,实际上上一篇文章也讲了pts(ms)=AV_TIME_BASE*pts(s);pts(s) = pts(ms)/AV_TIME_BASE;//2 两帧时间差的计算,注:1是我们的人类的时基单位,即秒(s)时间差=时基/帧率。//例如帧率为25时,x=1/25=0.04。可换算成知道时基求帧率公式。//3 pts=时间差*n。//其中n为自增变量,pts为直接原创 2020-12-04 14:31:09 · 2005 阅读 · 3 评论 -
12关于FFmpeg的四种时基和时基相关函数的分析及其场景用法
关于FFmpeg的四种时基和时基相关函数的分析及其场景用法前言:AVRational类型:是一个分数。例如{1,25}表示1除以25即1/25。时基:时间的单位,在ffmpeg下被描述成时基。时间戳:某个时刻的时间。1 FFmpeg的四种时基抛开解码器上下文的时基即stream->codec->time_base(因为编码时基本不用,所以我这里不讲它,它也叫tbc,称之为流中的时基)。我们FFmpeg实际上编码经常使用的时基有四种:1)输入流封装上下文的时基,也叫容器的时基,即A原创 2020-12-04 14:31:01 · 1295 阅读 · 0 评论 -
11关于FFmpeg的dump打印出来的tbc,tbn,tbr的解释
关于FFmpeg的dump打印出来的tbc,tbn,tbr的解释1 关于tbn、tbc、tbr三个时基的讲述1)tbn:容器(container)的时基。对于输入容器:bn一般是针对于输入容器的,被存放在封装上下文的视频流数组中的time_base,即AVFormatContext结构中的AVStream结构的成员time_base。例如我们dump函数打印时的左上角带有Input,就是代表输入流容器的信息。对于输出容器:也是存放于上面的结构体中,但是因为我们需要转成各种流输出,所以输出的tbn会原创 2020-12-04 14:30:54 · 1351 阅读 · 0 评论 -
10关于FFmpeg各个常见结构体共同有的字段的获取(帧率,码率,时长,时基等)和其它一些信息(封装名,编解码器名等)的获取注意点
关于FFmpeg各个常见结构体共同有的字段分析(帧率,码率,时长等)1 帧率在哪些常见结构体(9个)中被包含1)在AVStream中:AVRational avg_frame_rate;//平均帧率。AVRational r_frame_rate;//实时帧率。2)在AVCodecContext中:AVRational time_base;//该字段与流中的time_base同名,但意思不一样,流中的是与时间相关的时基单位,这里的意思主要是帧率,一般设置为帧率的倒数,例如帧率fps={25,1}原创 2020-12-03 19:23:10 · 2721 阅读 · 1 评论 -
09FMPEG的AVFrame结构体分析
FMPEG的AVFrame结构体分析概述:该结构体位于libavutil库中的frame.h中。1 AVFrame结构体typedef struct AVFrame {#define AV_NUM_DATA_POINTERS 8 /** * pointer to the picture/channel planes. * This might be different from the first allocated byte * * Some de原创 2020-12-03 19:22:28 · 488 阅读 · 0 评论 -
08FFMPEG的AVPacket结构体分析
FMPEG的AVPacket结构体分析概述:该结构体位于libavcodec库中的packet.h中。1 AVPacket结构体typedef struct AVPacket { /** * A reference to the reference-counted buffer where the packet data is * stored. * May be NULL, then the packet data is not reference-count原创 2020-12-03 19:22:06 · 689 阅读 · 0 评论 -
07FFMPEG的AVCodec结构体分析
FFMPEG的AVCodec结构体分析注意:非公共区域的字段我可能不会翻译,因为翻译也不知道说什么,还是保留着原文更好。其它的结构体分析同理。1 AVCodec 结构体typedef struct AVCodec { /** * 编解码器实现的名称。 * 该名称在编码器和解码器之间是全局唯一的(但编码器和解码器可以共享相同的名称)。(即各种编码器名字唯一和各种解码器名字唯一,但是编解码器可以共享名字。) * 从用户的角度来看,这是找到编解码器的主要方法。原创 2020-12-03 19:21:42 · 189 阅读 · 0 评论 -
06FFMPEG的AVCodecContext结构体分析
FFMPEG的AVCodecContext结构体分析1 AVCodecContext编解码结构体位于libavcodec库里。AVFormatContext,AVInputFormat,AVOutputFormat,AVStream均位于libavformat库里。该结构体包含着关于编解码器的信息。typedef struct AVCodecContext { /** * 关于av_log结构的信息。 * - 由avcodec_alloc_context3函数设置。原创 2020-12-03 19:21:10 · 1249 阅读 · 0 评论 -
05FFMPEG的AVIOContext结构体分析
FFMPEG的AVIOContext结构体分析概述:该结构体位于libavformat库中的avio.h中。1 AVIOContext结构体typedef struct AVIOContext { /** * A class for private options. * * If this AVIOContext is created by avio_open2(), av_class is set and * passes the options d原创 2020-12-03 19:20:21 · 249 阅读 · 0 评论 -
04FFMPEG的AVStream结构体分析
FFMPEG的AVStream结构体分析1 AVStream结构体typedef struct AVStream { int index; /**< stream index in AVFormatContext */ /** * 具体格式的stream ID. * decoding: 由libavformat库设置。 * encoding: 由用户设置。 如果未设置,则使用libavformat替换 */ int id;#i原创 2020-12-03 19:19:46 · 2234 阅读 · 0 评论 -
03FFMPEG的AVOutputFormat结构体分析
FFMPEG的AVOutputFormat结构体分析1 AVOutputFormat输出封装结构体分析与AVInputFormat类似。/* * 该结构体保存着输出文件指明码流数据用到封装格式。例如flv,mkv。 可认为是存放输出文件的头部相关属性信息。例如flv的头部。位于封装上下文结构体AVFormatContext的内部。 * * 注意:该结构体只有在复用时才有效,由avformat_alloc_output_context2(&m_outputContext, nullptr原创 2020-12-03 19:19:10 · 688 阅读 · 0 评论 -
02FFMPEG的AVInputFormat结构体分析
FFMPEG的AVInputFormat结构体分析1 AVInputFormat结构体对于FFmpeg没给注释的,我尽量找对应的注释,确实没有的证明我们不需要知道。/* * 该结构体保存着输入文件指明码流数据用到封装格式。例如flv,mkv。 可认为是存放文件的头部相关属性信息。例如flv的头部。 * * 注意:该结构体只有在解复用时才有效,由avformat_open_input打开时初始化赋值。复用时该结构体无效,因为复用时是输出,有效的是输出的AVOutputFormat *oforma原创 2020-12-03 19:18:30 · 366 阅读 · 0 评论 -
01FFMPEG的AVFormatContext结构体分析和输出时AVFormatContext的初始化(包含有输入和无输入的AVFormatContext)
FFMPEG的结构体分析1 AVFormatContext该结构体的英文注释让我给去掉了,因为很多在写代码的时候用不到,这里只给出重要的成员解释,当然有可能我会帮你们译成中文。/* * 封装上下文结构体*/typedef struct AVFormatContext { /** * 用于日志和@ref avoptions的类。由avformat_alloc_context()设置。 * 导出(de)muxer私有选项如果存在。 */ const AV原创 2020-12-03 19:17:35 · 585 阅读 · 0 评论 -
FFMPEG之海康实时回调出来的PS流格式
FFMPEG之海康实时回调出来的PS流格式前言:我们知道,利用海康的实时预览接口可以实时监控,并且可以设置回调函数取出码流数据。而根据海康的参考文档中,回调函数的数据类型有三种,一个是系统头;一个是码流数据;另一个是其它数据,这三个值分别对应宏值为0,1,2。但是我们需要注意,当值=1时,该码流数据并不是h264类型(好像有部分设备是支持直接输出H264,我不太记得了),而是被封装成PS流格式的类型。所以我们在推流或者保存的过程中,需要将PS流转成H264码流。海康针对H264 做如下PS 封装: 每原创 2020-09-06 16:45:59 · 8982 阅读 · 10 评论 -
FFMPEG之编码实现RTMP循环推流(附带av_interleaved_write_frame返回-22处理)04
FFMPEG之编码实现RTMP循环推流(附带av_interleaved_write_frame返回-22处理)前言本篇是参考雷神的推流进行二次处理的,可以参考雷神这篇博客。[最简单的基于FFmpeg的推流器(以推送RTMP为例)](https://blog.csdn.net/leixiaohua1020/article/details/39803457)。为了防止遗忘,在此记录下来当时做题的过程。我当时实现这个功能的时候,确实非常困难,参考的博客不多,而且还被许多博客带偏了。。。前天开始弄,连续两晚原创 2020-09-03 21:38:26 · 3292 阅读 · 2 评论 -
FFMPEG之H264获取NALU并且解析其RBSP类型03
FFMPEG之H264获取NALU并且解析其RBSP类型03前言FFMPEG之H264理论篇。理论的就不多讲了,可以参考上面那篇文章,下面将给出两种版本,一种是我自己的,用C++方法实现,另一种是雷神版本的,基本是纯C语言。区别是我多了一个将EBSP转成RBSP的函数,而雷神只是简单的将码流数据转成NALU后,将头部信息的优先级、NALU的类型和统计每一个NALU的字节大小LEN。并且都是经过测试没有bug(针对于我),如果有的话大家可以指出共同研究。 我的版本注释很清楚了,而雷神版本的有空再把注释打原创 2020-08-30 11:30:30 · 1774 阅读 · 0 评论 -
FFMPEG之H264理论篇02
FFMPEG之H264理论篇02前言由于刚接触音视频行业,需要去对视频进行编解码,所以这几天就去看了H264相关的博客和视频,当然少不了雷神的博客,但是雷神的博客理论部分几乎没有说,而且大部分人的博客都是讲得非常混乱的,很难去分析对与错。本来想拿几天搞掂,结果自己一查,才知道要想吃透H264根本没有那么简单,所以这里只是深入研究到RBSP部分,剩下的片、宏块、子块以及熵编码、哥伦布编码等等具体的只能先放着了,因为上班也没有太多时间给你研究。1 H263与H264的分层结构H.263 定义的码流结构是原创 2020-08-29 23:41:02 · 560 阅读 · 0 评论 -
FFMPEG之RTP协议(实时传输协议)01
FFMPEG之RTP协议(实时传输协议)011 RTP与RTCP控制协议1)RTP协议功能:用于网络上实时传输音视频数据的标准数据包格式,例如流媒体、视频会议、电视服务等等。2)RTP为何需要RTCP配合使用:RTP可以提供低延时的数据传送服务,但无法保证数据包到达客户端时仍然保持着发送时的顺序,所以要依靠RTCP来完成流量控制和拥塞监控。3)RTP为何需要与序列号?在OSI七层模型中,RTP协议运行在传输层,其他底层协议也可以和RTP协同工作。RTP数据包被UDP通过封装头形成UDP包。R原创 2020-08-25 20:31:00 · 2986 阅读 · 0 评论