ffmpeg não produzindo vídeo

2

Estou tentando usar o ffmpeg para dividir um quicktime em quicktimes menores. Eu tenho um arquivo csv com pontos de entrada e saída que eu alimento para o Python, que por sua vez cria um comando ffmpeg. No entanto, tenho notado que o vídeo não está aparecendo para alguns dos arquivos gerados, então eu corri o comando sozinho na linha de comando.

>ffmpeg -i in.mov -ss 27.042 -to 29.208 -c:v copy -c:a copy test.mov
ffmpeg version N-66673-gf0d1b3a Copyright (c) 2000-2014 the FFmpeg developers
  built on Oct  6 2014 22:10:42 with gcc 4.9.1 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enab
le-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-lib
modplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinge
r --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis
 --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-zlib
  libavutil      54.  9.100 / 54.  9.100
  libavcodec     56.  3.101 / 56.  3.101
  libavformat    56.  7.104 / 56.  7.104
  libavdevice    56.  1.100 / 56.  1.100
  libavfilter     5.  1.102 /  5.  1.102
  libswscale      3.  1.100 /  3.  1.100
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  1.100 / 53.  1.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'in.mov':
  Metadata:
    major_brand     : qt
    minor_version   : 512
    compatible_brands: qt
    encoder         : Lavf56.7.104
  Duration: 00:20:54.46, start: 0.000000, bitrate: 1734 kb/s
    Stream #0:0(eng): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709), 1280x720, 1617 kb/s, 24 fps, 24 tbr, 12288 tbn, 24576 tbc (default)
    Metadata:
      handler_name    : DataHandler
    Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 113 kb/s (default)
    Metadata:
      handler_name    : DataHandler
File 'test.mov' already exists. Overwrite ? [y/N] y
Output #0, mov, to 'test.mov':
  Metadata:
    major_brand     : qt
    minor_version   : 512
    compatible_brands: qt
    encoder         : Lavf56.7.104
    Stream #0:0(eng): Video: h264 (avc1 / 0x31637661), yuv420p, 1280x720, q=2-31, 1617 kb/s, 24 fps, 12288 tbn, 12288 tbc (default)
    Metadata:
      handler_name    : DataHandler
    Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, 113 kb/s (default)
    Metadata:
      handler_name    : DataHandler
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame=    0 fps=0.0 q=-1.0 Lsize=      31kB time=00:00:02.18 bitrate= 115.3kbits/s
video:0kB audio:30kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 4.003038%

O quicktime se originou do Adobe Premiere, e eu tive que remover um monte de metadados do arquivo de filme, para que o script rodasse mais rápido. Deixar os metadados não faz diferença. Eu tenho outro (relacionado?) Problema onde o áudio é produzido corretamente, mas o vídeo está faltando nos primeiros segundos.

Qualquer ajuda é apreciada.

    
por Christopher Spears 14.10.2014 / 20:48

1 resposta

2

Não é possível fazer uma divisão com precisão de quadro (ou milissegundos) de um fluxo de vídeo / áudio ao copiar os fluxos de bits ( -c:v copy -c:a copy ). Como o vídeo de saída precisa começar com um quadro-chave e ele não será reproduzido corretamente se ffmpeg procurar até encontrar um quadro-chave no fluxo de bits de vídeo e então começar a saída de vídeo.

No seu caso específico, você pode ver que nenhum quadro foi gravado ( frame=0 ) porque aparentemente não há um quadro-chave entre os pontos inicial e final no vídeo original. (Aparentemente, algum áudio foi gravado, mas os fluxos de bits de áudio podem basicamente ser acessados a qualquer momento.)

Sua única opção, se você quiser um corte preciso, é recodificar o vídeo, gerando novos quadros-chave.

ffmpeg -i in.mov -ss 27.042 -to 29.208 -c:v libx264 -c:a aac -strict experimental test.mov

Você precisa mexer nas configurações de qualidade aqui. Veja o x264 e AAC . Leia também Buscando com o FFmpeg para saber o que a posição de -ss implica. Basicamente, para cortes precisos ao recodificar, -ss precisa sempre ser após -i .

Se você não se importa com os tempos de corte exatos, o segment muxer pode Socorro. Aqui, você não precisa necessariamente codificar novamente. Mas note:

… if you want accurate splitting for a video file, you need to make the input key frames correspond to the exact splitting times expected by the segmenter, or the segment muxer will start the new segment with the key frame found next after the specified start time.

    
por 14.10.2014 / 21:09