Estou tentando criar a aparência de uma imagem em um vídeo usando vários arquivos de vídeo.
Criei um arquivo .mp4 usando FFMpeg. O vídeo é exibido corretamente no aplicativo "Movies & TV" do Windows. Ele não é exibido corretamente no Chrome, Firefox, VLC Media Player ou qualquer outro aplicativo que eu tenha. Pretendo exibir o vídeo em um navegador, portanto, o suporte entre navegadores é importante para mim.
O vídeo foi criado fazendo duas partes de uma videochamada e fazendo o seguinte com o FFMpeg:
- Coloque o vídeo remoto (remote.mp4) em segundo plano.
- O vídeo remoto deverá mostrar a primeira imagem do vídeo e aparecer pausado até cerca de 2.501 segundos. Eu fiz isso usando o itoffset.
- O áudio remoto também deve começar a ser reproduzido após 2.501 segundos. Definir o itoffset não pareceu resolver isso, então adicionei uma opção "adelay" ao filter_complex.
- Colocado vídeo local (local.mp4) como sobreposição no canto inferior direito.
- O vídeo e o áudio locais devem começar a ser reproduzidos em 0 segundos (imediatamente após a reprodução do vídeo).
- Girou a imagem de fundo em 90 graus (foi gravada lateralmente).
- Adicione um atraso de áudio ao vídeo remoto para que ele comece a reproduzir o fluxo de áudio 2.501 segundos após o início.
- Mesclar as entradas de áudio.
- Codec aac usado (porque parece popular, estou totalmente disposto a mudar se isso for útil).
- Use o codec de vídeo h264, novamente porque parece popular.
Meu comando FFMpeg é o seguinte:
ffmpeg -itsoffset 2.501 -i remote.mp4 -i local.mp4 \
-filter_complex \
" [1:v]scale=iw/4:-1:flags=lanczos[loc0]; \
[0:v]transpose=1[rotate1]; \
[rotate1][loc0]overlay=main_w-overlay_w-10:main_h-overlay_h-10:eof_action=pass[rem0]; \
[0:a]adelay=2501|2501[0adelay]; \
[0adelay]apad[0a]; \
[0a][1:a]amerge=inputs=2[a]" \
-map "[rem0]" -map "[a]" \
-ac 2 -vcodec libx264 \
-ar 44100 -acodec aac \
completed.mp4
Propriedades de vídeo:
- concluído.mp4 (16 segundos, 480x640)
- local.mp4 (16 segundos, 640x480)
- remote.mp4 (14 segundos, 640x480, virado de lado)
Quando vejo o vídeo completo em um navegador, em vez de 16 segundos, aparece 18 segundos. Quando uso o ffprobe no vídeo concluído, ele diz: Duração: 00:00:16,68. O áudio e o vídeo locais também aguardam 2.501 segundos para serem reproduzidos em um navegador.
Qualquer ajuda seria maravilhosa. Não tenho ideia de por que o navegador está renderizando de maneira diferente do que pretendo. Obrigado!
Responder1
Com compensações de carimbo de data/hora, o ffmpeg afetará isso por meio de listas de edição na saída MP4. Parece que os navegadores não os analisam. Então, precisamos de uma solução alternativa.
ffmpeg -i remote.mp4 -i local.mp4 \
-filter_complex \
" [1:v]scale=iw/4:-1:flags=lanczos[loc0]; \
[0:v]transpose=1,setpts='if(eq(N,0),PTS,PTS+2.501/TB)',fps=30[rotate1]; \
[rotate1][loc0]overlay=main_w-overlay_w-10:main_h-overlay_h-10:eof_action=pass[rem0]; \
[0:a]adelay=2501|2501,apad[0a]; \
[0a][1:a]amerge=inputs=2[a]" \
-map "[rem0]" -map "[a]" \
-ac 2 -vcodec libx264 \
-ar 44100 -acodec aac \
completed.mp4
Os setpts
carimbos de data/hora dos turnos de todos os quadros, exceto o primeiro. O fps
filtro então preenche essa lacuna com duplicatas do primeiro quadro. Presumi uma taxa de fluxo de entrada de 30.