Eu uso meu telefone para transmitir vídeos ao vivo para meu servidor da maneira usual com JavaScript e getUserMedia()
etc. Então, uso FFMPEG para codificá-lo em tempo real e, adicionalmente, coloco um vídeo de sobreposição nele.
Por algum motivo, cada vez que giro o telefone para o modo paisagem ou de volta para o modo retrato, o vídeo de sobreposição avança no tempo. O vídeo de sobreposição não está sendo modificado enquanto a transmissão ao vivo está sendo codificada. É apenas um arquivo de vídeo do disco rígido, sem transmissão. Alguma ideia do que está acontecendo?
Tentei diferentes versões do FFMPEG, mas o comportamento é sempre o mesmo.
Laranja é a transmissão ao vivo. Verde é a sobreposição:
Amostra de vídeo
Aqui está uma pequena amostra do que está acontecendo.
Funciona após baixar 2mb
Sample
Funciona com o Mega Player online 23mb
Sample
Comando 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
Como @Rotem corretamente apontou, “setpts” era o problema.
Por algum motivo, a mudança de resolução, causada pela rotação, levou a novos timestamps incorretos sendo definidos por “setpts” para a sobreposição. Então, eu apenas removi a opção setpts.
Sem setpts, sem novos timestamps falsos.
Então o filter_complex se parece com isto: