带 DASH 的 FFMPEG 画中画
FFMPEG Picture in picture with DASH
我正在使用 FFMPEG 将视频转码为不同的分辨率,并且工作正常。但是现在我想把两个视频画中画合并成一个视频,然后必须转码成不同的分辨率。
下面的命令是我到目前为止得到的。不幸的是,它仅适用于 170p 分辨率。如果我将播放器切换到 720p,叠加视频就会消失。
我想我必须对合并文件和不同的分辨率使用某种命名方案,这样 FFMPEG 才能区分它们。但是我该怎么做呢?
FFMPEG 命令
ffmpeg \
-re \
-i "input.webm" \
-i "overlay.webm" \
-filter_complex "[1]scale=iw/3:-1[pip];[0][pip]overlay=W-w-10:10:shortest=1[v];[0:a][1:a]amerge[a]" \
-r 30 \
-usage lowlatency \
-qp_b 1 \
-quality ultrafast \
-level 2.0 \
-map "[v]" \
-map "[a]" \
-map 0 \
-c:a aac \
-c:v h264_qsv \
-b:v:1 1800k \
-s:v:1 1280x720 \
-b:v:0 300k \
-s:v:0 320x170 \
-profile:v:0 main \
-profile:v:1 main \
-bf 1 \
-keyint_min 30 \
-g 30 \
-sc_threshold 1 \
-b_strategy 0 \
-ar:a:1 96000 \
-seg_duration 1 \
-remove_at_exit 0 \
-streaming 1 \
-window_size 10 \
-adaptation_sets "id=0,streams=v id=1,streams=a" \
-utc_timing_url https://time.akamai.com/?iso \
-live 1 \
-f dash "manifest.mpd"
我想通了。
我考虑了我所说的关于命名模式的内容,但找不到任何类似的文档。所以我简单地添加了另一个 -filter_complex
并将 [v]
更改为 [v2]
,如下所示:
-filter_complex "[1]scale=iw/3:-1[pip];[0][pip]overlay=W-w-10:10:shortest=1[v2];[0:a][1:a]amerge[a]"
。并且我把第二个分辨率从main
改成baseline
,但是没测试有没有效果
然后我把它映射到第二个视频分辨率:
-map "[v2]" -map "[a]"
所以你最终得到这个命令:
工作命令
ffmpeg \
-re \
-i "input.webm" \
-i "overlay.webm" \
-filter_complex "[1]scale=iw/3:-1[pip];[0][pip]overlay=W-w-10:10:shortest=1[v];[0:a][1:a]amerge[a]" \
-filter_complex "[1]scale=iw/3:-1[pip];[0][pip]overlay=W-w-10:10:shortest=1[v2];[0:a][1:a]amerge[a]" \ <-- Added
-r 30 \
-usage lowlatency \
-qp_b 1 \
-quality ultrafast \
-level 2.0 \
-map "[v]" \
-map "[a]" \
-map "[v2]" \ <-- Added
-map "[a]" \ <-- Added
-c:a aac \
-c:v h264_qsv \
-b:v:1 1800k \
-s:v:1 1280x720 \
-b:v:0 300k \
-s:v:0 320x170 \
-profile:v:0 main \
-profile:v:1 baseline \ <-- Changed from main
-bf 1 \
-keyint_min 30 \
-g 30 \
-sc_threshold 1 \
-b_strategy 0 \
-ar:a:1 96000 \
-seg_duration 1 \
-remove_at_exit 0 \
-streaming 1 \
-window_size 10 \
-adaptation_sets "id=0,streams=v id=1,streams=a" \
-utc_timing_url https://time.akamai.com/?iso \
-live 1 \
-f dash "manifest.mpd"
我正在使用 FFMPEG 将视频转码为不同的分辨率,并且工作正常。但是现在我想把两个视频画中画合并成一个视频,然后必须转码成不同的分辨率。
下面的命令是我到目前为止得到的。不幸的是,它仅适用于 170p 分辨率。如果我将播放器切换到 720p,叠加视频就会消失。
我想我必须对合并文件和不同的分辨率使用某种命名方案,这样 FFMPEG 才能区分它们。但是我该怎么做呢?
FFMPEG 命令
ffmpeg \
-re \
-i "input.webm" \
-i "overlay.webm" \
-filter_complex "[1]scale=iw/3:-1[pip];[0][pip]overlay=W-w-10:10:shortest=1[v];[0:a][1:a]amerge[a]" \
-r 30 \
-usage lowlatency \
-qp_b 1 \
-quality ultrafast \
-level 2.0 \
-map "[v]" \
-map "[a]" \
-map 0 \
-c:a aac \
-c:v h264_qsv \
-b:v:1 1800k \
-s:v:1 1280x720 \
-b:v:0 300k \
-s:v:0 320x170 \
-profile:v:0 main \
-profile:v:1 main \
-bf 1 \
-keyint_min 30 \
-g 30 \
-sc_threshold 1 \
-b_strategy 0 \
-ar:a:1 96000 \
-seg_duration 1 \
-remove_at_exit 0 \
-streaming 1 \
-window_size 10 \
-adaptation_sets "id=0,streams=v id=1,streams=a" \
-utc_timing_url https://time.akamai.com/?iso \
-live 1 \
-f dash "manifest.mpd"
我想通了。
我考虑了我所说的关于命名模式的内容,但找不到任何类似的文档。所以我简单地添加了另一个 -filter_complex
并将 [v]
更改为 [v2]
,如下所示:
-filter_complex "[1]scale=iw/3:-1[pip];[0][pip]overlay=W-w-10:10:shortest=1[v2];[0:a][1:a]amerge[a]"
。并且我把第二个分辨率从main
改成baseline
,但是没测试有没有效果
然后我把它映射到第二个视频分辨率:
-map "[v2]" -map "[a]"
所以你最终得到这个命令:
工作命令
ffmpeg \
-re \
-i "input.webm" \
-i "overlay.webm" \
-filter_complex "[1]scale=iw/3:-1[pip];[0][pip]overlay=W-w-10:10:shortest=1[v];[0:a][1:a]amerge[a]" \
-filter_complex "[1]scale=iw/3:-1[pip];[0][pip]overlay=W-w-10:10:shortest=1[v2];[0:a][1:a]amerge[a]" \ <-- Added
-r 30 \
-usage lowlatency \
-qp_b 1 \
-quality ultrafast \
-level 2.0 \
-map "[v]" \
-map "[a]" \
-map "[v2]" \ <-- Added
-map "[a]" \ <-- Added
-c:a aac \
-c:v h264_qsv \
-b:v:1 1800k \
-s:v:1 1280x720 \
-b:v:0 300k \
-s:v:0 320x170 \
-profile:v:0 main \
-profile:v:1 baseline \ <-- Changed from main
-bf 1 \
-keyint_min 30 \
-g 30 \
-sc_threshold 1 \
-b_strategy 0 \
-ar:a:1 96000 \
-seg_duration 1 \
-remove_at_exit 0 \
-streaming 1 \
-window_size 10 \
-adaptation_sets "id=0,streams=v id=1,streams=a" \
-utc_timing_url https://time.akamai.com/?iso \
-live 1 \
-f dash "manifest.mpd"