简介
打算记录一下基于FFmpeg
的封装格式处理方面的例子。包括了视音频分离,复用,封装格式转换。这是第2篇。
本文记录一个基于FFmpeg
的视音频分离器(Simplest FFmpeg demuxer
)。视音频分离器(Demuxer
)即是将封装格式数据(例如MKV
)中的视频压缩数据(例如H.264
)和音频压缩数据(例如AAC
)分离开。如图所示。在这个过程中并不涉及到编码和解码。
本文记录的程序可以将一个MPEG2TS
封装的视频文件(其中视频编码为H.264
,音频编码为AAC
)分离成为两个文件:
一个H.264
编码的视频码流文件,一个AAC
编码的音频码流文件。
前一篇文章中,记录一个简单版的视音频分离器。相比于前一篇文中的分离器,本篇文章记录的分离器复杂了很多。相比于简单版的分离器,学习的难度大了一些。但是该分离器可以很好地处理FFmpeg
支持的各种格式(例如分离AAC
音频流),拥有更好的实用性。
流程图
程序的流程如下图所示。从流程图中可以看出,一共初始化了3
个AVFormatContext
,
其中1
个用于输入,另外2
个分别用于视频输出和音频输出。
3
个AVFormatContext
初始化之后,通过avcodec_copy_context()
函数可以将输入视频/音频的参数拷贝至输出视频/音频的AVCodecContext结构体
。
最后,通过av_read_frame()
获取AVPacket
,根据AVPacket
类型的不同,分别使用av_interleaved_write_frame()
写入不同的输出文件中即可。
PS:对于某些封装格式(例如MP4/FLV/MKV
等)中的H.264
,需要用到名称为“h264_mp4toannexb
”的bitstream filter
。
简单介绍一下流程中各个重要函数的意义:
avformat_open_input()
:打开输入文件。
avcodec_copy_context()
:赋值AVCodecContext
的参数。
avformat_alloc_output_context2()
:初始化输出文件。
avio_open()
:打开输出文件。