Ffmpeg Sync ao extrair partes do vídeo

2

Esta questão pode ser vista como uma extensão de esta questão . Eu estou usando o ffmpeg 2.0.1.

Os seguintes comandos são úteis quando você deseja extrair partes de um grande arquivo de vídeo dado aos geradores de tempo.

ffmpeg -i 00402.MTS -s 1280x720 -ss 0:00:05.38608 -vcodec libxvid -qscale:v 2 -acodec ac3 -ar 48000 -ab 256k -t 0:00:06.61391 m001.avi

Meu problema é que, no arquivo de saída, o valor inicial é 0 e há ~ 50 ms de deslocamento entre áudio e vídeo. Qual argumento devo usar para levar em conta este 'valor inicial' ao extrair partes severas do grande arquivo de vídeo ('.mts')? O que esse 'valor inicial' significa?

saída ffprobe do arquivo de vídeo MTS grande

ffprobe m001.MTS 
ffprobe version 2.0.1 Copyright (c) 2007-2013 the FFmpeg developers built on Sep 24 2013 05:31:18 with gcc 4.8 (Debian 4.8.1-10)
configuration: --extra-cflags=-I../static/include --extra-ldflags='-L../static/lib -static' --enable-gpl --enable-version3 --enable-static --disable-shared --disable-debug --enable-runtime-cpudetect --enable-libmp3lame --enable-libx264 --enable-libspeex --enable-libvorbis --enable-libvpx --enable-libfreetype --enable-libxvid --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-gray --enable-libopenjpeg --disable-ffserver
libavutil      52. 38.100 / 52. 38.100
libavcodec     55. 18.102 / 55. 18.102
libavformat    55. 12.100 / 55. 12.100
libavdevice    55.  3.100 / 55.  3.100
libavfilter     3. 79.101 /  3. 79.101
libswscale      2.  3.100 /  2.  3.100
libswresample   0. 17.102 /  0. 17.102
libpostproc    52.  3.100 / 52.  3.100
Input #0, mpegts, from 'm001.MTS':
Duration: 00:01:18.25, start: 0.455556, bitrate: 12217 kb/s
Program 1 
Stream #0:0[0x1011]: Video: h264 (High) (HDMV / 0x564D4448), yuv420p, 1440x1080 [SAR 4:3       DAR 16:9], 25 fps, 50 tbr, 90k tbn, 50 tbc
Stream #0:1[0x1100]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, stereo, fltp, 256 kb/s

ffprobe saída do exemplo de extrato

Input #0, avi, from 'm001.avi':
Metadata:
encoder         : Lavf55.12.100
Duration: 00:00:06.64, start: 0.000000, bitrate: 4950 kb/s
Stream #0:0: Video: mpeg4 (Simple Profile) (xvid / 0x64697678), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 25 tbr, 25 tbn, 25 tbc
Stream #0:1: Audio: ac3 ([0] [0][0] / 0x2000), 48000 Hz, mono, fltp, 256 kb/s
    
por Eric 16.01.2014 / 17:42

1 resposta

1

Eu já vi esse problema antes, e a única solução é usar o offset e o mapa.

ffmpeg -i 00402.MTS -itsoffset 0.455556 -i 00402.MTS -map 1:0 -map 0:1 -s 1280x720 -ss 0:00:05.38608 -vcodec libxvid -qscale:v 2 -acodec ac3 -ar 48000 -ab 256k -t 0:00:06.61391 m001.avi

Esta página tem uma boa explicação do porquê e como funciona.

link
(Não está mais disponível no link original; agora em web-beta.archive.org)

EDIT Existem duas ferramentas principais aqui para estar ciente de: 1) seu deslocamento 2) mapear

itsoffset existe para compensar um fluxo que está fora de sincronia, enquanto o mapa informa ao ffmpeg para usar determinados fluxos de entradas específicas e aplicá-los à saída.

Neste exemplo, estamos usando a mesma entrada duas vezes, mapeando os fluxos dessa forma: Usamos o fluxo de vídeo da primeira entrada (que parece estar começando às 00: 00: 00.00) Usamos a segunda entrada como o fluxo de áudio, mas compensamos o tempo de entrada 0.455556 segundos.

Do site mencionado acima:

Here "-map 1:0" tells ffmpeg to use the second input file (1) and take its first stream (0) as the video source. Since that's the input that follows the "-itsoffset" switch, that's the stream that will be delayed. Then "-map 0.1" tells it to use the second stream from the first input as the audio. Since there's no offset applied to the first input file, it will be processed normally.

    
por 22.01.2014 / 20:34