一、音视频包含哪些数据
对于一个mp4文件我们可以通过音视频分析软件打开查看内部信息。
从两图可以看出mp4文件一般包含 音频流 视频流等。
对于上面的字段大致分析如下
Format | 编码方式 | AVC | 现在大部分视频都是这种编码方式,即H264。 |
CodecId | 编码器id | avc1 | H264封装有2种格式:h264和avc1,avc1一般通过ffmpeg转码生成的视频 不带起始码0×00000001的 |
Duration | 播放时间 | 可以在解码时获取显示 | |
Bit rate | 比特率 | 1929Kbps | 指视频或音频文件在单位时间内使用的数据流量 |
Frame rate | 帧率 | 25 | 一秒钟显示的图片数 |
Chroma Subsampling | 采样排列方式 | 4:2:0 | 4:4:4表示完全取样。 4:2:2表示2:1的水平取样,垂直完全采样。 4:2:0表示2:1的水平取样,垂直2:1采样。 4:1:1表示4:1的水平取样,垂直完全采样 |
Channel | 声道数 | 2channels | 双声道(音频才有) |
Sampling Rate | 采样率 | 44.1KHZ | 每秒钟采样的次数 |
二、音视频解封装流程
封装格式相关函数
◼ avformat_alloc_context();负责申请一个AVFormatContext
结构的内存,并进行简单初始化
◼ avformat_free_context();释放该结构里的所有东西以及该
结构本身
◼ avformat_close_input();关闭解复用器。关闭后就不再需要
使用avformat_free_context 进行释放。
◼ avformat_open_input();打开输入视频文件
◼ avformat_find_stream_info():获取视频文件信息
◼ av_read_frame(); 读取音视频包
◼ avformat_seek_file(); 定位文件
◼ av_seek_frame():定位文件
区分不同的码流
AVMEDIA_TYPE_VIDEO视频流
video_index = av_find_best_stream(ic,AVMEDIA_TYPE_VIDEO,-1,-1, NULL, 0);
AVMEDIA_TYPE_AUDIO音频流
audio_index = av_find_best_stream(ic,AVMEDIA_TYPE_AUDIO,-1,-1, NULL, 0)
三、解封装分析
avformat_open_input和avformat_find_stream_info分别用于打开一个流和分析流信息。
在初始信息不足的情况下(比如FLV和H264文件),
avformat_find_stream_info接口需要在内部调用
read_frame_internal接口读取流数据(音视频帧),然后再分
析后,设置核心数据结构AVFormatContext。
由于需要读取数据包,avformat_find_stream_info接口会带来
很大的延迟。