Usando o ffmpeg para extrair o segmento no meio do vídeo longo

3

Eu preciso extrair um intervalo de 30 segundos do meio de um vídeo, enquanto o converto em webm. ffmpeg parecia o forro perfeito:

ffmpeg -i long.mkv -vcodec libvpx -b:v 1M -ss 02:00:00 -t 00:00:30 -threads 4 out.webm

Para minha surpresa, quase imediatamente engoliu toda a memória disponível e as coisas começaram a ser trocadas, então eu a matei. Depois de não encontrar nenhum erro óbvio - e ter em mente que raramente uso ffmpeg - eu tentei avconv. Ele não relatou fazer nada e o uso da memória estava (lentamente) crescendo na mesma direção.

Após alguns testes com:

 -ss 02:00:00 -t 00:00:01
 -ss 00:00:01 -t 00:00:01
 -ss 00:01:00 -t 00:00:01

Parece que o ffmpeg está carregando o filme inteiro até -ss na memória, ou algo parecido. De qualquer forma, não parece adequado para este tipo de operação. Minha pergunta é: estou fazendo algo errado e o ffmpeg pode, de fato, realizar essa operação com um uso razoável de recursos? Caso o ffmpeg não seja adequado para isso ou esteja apenas sendo tolo em como fazê-lo, existem alternativas que não envolvam arrastar e soltar retângulos em uma linha do tempo e usar pequenas tesouras e barras de rolagem?

debian@pc:~/ ffmpeg -version
ffmpeg version 0.8.16-6:0.8.16-1, Copyright (c) 2000-2014 the Libav developers
  built on Sep 16 2014 23:10:48 with gcc 4.7.2
The ffmpeg program is only provided for script compatibility and will be removed
in a future release. It has been deprecated in the Libav project to allow for
incompatible command line syntax improvements in its replacement called avconv
(see Changelog for details). Please use avconv instead.
ffmpeg 0.8.16-6:0.8.16-1
libavutil    51. 22. 2 / 51. 22. 2
libavcodec   53. 35. 0 / 53. 35. 0
libavformat  53. 21. 1 / 53. 21. 1
libavdevice  53.  2. 0 / 53.  2. 0
libavfilter   2. 15. 0 /  2. 15. 0
libswscale    2.  1. 0 /  2.  1. 0
libpostproc  52.  0. 0 / 52.  0.100

Eu também tentei com a versão mais recente do site do ffmpeg e os resultados foram os mesmos do avconv - não engole minha memória de uma só vez, mas não parece fazer nada:

frame=    0 fps=0.0 q=-1.0 size=       4kB time=00:00:00.00 bitrate=N/A    

E aumenta constantemente o uso da memória. Por um segundo, parece-me que deveria ser instantâneo e mal usar qualquer memória.

    
por Alex 15.08.2015 / 07:17

1 resposta

6

Usar -ss após -i em ffmpeg leva muito tempo!

Isso porque você está procurando um ponto na saída , não a entrada. Pelo manual ffmpeg em busca :

Input seeking

The -ss parameter needs to be specified somewhere before -i:

...The input will be parsed using keyframes, which is very fast...

em comparação com:

Output Seeking

The -ss parameter needs to be specified after -i:

...This will be done very slowly, frame by frame...

na sua pergunta, você especifica o último. Será muito mais rápido se você usar busca de entrada :

ffmpeg -ss 02:00:00 -i long.mkv -vcodec libvpx -b:v 1M -t 00:00:30 -threads 4 out.webm

Mas se você realmente precisa de uma busca com precisão de quadros, você pode combinar os dois:

ffmpeg -ss 01:59:30 -i long.mkv -ss 30 -vcodec libvpx -b:v 1M -t 00:00:30 -threads 4 out.webm

(procure rapidamente 01:59:30, depois procure quadro a quadro às 02:00:00, que é +30)

Você já deve estar ciente, mas se não, isso deve esclarecer que ffmpeg é exigente quanto ao posicionamento de opções e opções!

    
por 16.08.2015 / 13:17

Tags