Dlaczego Quicktime nie może odtworzyć pliku filmowego zakodowanego przez FFmpeg? [duplikować]

34

Kiedy próbuję otworzyć film, który właśnie utworzyłem za pomocą polecenia:

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

Otrzymuję błąd z 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.

Użyłem tego samego polecenia na zestawie obrazów wygenerowanych z upływu czasu iSight, ale w tym przypadku powyższe obrazy pochodzą z aparatu cyfrowego. Rozdzielczość jest znacznie wyższa, ale skaluję ją do 640x480 i nie widzę nic na wyjściu, co sugerowałoby problem:

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

a działający film:

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

I dla wyniku:

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)

vs. dla pracującego:

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)

Poza dłuższym działającym filmem i niższą rozdzielczością źródłową, jedyną różnicą, którą widzę, jest to, że w strumieniu wideo pojawia się dodatkowy „[SAR 1: 1 DAR 4: 3]”, ale nie mam pojęcia, co to jest lub jak spróbować wymusić to w niedziałającym filmie.

Aktualizacja: Właśnie pobrałem VLC i dobrze odtwarza film. Wiem, że ffmpeg nie jest tutaj winna.

Michał
źródło
2
W przyszłości, pytając o ffmpeg, zawsze dołączaj pełne, niecięte wyjście wiersza poleceń. Powinien powiedzieć ci coś o niezgodności formatu pikseli z niektórymi odtwarzaczami, jeśli się nie mylę (i jeśli masz najnowszą wersję).
slhck
ffprobe video.mp4można użyć do sprawdzenia, który format pikseli jest używany.
l --marc l

Odpowiedzi:

47

Na podstawie tej odpowiedzi StackOverflow dodam -pix_fmt yuv420pdo twojego polecenia w ten sposób; jeden z komentarzy wspomina-vcodec libx264 również o dodawaniu, więc jest on zawarty tutaj:

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

Lub możesz użyć filtra formatu . W tym przykładzie użyty zostanie filtr skalowania zamiast -s, a filtr formatu zamiast -pix_fmt:

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

Opracowano również na oficjalnej Wiki FFmpeg pod nagłówkiem „Kodowanie dla głupich graczy”; mój nacisk:

Być może będziesz musiał użyć -pix_fmt yuv420pswoich danych wyjściowych do pracy w QuickTime i większości innych odtwarzaczy. Te odtwarzacze obsługują tylko płaską przestrzeń kolorów YUV z podpróbkowaniem barwy 4: 2: 0 dla wideo H.264. W przeciwnym razie, w zależności od źródła, ffmpeg może wyświetlać dane w formacie pikselowym, który może być niezgodny z tymi odtwarzaczami.

JakeGould
źródło
6
Rzeczywiście, ffmpeg wybrał domyślne kodowanie yuv422p, co zdenerwowało Quicktime. Dodanie -pix_fmt yuv420prozwiązało to dla mnie!
Nick Desaulniers,
działało tylko pierwsze rozwiązanie
PR