解封装->软硬件解码->像素格式转换->重采样->pts/dts->同步策略
ffmpeg音视频解封装用到的函数和结构体
av_register_all() 注册所有的解封装格式和加封装格式(通用各种格式)打Open()之前必须先调用它
avformat_network_init() 直接解Rtsp(我们的摄像机或摄像机协议),通过网络打开文件,还支持Http
比如:把一个视频放到web服务器上面,只要把http地址传过来,它同样可以打开,需要把这个网络模块初始化好
int avformat_open_input(...) 解析出里面的视频流,音频流及参数还有视频帧的索引
(1)av_register_all avformat_network_init 已调用
(2)AVFormatContext **ps 指定格式(频繁使用)
- 传一个指针地址,这个指针地址指向空的空间,那么它内部就会创建这个空间
- 直接创建AVFormatContext在传进来,它会把这些解封装的内容全写到我们创建好的结构体里面。注意!清理出问题,动态链接库当中创建的链接只能在动态链接库里清理,外部的链接去动态链接库清理会出问题,所以要内存分离开来清理
- **ps指向的是空,那内存空间就有close()来清理(指针的指针:指针的地址 AVFormatContext (*p)传参就传&,把指针的地址传进来就好了)
(3)const char *url
(4)AVIContext *pb;char filename[1024]; 自定义格式读或从内存里读(文件IO上下文)断开重连
(5)unsigned int nb_streams;
(6)AVStream **streams; 视频:宽高,帧率 音频:采样率,样本大小,格式
- AVCodecContent *codec;//过时了
- AVRational time_base;//分数,1s占多少分之一
- int64_t duration; //毫秒
- duration *((double) time_base.num/(double) time_base.den)*1000
- int64_t nb_frames;
- AVRational avg_frame_rate; //帧率
- AVCodeParameters *codecpar;(音视频参数)
- enum AVMediaType codec_type;
- enum AVCodecID codec_id;
- uint32_t codec_tag;
- int format; //样本格式
- int width;int height;
- uint64_t channel_layout;int channel;int sample_rate;int frame_size;
(7)int64_t duration;//AV_TIME_BASE 这是宏,时间长度
(8)int64_t bit_rate; 1s占文件的大小,8bit一个字节,网络适应
(9)void avformat_close_input(AVFormatContext **s); 指针地址,关闭,把一块指针空间清理掉之后,要把它置零(而这个函数内部就帮我们置零了)
int avformat_find_stream_info(...) 查找文件的格式或索引 (探测)“获取文件(流)中的信息” 包含以下(1)(2)两个参数
(1)AVFormatContext *ic;
(2)AVDictionary **options
flv(没法获取时长)H262 mpeg2
av_find_best_stream(...)
(1)解封装之后,需要处理,去分开音频和视频,要知道它们对应的参数,独立处理,需要找到音频流和视频流
(2)另一种方式是直接遍历它的返回值的成员数组streams[],存了所有流(视频,音频,字幕,扩展信息
int av_find_best_stream(
AVFormatContext *ic,
enum AVMediaType type,
int wanted_stream_nb,
int related_stream,
AVCodec ** decoder_ret,
int flags )
结构体
AVFormatContest
AVStream 视频流和音频流都放在这里
AVPacket 针对封装完之后的具体的数据包 它包含了pts,dts,stream inst,它把HR_64的间隔符(0001或001)去除掉了,在做成自己格式发出去时,要添加,通过av_read_frame(...)读取,就能区分是音频还是视频了,而AVPacket并没有存这个内容是视频还是音频,只存了索引
- AVBufferRef *buf;
- int64_t pts;//p