音视频学习总结
ffmpeg库的使用
可以直接从
7
07-01-FFmpeg解封装解码:如解析出mp4中的各种流,音频流、视频流、字幕流等。主要涉及两个结构体AVFormatContext和AVPacket。AVFormatContext存储流信息,AVPacket存储包信息(可以将流当成很多个包的集合)
代码:本代码功能:打印媒体文件中的流信息(打印AVFormatContext结构体中的信息)
打印流中每个包的信息(打印AVPacket 结构体中的信息)
07-02-AAC ADTS格式(音频格式)分析:ADTS可以在任意帧解码,也就是说它每⼀帧都有头信息。AAC⾳频⽂件(ADTS格式)的每⼀帧由ADTS Header和AAC Audio Data组成。⼀般情况下ADTS的头信息都是7个字节,分为2部分: adts_fixed_header();和adts_variable_header();。ADTS Header存放着采样率、码率、声道数、帧长度等信息。
代码:本代码将媒体文件中的音频利用AAC ADTS格式进行保存。从代码中可以看出,视频流中的AAC数据是没有包含头部的,头部需要自己去写。
07-03-H264 NALU分析:H264简介、IDR为I帧、H264将视频组织成为 序列(GOP)、图⽚(pictrue)、⽚(Slice)、宏块(Macroblock)、⼦块(subblock)五个层次进行网络传输。
NALU (视频流的网络传输单元):H.264原始码流(裸流)是由⼀个接⼀个NALU组成。每个NALU的开头都是一个StartCode("00 00 00 01" 或"00 00 01"),用于标识一个NALU的开始。
av_bsf_get_by_name("h264_mp4toannexb")将mp4模式转换为annexb模式
代码:本代码将媒体文件中的视频利用H264格式进行保存。
07-04-FLV格式分析-FLV封装格式剖析:FLV常用于直播。FLV封装格式是由⼀个⽂件头(file header)和 ⽂件体(file Body)组成。其中,FLV body由⼀ 对对的(Previous Tag Size字段 + tag)组成。
⼀个flv⽂件最多只有⼀个⾳频流,⼀个视频流。(mp4中就可能存在多个同种流)
每⼀个Tag也是由两部分组成:tag header和tag data。FLV Header和Tag Header中都有标识数据类型和长度的字段
tag data有三种:script、video、audio
代码:本代码一个bit一个bit地对flv文件进行解析。首先解析flv文件的头部和tag头部,然后分别解析tag data中包含的h264文件和aac文件,解析h264就是解析出一个个NALU并在NALU前面加上startcode,解析aac就是解析出一个个AAC Audio data并加上ADTS header。
本代码利用解析得到的信息,重新封装得到一个新的flv文件。