书籍基本信息
书名: 《深入理解FFmpeg》
作者: 刘歧、杜金房、宋韶颍 等
出版社: 电子工业出版社
出版时间: 2020 年
适合读者: FFmpeg 开发者、音视频工程师、对 FFmpeg 源码感兴趣的技术人员。深入理解
深入理解FFmpeg - 第1章 多媒体基础 - 刘歧 赵军 杜金房 赵文杰 宋韶颍 - 微信读书
目标
第四章主要讲解了mp4,flv,mpeg-ts,hls。总结mp4 核心知识点,以及前面文章未提到的一些信息。
MP4文件box
box概念
MP4文件结构
具体请看
通过网盘分享的文件:MP4文件box.svg
链接: https://pan.baidu.com/s/1aZwdf7ukAquQlasb0iDtIg 提取码: 6wvx
--来自百度网盘超级会员v6的分享
FFmpeg解封装MP4常用参数
FFmpeg封装MP4常用参数
举例
#默认moov是在后面,使用命令把moov移到mdat前
ffmpeg -i input.flv -c copy -f mp4 output.mp4
ffmpeg -i input.flv -c copy -f mp4 -movflags faststart output.mp4
当生成DASH格式的时候,会使用一种特殊的MP4格式。我们可以通过dash参数进行生成。
ffmpeg -i input.flv -c copy -f mp4 -movflags dash output.mp4
FFmpeg通过参数isml可以发布ISML直播流,将ISMV推流至IIS服务器,并可以通过参数isml进行转换。
ffmpeg -re -i input.mp4 -c copy -movflags isml+frag_keyframe -f ismv Stream
Apple相关平台上的播放兼容问题,核心是需要-tag:v hvc1。
如果没有这个标签,VLC打开该视频没有问题,但QuickTime播放器则不行。
ffmpeg -i input.mp4 -c:v libx265 -c:a aac -crf 25 -tag:v hvc1 outputh265.mp4
FLV
理论可看前期文章
FFmpeg的FLV Muxer参数
FLV的标准并不支持H.265,如果想要支持,需要自行在FFmpeg中定制。
ffmpeg -i input_ac3.mp4 -vcodec copy -acodec aac -f flv output.flv
生成带关键索引的FLV 关键帧建立一个索引 这样播放端就可以依据这些索引信息执行快进、跳转等操作
ffmpeg -i input.mp4 -c copy -f flv -flvflags add_keyframe_index output.flv
视频文件转MPEG-TS
ts流分析前期文章有写
MPEG-TS Muxer参数说明
如果要用FFmpeg创建一个恒定速率的TS流,必须使用-muxrate参数
视频文件转HLS
HLS使用H.264作为MPEG-2 TS分片封装的视频编解码器,对分段文件的引用包含在M3U8清单文件中。前期文章有提到。
HLS内容支持加密,一般用AES-128进行加密。对于HTTP的分发,可以使用一个额外的SSL加密层。
HLS与MPEG-DASH的简单比较
FFmpeg的HLS封装参数
从文件转HLS直播时
ffmpeg -i input.mp4 -c copy -f hls -bsf:v h264_mp4toannexb output.m3u8
-bsf:v h264_mp4toannexb,这个参数的作用是将MP4中的H.264数据转换为H.264 Annex B标准格式。Annex B标准编码常见于实时传输流中,是MPEG-TS要求的码流封装格式。
start_number参数设置M3U8中第1片的序列数为300
ffmpeg -i input.mp4 -c copy -f hls -bsf:v h264_mp4toannexb -start_number 300 output.m3u8
hls_time参数设置M3U8列表中切片的duration。
ffmpeg -i input.mp4 -c copy -f hls -bsf:v h264_mp4toannexb -hls_time 10 output.m3u8
hls_list_size可以控制M3U8列表中TS分片的个数。
ffmpeg -i input.mp4 -c copy -f hls -bsf:v h264_mp4toannexb -hls_list_size 3 output.m3u8
TS分片序号等于hls_wrap参数设置的数时则回滚。
ffmpeg -i input.mp4 -c copy -f hls -bsf:v h264_mp4toannexb -hls_wrap 3 output.m3u8
hls_base_url为设置M3U8列表中文件路径前置基本路径的参数。
ffmpeg -i input.mp4 -c copy -f hls -hls_base_url http://192.168.0.1/live/ -bsf:v h264_mp4toannexb output.m3u8
hls_segment_filename为设置M3U8列表中切片文件名的规则模板的参数
ffmpeg -i sintel-1280-surround.mp4 -c copy -vframes 1000 -f hls -hls_segment_filename test_output-%d.ts -bsf:v h264_mp4toannexb output.m3u8
delete_segments参数可删除不在M3U8列表中的旧文件。这里需要注意,FFmpeg删除切片时会根据hls_list_size的大小加1作为删除的依据。
ffmpeg -f lavfi -i testsrc2=s=176x144:r=15 -vcodec libx264 -g 30 -r:v 15 -f hls -hls_time 2 -hls_list_size 4 -hls_flags delete_segments -t 30 output-test.m3u8
round_durations子参数实现切片信息的duration为整数值。
ffmpeg -i input.mp4 -c copy -f hls -hls_flags round_durations -bsf:v h264_mp4toannexb output.m3u8
discont_start子参数在生成M3U8时,在切片信息前插入discontinuity标签。该方法可以用于相邻TS切片之间出现不连续,比如时间戳跳转,或者TS的连续计数器不连续等时。
ffmpeg -i input.mp4 -c copy -f hls -hls_flags discont_start -bsf:v h264_mp4toannexb output.m3u8
等等。。。由于工作中没使用到hls,暂时不仔细研究