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 -t
opzione 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' -t
opzione 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).