Clip di estrazione FFmpeg - la frequenza dei fotogrammi del flusso differisce dalla frequenza dei fotogrammi del contenitore (x264, aac)


8

Riepilogo Il
video H.264 sembra avere un frame rate davvero elevato che richiede un fattore di ridimensionamento applicato alla durata del video che sto cercando di estrarre (900 volte inferiore).

Corpo
Sto cercando di estrarre una clip da un film che ho in formato MP4 (creato usando il freno a mano ). Dopo aver provato mencoder e VLC, ho deciso di provare FFmpeg dato che era il meno problematico quando si trattava di copiare i codec. Cioè, rispetto a mencoder e VLC, il file risultante era ancora riproducibile in QuickTime (so di Perian, ecc., Sto solo cercando di imparare come funziona tutto questo).

Comunque, il mio comando era il seguente:

ffmpeg -ss 01:15:51 -t 00:05:59 -i outofsight.mp4 \ 
-acodec copy -vcodec copy clip.mp4

Durante la copia, viene visualizzato quanto segue:

Seems stream 0 codec frame rate differs from container frame rate: 45000.00 (45000/1) -> 25.00 (25/1)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from outofsight.mp4':
  Duration: 01:57:42.10, start: 0.000000, bitrate: 830 kb/s
    Stream #0.0(und): Video: h264, yuv420p, 720x384, 25 tbr, 22500 tbn, 45k tbc
    Stream #0.1(eng): Audio: aac, 48000 Hz, stereo, s16
Output #0, mp4, to 'out.mp4':
    Stream #0.0(und): Video: libx264, yuv420p, 720x384, q=2-31, 90k tbn, 22500 tbc
    Stream #0.1(eng): Audio: libfaac, 48000 Hz, stereo, s16
Stream mapping:
  Stream #0.0 -> #0.0
  Stream #0.1 -> #0.1
Press [q] to stop encoding
frame= 2591 fps=2349 q=-1.0 size=    8144kB time=101.60 bitrate= 656.7kbits/s
…

Invece di una clip di durata 5:59, ottengo l'intero resto del film. Quindi, per provare questo, ho eseguito il comando ffmpeg con -t 00:00:01. Quello che ho ottenuto è stato esattamente un filmato di 15:00 minuti. Così ho fatto un po 'di ingegneria nella scatola nera e ho deciso di ridimensionare la mia -topzione calcolando quale valore inserire dato che 1 secondo è stato interpretato come 900 s. Per la clip da 359 s desiderata, ho calcolato 0,399 se il mio comando ffmpeg è diventato:

ffmpeg -ss 01:15.51 -t 00:00:00.399 -i outofsight.mp4 \ 
-acodec copy -vcodec copy clip.mp4

Funziona, ma non ho idea del perché la durata sia ridimensionata di 900. Analizzando ulteriormente, ogni esecuzione di ffmpeg ha la linea:

Seems stream 0 codec frame rate differs from container frame rate: 45000.00 (45000/1) -> 25.00 (25/1)

45000/25 = 1800. Deve essere una relazione da qualche parte. In qualche modo, il frame rate oscenamente alto sta causando problemi con i tempi. In che modo il frame rate è così alto? La parte migliore di questo è che il clip.mp4 risultante ha la stessa identica funzione (a causa del codec video copiato), e prendere ulteriori clip da questo richiede lo stesso ridimensionamento per l' -topzione di durata. Pertanto, l' ho reso disponibile per chiunque sia disposto a dare un'occhiata.

Appendice
Il preambolo di ffmpeg sul mio sistema (creato usando la porta ffmpeg di MacPorts):

FFmpeg version 0.5, Copyright (c) 2000-2009 Fabrice Bellard, et al.
  configuration: --prefix=/opt/local --disable-vhook --enable-gpl --enable-postproc --enable-swscale --enable-avfilter --enable-avfilter-lavf --enable-libmp3lame --enable-libvorbis --enable-libtheora --enable-libdirac --enable-libschroedinger --enable-libfaac --enable-libfaad --enable-libxvid --enable-libx264 --mandir=/opt/local/share/man --enable-shared --enable-pthreads --cc=/usr/bin/gcc-4.2 --arch=x86_64
  libavutil     49.15. 0 / 49.15. 0
  libavcodec    52.20. 0 / 52.20. 0
  libavformat   52.31. 0 / 52.31. 0
  libavdevice   52. 1. 0 / 52. 1. 0
  libavfilter    1. 4. 0 /  1. 4. 0
  libswscale     1. 7. 1 /  1. 7. 1
  libpostproc   51. 2. 0 / 51. 2. 0
  built on Jan  4 2010 21:51:51, gcc: 4.2.1 (Apple Inc. build 5646) (dot 1)

EDIT
Non sono sicuro se fosse un bug o no, ma sembra essere stato risolto ora nella mia attuale versione di ffmpeg, almeno per questo video (versione 0.6.1 da MacPorts).


La ricodifica non è una soluzione e fare decine di ore per cinque minuti di contenuto è irragionevole e probabilmente non risolve il problema di fondo. Grande ricerca iniziale tra. Probabilmente hai ragione nel dare per scontato che ffmpeg fps fosse la radice del tuo problema. Sembra che una versione successiva di ffmpeg abbia risolto il tuo problema, ma farò un commento. Avrei raccomandato di fare una copia -c in un formato contenitore diverso. Questo può avere una varietà di effetti ma questo sarebbe stato un buon passo successivo da sperimentare.
dstob,

Risposte:


1

Con ffmpeg, il posizionamento delle opzioni è importante. Con il tuo esempio, sta provando ad applicare -ss e -t all'input. Usalo in questo modo applicherà invece le opzioni all'output:

ffmpeg -i outofsight.mp4 -ss 01:15:51 -t 00:05:59 -acodec copy -vcodec copy clip.mp4

Con ffmpeg corrente, la sintassi corretta sarebbe:

ffmpeg -i outofsight.mp4 -ss 01:15:51 -t 00:05:59 -c copy clip.mp4

1

Stavo avendo lo stesso problema e la mia soluzione era la seguente:

        $ffmpegout = array();           
        //10 is the number of images you want from video
        $fracduration = ($info['duration']/10);             

exec ('ffmpeg -y -i /testmedia/'.$info['filename']. '-vf fps = fps = 1 /'.$ fracduration.' -f image2 /testmedia/images/output%03d.jpg 2 > & 1 ', $ ffmpegout); // print_r ($ ffmpegout);

Questo mi dà 10 immagini per tutto il video, indipendentemente dalla lunghezza del video

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.