¿Por qué Quicktime no puede reproducir un archivo de película codificado por FFmpeg? [duplicar]

34

Cuando intento abrir una película que acabo de crear con el comando:

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

Recibo un error de 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.

Utilicé el mismo comando en un conjunto de imágenes generadas a partir de un lapso de tiempo iSight, pero en este caso las imágenes anteriores son de una cámara digital. La resolución es mucho más alta, pero la estoy ampliando a 640x480 y no veo nada en la salida que sugiera un problema:

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

vs. la película de trabajo:

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

Y para la salida:

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. para el que trabaja:

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)

Además de que la película en funcionamiento es más larga y tiene una resolución de fuente más baja, la única diferencia que puedo ver es que hay un "[SAR 1: 1 DAR 4: 3]" adicional mencionado en la transmisión de video, pero no tengo idea de qué es esto es, o cómo tratar de forzarlo en la película que no funciona.

Actualización: Acabo de descargar VLC y reproduce bien la película. Entonces sé que ffmpeg no tiene la culpa aquí.

Miguel
fuente
2
Para el futuro, cuando pregunte sobre ffmpeg, incluya siempre la salida de línea de comando completa y sin cortes. Debería haberle dicho algo sobre el formato de píxeles que no es compatible con algunos reproductores, si no me equivoco (y si tiene una versión reciente).
slhck
ffprobe video.mp4se puede usar para verificar qué formato de píxel se usa.
l --marc l

Respuestas:

47

Según esta respuesta de StackOverflow , agregaría -pix_fmt yuv420pa su comando de esta manera; uno de los comentarios menciona agregar -vcodec libx264también, así que está incluido aquí:

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

O podrías usar el filtro de formato . Este ejemplo usará el filtro de escala en lugar de -s, y el filtro de formato en lugar de -pix_fmt:

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

También elaborado en el Wiki oficial de FFmpeg bajo el título "Codificación para jugadores tontos"; énfasis mío:

Es posible que deba usar -pix_fmt yuv420ppara que su salida funcione en QuickTime y en la mayoría de los otros reproductores. Estos reproductores solo admiten el espacio de color plano YUV con submuestreo de croma 4: 2: 0 para video H.264. De lo contrario, dependiendo de su fuente, ffmpeg puede salir a un formato de píxel que puede ser incompatible con estos reproductores.

JakeGould
fuente
66
De hecho, ffmpeg estaba eligiendo la codificación predeterminada de yuv422p que molestaba a Quicktime. Agregar lo -pix_fmt yuv420presolvió para mí!
Nick Desaulniers
solo la primera solución funcionó para mí
PR