我使用手机以通常的方式通过 javascript 等将实时视频流式传输到我的服务器。getUserMedia()
然后我使用 FFMPEG 对其进行实时编码并在其上添加覆盖视频。
出于某种原因,每次我将手机旋转到横向模式或返回纵向模式时,叠加视频都会向前跳转。直播流编码时叠加视频不会被修改。它只是来自硬盘的视频文件,没有流。有什么想法吗?
我尝试了不同的 FFMPEG 版本,但行为总是一样的。
视频样本
这是正在发生的事情的简短样本。
下载 2mb
示例后即可使用
,可与在线 Mega Player 23mb
示例一起使用
FFMPEG 命令
ffmpeg -re -i strm.webm -i overlay.webm -filter_complex "[0:v]scale=640:480:force_original_aspect_ratio=decreasepad=640:480:-1:-1:color=black[main];[1]scale=iw/1.5:-1setpts=PTS-STARTPTS,format=yuva420p[ovrl]; [main][ovrl]overlay=W-w-10:10[v]; [0:a][1:a]amerge[a]" -r 24 -deadline realtime -crf 22 -cpu-used 15 -level 2.0 -map "[v]" -map "[a]" -c:a aac -c:v libvpx -pix_fmt nv12 -threads 4 -strict -2 -auto-alt-ref 0 -b:v:1 1800k -s:v:1 1280x720 -b:v:0 300k -s:v:0 640x480 -bf 1 -keyint_min 48 -g 48 -sc_threshold 1 -b_strategy 0 -ar:a:1 96000 -scenario livestreaming -look_ahead 0 -seg_duration 2 -remove_at_exit 1 -streaming 1 -window_size 30 -adaptation_sets "id=0,streams=v id=1,streams=a" -utc_timing_url https://time.akamai.com/?iso -live 1 -y -f dash manifest.mpd
正如@Rotem 正确指出的那样,“setpts” 就是问题所在。
出于某种原因,旋转引起的分辨率变化导致“setpts” 为覆盖设置了新的错误时间戳。所以我删除了 setpts 选项。
没有 setpts,就没有新的错误时间戳。
因此 filter_complex 看起来就像这样: