FFmpeg-Extrakt-Clip - Stream-Framerate unterscheidet sich von Container-Framerate (x264, aac)

8

Zusammenfassung
H.264-Videos scheinen eine sehr hohe Bildrate zu haben, die einen Skalierungsfaktor für die Dauer des Videos erfordert, das ich extrahieren möchte (900x niedriger).

Körper
Ich versuche, einen Clip aus einem Film zu extrahieren, den ich im MP4-Format habe (erstellt mit Handbrake ). Nachdem ich Mencoder und VLC ausprobiert hatte, entschied ich mich, FFmpeg zu testen, da dies beim Kopieren der Codecs am wenigsten problematisch war. Das heißt, im Vergleich zu Mencoder und VLC war die resultierende Datei in QuickTime noch abspielbar (ich weiß über Perian usw. Bescheid, ich versuche nur zu lernen, wie das alles funktioniert).

Wie auch immer, mein Befehl war wie folgt:

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

Während des Kopierens wird Folgendes angezeigt:

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
…

Anstelle eines Clips mit einer Dauer von 5:59 bekomme ich den gesamten Rest des Films. Um dies zu testen, habe ich den Befehl ffmpeg mit ausgeführt -t 00:00:01. Was ich bekam, war genau ein 15:00 Minuten Clip. Also habe ich ein Black-Box-Engineering durchgeführt und beschlossen, meine -tOption zu skalieren, indem ich berechnet habe, welcher Wert eingegeben werden soll, da 1 Sekunde als 900 s interpretiert wurde. Für meinen gewünschten 359-s-Clip habe ich 0,399 s berechnet und so wurde mein ffmpeg-Befehl:

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

Das funktioniert, aber ich habe keine Ahnung, warum die Dauer um 900 skaliert wird. Bei weiteren Untersuchungen hat jeder ffmpeg-Lauf die Zeile:

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

45000/25 = 1800. Muss irgendwo eine Beziehung sein. Irgendwie verursacht die obszön hohe Bildrate Probleme mit dem Timing. Wie ist diese Bildrate so hoch? Das Beste daran ist, dass der resultierende clip.mp4 genau die gleiche Funktion hat (aufgrund des kopierten Videocodecs) und weitere Clips daraus die gleiche Skalierung für die Daueroption erfordern -t. Deshalb habe ich es jedem zur Verfügung gestellt , der bereit ist, dies zu überprüfen.

Anhang
Die Präambel für ffmpeg auf meinem System (erstellt über den ffmpeg-Port von 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)

BEARBEITEN
Ich bin mir nicht sicher, ob es ein Fehler war oder nicht, aber es scheint jetzt in meiner aktuellen Version von ffmpeg behoben zu sein, zumindest für dieses Video (Version 0.6.1 von MacPorts).

Fideli
quelle
Eine Neukodierung ist keine Lösung, und eine Dekodierung von fünf Minuten Inhalt im Wert von einer Stunde ist unvernünftig und würde das zugrunde liegende Problem wahrscheinlich nicht lösen. Tolle erste Forschung übrigens. Sie gehen wahrscheinlich zu Recht davon aus, dass das von fps ffmpeg erkannte Problem die Wurzel Ihres Problems ist. Es hört sich so an, als hätte eine spätere Version von ffmpeg Ihr Problem behoben, aber ich werde einen Kommentar abgeben. Ich hätte empfohlen, eine -c-Kopie in ein anderes Containerformat zu erstellen. Dies kann eine Vielzahl von Effekten haben, aber dies wäre ein guter nächster Schritt zum Experimentieren gewesen.
dstob

Antworten:

1

Bei ffmpeg ist die Positionierung der Optionen von Bedeutung. In Ihrem Beispiel wird versucht, -ss und -t auf die Eingabe anzuwenden. Wenn Sie es so verwenden, werden stattdessen die Optionen auf die Ausgabe angewendet:

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

Mit dem aktuellen ffmpeg wäre die richtige Syntax:

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

Ich hatte das gleiche Problem und meine Lösung war die folgende:

        $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);

Dies gibt mir 10 Bilder für das gesamte Video, unabhängig von der Länge des Videos

Gus
quelle