ffmpeg优化mp4以及hls参数设置

ffmpeg是开源的音频视频编解码工具
然而默认的参数对MP4不友好,需要自己设置
这里记录一下简单的优化参数

优化MP4使moov atom位于文件开头


moov atom是mp4的索引信息.
浏览器获得moov atom后,可以随机搜索文件位置,让拖动自由
ffmpeg默认是将moov atom放在文件末尾,我们需要前置moov atom
-movflags faststart关键参数
ffmpeg -i input.mp4 -movflags faststart -acodec copy -vcodec copy output.mp4

优化HLS自定义切片时间(非定长切片时间)


非定长切片时间目前仅适用于直播,点播无法生效
ffmpeg默认HLS切片时间是2秒. 我们需要实现前5块都是1秒切片时间,剩下的切片时间为5秒一块
下面的代码可以实现(需要为ffmpeg打补丁),具体详情请看末尾参考文章
-hls_init_time 1 -hls_time 5 -hls_flags split_by_time -hls_list_size 0 -hls_allow_cache 1
ffmpeg -i input.mp4 -profile:v baseline -level 3.0 -s 1280x720 -hls_init_time 1 -hls_time 5 -hls_flags split_by_time -hls_list_size 0 -hls_allow_cache 1 -f hls index.m3u8

其他优化


自定义码率/分辨率,使用HTTP2等等,以后收集到再更新
开源软件Handbrake可以使用'Web Optimized'选项,它将移动moov atom到文件开头
收集的压缩参数
M:\bin\ffmpeg.exe -i M:\bin\input.mp4 -preset slower -c:v libx264 -r 30 -crf 28 -c:a copy crf28.mp4

  ffmpeg -i input.mp4 -c:v libx264 -s 1280x720 -r 30 -preset medium -g 60 -keyint_min 60 -sc_threshold 0 -bf 3 -b_strategy 2  -b:v 1000k -maxrate 1100k -bufsize 1000k -c:a aac -b:a 128k -ac 2 -ar 48000  output.mp4

强制GOP间隔


强制2秒一个关键帧
M:\bin\ffmpeg -i input.mp4 -c:v libx264 -preset veryfast -g 1200 -keyint_min 1200 -sc_threshold 0  -force_key_frames expr:gte(t,n_forced*2) M:\bin\force-gop-output.mp4

检测关键帧间隔命令
M:\bin\ffprobe4.2.2 -i M:\bin\force-gop-output.mp4 -skip_frame nokey -select_streams v:0 -show_entries frame=pkt_pts_time -of csv=print_section=0

参考文章 http://ffmpeg.org/pipermail/ffmpeg-devel/2016-August/198357.html
https://streaminglearningcenter.com/wp-content/uploads/2016/11/Cloud_encoder_with_FFmpeg-1.pdf
问题地址 https://trac.ffmpeg.org/ticket/7305
补丁地址 https://patchwork.ffmpeg.org/patch/9653/
http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20160827/281eb87c/attachment.obj
推荐工具 https://axiomui.github.io/
https://handbrake.fr/

此处评论已关闭