Почему Quicktime не может воспроизвести файл фильма, закодированный FFmpeg? [Дубликат]

34

Когда я пытаюсь открыть фильм, который я только что создал с помощью команды:

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

Я получаю ошибку от 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.

Я использовал ту же команду для набора изображений, сгенерированных из промежутка времени iSight, но в этом случае вышеупомянутые изображения с цифровой камеры. Разрешение намного выше, но я масштабирую его до 640x480, и я не вижу ничего в выводе, который предлагает проблему:

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

против рабочего фильма:

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

И для вывода:

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)

по сравнению с рабочим:

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)

Помимо более длинного рабочего фильма и более низкого разрешения источника, я вижу только одно отличие: в видеопотоке упоминается дополнительный «[SAR 1: 1 DAR 4: 3]», но я понятия не имею, что это есть, или как попытаться заставить его в нерабочем фильме.

Обновление: я только что скачал VLC, и он воспроизводит фильм нормально. Так что я знаю, что ffmpeg здесь не виноват.

Майкл
источник
2
На будущее, когда вы спрашиваете о ffmpeg, пожалуйста, всегда включайте полный, неразрезанный вывод командной строки. Он должен был сказать вам кое-что о несовместимости формата пикселей с некоторыми плеерами, если я не ошибаюсь (и если у вас есть последняя версия).
Slhck
ffprobe video.mp4может использоваться для проверки используемого формата пикселей.
л --marc л

Ответы:

47

Основываясь на этом ответе StackOverflow, я бы добавил -pix_fmt yuv420pк вашей команде вот так; в одном из комментариев упоминается также добавление, -vcodec libx264поэтому оно включено здесь:

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

Или вы можете использовать фильтр формата . В этом примере вместо фильтра используется фильтр масштаба-s , а вместо -pix_fmt: фильтр формата :

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

Также подробно изложено в официальной вики FFmpeg под заголовком «Кодирование для немых игроков»; Акцент мой:

Возможно, вам придется использовать его -pix_fmt yuv420pдля работы в QuickTime и большинстве других игроков. Эти проигрыватели поддерживают только плоское цветовое пространство YUV с подвыборкой цветности 4: 2: 0 для видео H.264. В противном случае, в зависимости от вашего источника, ffmpeg может выводить данные в формате пикселей, который может быть несовместим с этими проигрывателями.

JakeGould
источник
6
Действительно, ffmpeg выбирал кодировку по умолчанию yuv422p, которая расстроила Quicktime. Добавление -pix_fmt yuv420pрешило это для меня!
Ник Desaulniers
у меня сработало только первое решение
пиар