Warum kann Quicktime eine mit FFmpeg codierte Filmdatei nicht abspielen? [Duplikat]

34

Wenn ich versuche, einen Film zu öffnen, habe ich gerade mit dem folgenden Befehl erstellt:

ffmpeg -pattern_type glob -i '*.JPG' -s 640x480 movie.mp4

Ich erhalte eine Fehlermeldung von QuickTime:

The document “movie.mp4” could not be opened.
The file may be damaged or may not be a movie file that is compatible with QuickTime Player.

Ich habe den gleichen Befehl für eine Reihe von Bildern verwendet, die mit einem iSight-Zeitraffer erstellt wurden. In diesem Fall stammen die oben genannten Bilder jedoch von einer Digitalkamera. Die Auflösung ist viel höher, aber ich skaliere sie auf 640x480 und sehe in der Ausgabe nichts, was auf ein Problem hindeutet:

Input #0, image2, from '*.JPG':
  Duration: 00:00:04.76, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: mjpeg, yuvj422p(pc), 4928x3264, 25 tbr, 25 tbn, 25 tbc

gegen den Arbeitsfilm:

Input #0, image2, from '*.JPG':
  Duration: 00:01:23.72, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: mjpeg, yuvj420p(pc), 640x480 [SAR 1:1 DAR 4:3], 25 fps, 25 tbr, 25 tbn, 25 tbc

Und für die Ausgabe:

Output #0, mp4, to 'movie.mp4':
  Metadata:
    encoder         : Lavf55.19.104
    Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuvj422p, 640x480, q=-1--1, 12800 tbn, 25 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (mjpeg -> libx264)

für den arbeitenden:

Output #0, mp4, to 'movie.mp4':
  Metadata:
    encoder         : Lavf55.19.104
    Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuvj420p, 640x480 [SAR 1:1 DAR 4:3], q=-1--1, 12800 tbn, 25 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (mjpeg -> libx264)

Abgesehen davon, dass der Arbeitsfilm länger ist und eine niedrigere Quellauflösung hat, kann ich nur feststellen, dass im Videostream ein zusätzliches "[SAR 1: 1 DAR 4: 3]" erwähnt wird, aber ich habe keine Ahnung, was dies ist ist, oder wie man versucht, es im nicht funktionierenden Film zu erzwingen.

Update: Ich habe gerade VLC heruntergeladen und es spielt den Film gut ab. Ich weiß also, dass ffmpeg hier keine Schuld hat.

Michael
quelle
2
Wenn Sie in Zukunft nach ffmpeg fragen, geben Sie immer die vollständige, ungeschnittene Befehlszeilenausgabe an. Wenn ich mich nicht irre (und wenn Sie eine neuere Version haben), hätte es Ihnen etwas darüber sagen sollen, dass das Pixelformat mit einigen Playern nicht kompatibel ist.
Slhck
ffprobe video.mp4kann verwendet werden, um zu überprüfen, welches Pixelformat verwendet wird.
l

Antworten:

47

Basierend auf dieser StackOverflow-Antwort würde ich -pix_fmt yuv420pIhren Befehl folgendermaßen ergänzen . In einem der Kommentare wird auch das Hinzufügen erwähnt , -vcodec libx264so dass es hier enthalten ist:

ffmpeg -pattern_type glob -i '*.JPG' -vcodec libx264 -s 640x480 \
-pix_fmt yuv420p movie.mp4

Oder Sie könnten den Formatfilter verwenden . In diesem Beispiel wird der Skalierungsfilter anstelle von -sund der Formatfilter anstelle von verwendet -pix_fmt:

ffmpeg -pattern_type glob -i '*.JPG' -vcodec libx264 \
-vf scale=640:-2,format=yuv420p movie.mp4

Wird auch im offiziellen FFmpeg-Wiki unter der Überschrift „Kodierung für blöde Spieler“ erläutert . Hervorhebung meiner:

Möglicherweise müssen Sie -pix_fmt yuv420pfür Ihre Ausgabe QuickTime und die meisten anderen Player verwenden. Diese Player unterstützen nur den planaren YUV-Farbraum mit 4: 2: 0-Chroma-Subsampling für H.264-Video. Andernfalls wird ffmpeg je nach Quelle möglicherweise in einem Pixelformat ausgegeben, das mit diesen Playern möglicherweise nicht kompatibel ist.

JakeGould
quelle
6
In der Tat wählte ffmpeg die Standardkodierung von yuv422p, was Quicktime verärgerte. Das Hinzufügen -pix_fmt yuv420plöste es für mich!
Nick Desaulniers
Nur die erste Lösung funktionierte für mich
PR