Sobreposição de vídeo FFMpeg com áudio e vídeo atrasados em vídeo em segundo plano

2

Estou tentando criar a aparência de uma imagem em um vídeo de imagem usando vários arquivos de vídeo.

Eu criei um arquivo .mp4 usando o FFMpeg. O vídeo é exibido corretamente no aplicativo "Filmes e TV" do Windows. Ele não é exibido corretamente no Chrome, Firefox, VLC Media Player ou qualquer outro aplicativo que eu tenha. Eu pretendo exibir o vídeo em um navegador, então o suporte a vários navegadores é importante para mim.

O vídeo foi criado com duas partes de uma vídeo chamada e fazendo o seguinte com o FFMpeg:

  1. Coloque o vídeo remoto (remote.mp4) em segundo plano.
  2. O vídeo remoto deve mostrar a primeira imagem do vídeo e aparecer pausado até cerca de 2.501 segundos. Eu fiz isso usando o itoffset.
  3. O áudio remoto também deve começar a tocar após 2.501 segundos. Definir o itoffset não parece conseguir isso, então eu adicionei uma opção "adelay" ao filter_complex.
  4. Vídeo local colocado (local.mp4) como uma sobreposição no canto inferior direito.
  5. 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).
  6. Rodou a imagem de fundo em 90 graus (foi gravada de lado).
  7. Adicione um atraso de áudio ao vídeo remoto para começar a reproduzir o fluxo de áudio 2,501 segundos após o início.
  8. Mesclar as entradas de áudio.
  9. Usado codec aac (porque parece popular, estou totalmente disposto a mudar se isso for útil.)
  10. Use o codec de vídeo h264, mais uma vez 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 do vídeo:

  1. concluído.mp4 (16 segundos, 480 x 640)
  2. local.mp4 (16 segundos, 640x480)
  3. remoto.mp4 (14 segundos, 640x480, virado para os lados)

Quando olho para o vídeo concluído em um navegador, em vez de ter 16 segundos, ele diz 18 segundos. Quando eu uso o ffprobe no vídeo completo, 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. Eu não tenho idéia porque o navegador está processando de forma diferente do que pretendo. Obrigado!

    
por Daryl 08.06.2018 / 01:12

1 resposta

2

Com deslocamentos de timestamp, o ffmpeg efetuará 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

O setpts desloca os timestamps de todos os quadros, exceto o primeiro. O filtro fps preenche essa lacuna com duplicatas do primeiro quadro. Eu assumi uma taxa de fluxo de entrada de 30.

    
por 08.06.2018 / 06:10