FFmpeg转封装
音视频文件转MP4格式
-
在互联网常见的格式中,跨平台最好的应该是MP4文件,因为MP4文件既可以在PC平台的Flashplayer中播放,又可以在移动平台的Android、IOS等平台中进行播放,而且使用系统默认的播放器可播放。
- MP4文件由许多个Box与FullBox组成
- 每个Box由Header和Data两部分组成
- FullBox是Box的扩展,其在Box结构的基础上,在Header中增加8位version标志和24位的flags标注。
- Header包含了整个Box的长度的大小(size)和类型(type),
- Data为Box的实际数据,可以是纯数据,也可以是更多的子Box
- 当一个Box中Data是一系列的子Box时,这个Box又可以称为Container(容器)Box -
解析MP4多媒体文件时需要一些关键的信息
- moov容器。定义了一个MP4文件中的数据信息,类型是moov,是一个容器Atom,其至少必须包含以下三种Atom中的一种:
- mvhd标签,Movie Header Atom,存放未压缩过的影片信息的头容器
- cmov标签,Compressed Movie Atom,压缩过的电影信息容器,此容器不常用
- rmra标签,Reference Movie Atom,参考电影信息容器,此容器不常用
也可以包含其他容器信息,例如影片剪辑信息Clipping atom(clip)、一个或几个trackAtom(trak)、一个Color Table Atom(ctab)和一个User Data Atom(udta).其中,mvhd中定义了多媒体文件的time scale、duration以及display characteristics。而trak中定义了多媒体文件中的一个track的信息,track是多媒体文件中可以独立操作的媒体单位,例如一个音频流就是一个track、一个视频流就是一个track。 -
MP4分析工具。可以用来分析MP4封装格式的工具比较多,除了FFmpeg之外,还有一些常用的工具,如Elecard StreamEye、mp4box、mp4info等。
-
MP4在FFmpeg中的Demuer.使用命令行ffmpeg-h demuxer=mp4查看MP4文件的Demuxer信息:
-
MP4在FFmpeg中的Muxer.
视频文件转FLV
- 在网络的直播与点播场景中,FLV也是一种常见的格式,FLV是Adobe发布的一种可以作为直播也可以作为点播的封装格式,其封装格式非常简单,均以FLVTAG的形式存在,并且每一个TAG都是独立存在的。
- FLV 文件格式分为两部分:一部分为FLV文件头,另一部分为FLV文件内容。
-1.FLV文件头格式解析
- 2.FLV文件内容格式解析
- 3.FLVTAG格式解析
- 4.VideoTag数据解析
- 5.AudioTag数据格式解析
- 6.ScriptDat格式解析 - FFmpeg转FLV参数
- FLV封装中可以支持的视频编码包括:Sorenson H.263, Screen Video,On2VP6,带Alpah通道的On2VP6,Screen Video2,H.264(AVC)
- FLV封装中支持的音频主要包括:限行PCM,大小端取决于平台,ADPCM
- 如果封装FLV时,内部的音频或者视频不符合标准时,那么它们是肯定封装不进FLV的,而且还会报错 - FFmpeg生成带关键索引的FLV
- FLV文件格式分析工具:flvparse,FlvAnalyzer,ffprobe
视频文件转M3U8
- M3U8是一种常见的流媒体格式,主要以文件列表的形式存在。
- FFmpeg转HLS参数
视频文件切片
视频文件切片与HLS基本类似,但是HLS切片在标准中只支持TS格式的切片,并且是直播与点播切片,既可以使用segment方式进行切片,也可以使用ss加上t参数进行切片。
- FFmpeg切片segment参数
- FFmpeg使用ss与t参数进行切片
音视频文件音视频流抽取
当音视频文件出现异常时,除了分析封装数据之外,还需要分析音视频流部分。
- FFmpeg抽取音视频文件中的ACC音频流
./ffmpeg -i input.mp4 -vn -acodec copy output.aac
- FFmpeg抽取音视频文件中的H.264视频流
./ffmpeg -i input.mp4 -vcodec copy -an output.h264
- FFmpeg抽取音视频文件中的H.265数据
系统资源使用情况
- 如果使用FFmpeg仅仅转化封装格式而非转换编码,那么其使用的CPU资源并不多(可以用top命令查看CPU使用率)
- 如果使用FFmpeg进行编码转换,则需要大量的计算,从而将会占用大量的CPU资源