深入理解ffmpeg第四章封装与解封装

书籍基本信息

书名: 《深入理解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,暂时不仔细研究

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值