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 -t
Option 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).
Antworten:
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:
Mit dem aktuellen ffmpeg wäre die richtige Syntax:
quelle
Ich hatte das gleiche Problem und meine Lösung war die folgende:
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
quelle