ffmpeg -i /2160.mp4 -deadline best -speed 1 \
-c:a libopus -b:a 128k -ar 48000 \
-c:v libvpx-vp9 -pix_fmt yuv420p \
-map v:0 -vf:v:0 "scale=-2:720,setsar=1:1,fps=60" -g 240 -minrate:v:0 900k -b:v:0 1800k -maxrate:v:0 2610k \
-map 0:a \
-init_seg_name "init-\$RepresentationID\$.\$ext\$" \
-media_seg_name "chunk-\$RepresentationID\$-\$Number%05d\$.\$ext\$" \
-dash_segment_type webm \
-use_template 1 -use_timeline 0 -seg_duration 10 \
-adaptation_sets "id=0,streams=v id=1,streams=a" \
-f dash/x6/dash.mpd
我不断遇到错误
[dash @ 0x5592972d3040] Segment durations differ too much, enable use_timeline and use_template, or keep a stricter keyframe interval
每种质量都有对应的比特率表,我严格遵守
https://developers.google.com/media/vp9/settings/vod?hl=ru
转换效果很好,但没有提到 dash,我在哪里可以阅读有关它的内容?
-g 240 -minrate:v:0 900k -b:v:0 1800k -maxrate:v:0 2610k
我可以假设问题出在这些参数上......
我所能做的就是随意设置值并希望成功,这从根本上就是错误的......
有人有什么想法可以解决这个问题吗?
如果没有该-g 240
参数,转换将在任意地方彻底失败......
-g 240
该问题是由于和-seg_duration 10
(60fps)的组合而导致的。保持更严格的关键帧间隔:
-g 240
每 240 帧应用一个关键帧。以每秒 60 帧的速度,编码器每 4 秒添加一个关键帧(240/60)。
-seg_duration 10
将段时间设置为 10 秒。分割视频流时,建议(也是默认)在关键帧处进行分割。
每 4 秒有一个关键帧,时间分别为:0、4、8、12、16、20、24...
当 FFmpeg 要求在 10 秒处分割时,它无法做到,因为它不是关键帧。
最接近的分割时间是 8 秒或 12 秒(而不是 10 秒)。
我不太清楚分割算法,但假设第一次分割为 12 秒,第二次分割为 20 秒。
结果是 12 秒长和 8 秒长的片段,这超过了建议的50% 建议容差,因此 FFmpeg 显示警告消息(不确定 FFmpeg 警告逻辑)。
为了实现更均匀的分割,请将 GOP 大小设置为片段持续时间的倍数,反之亦然(将片段持续时间设置为 GOP 大小的倍数)。
例子:
-g 120
(每 2 秒)或-g 300
(每 5 秒)...-seg_duration 8
...示例(选择
-seg_duration 8
):警告信息也说“启用
use_timeline
并use_template
...”。设置时
-use_template 1 -use_timeline 1
,没有警告。