web-dev-qa-db-fra.com

Pourquoi Quicktime ne peut-il pas lire un fichier vidéo encodé par FFmpeg?

Lorsque j'essaie d'ouvrir un film que je viens de créer avec la commande:

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

Je reçois une erreur 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.

J'ai utilisé la même commande sur un ensemble d'images générées à partir d'un laps de temps iSight, mais dans ce cas, les images ci-dessus proviennent d'un appareil photo numérique. La résolution est beaucoup plus élevée, mais je l'adapte à 640x480 et je ne vois rien dans la sortie qui suggère un problème:

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

contre le film de travail:

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

Et pour la sortie:

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 pour le travailleur:

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)

À part que le film de travail est plus long et que la résolution de la source est basse, la seule différence que je peux voir, c'est qu'il y a un "[SAR 1: 1 DAR 4: 3]" supplémentaire mentionné dans le flux vidéo, mais je n'ai aucune idée de ce est, ou comment essayer de le forcer dans le film qui ne fonctionne pas.

Mise à jour: Je viens de télécharger VLC et le film se passe bien. Je sais donc que ffmpeg n’est pas en faute ici.

28
Michael

Basé sur cette réponse StackOverflow , je voudrais ajouter -pix_fmt yuv420p à votre commande comme ceci; un des commentaires mentionne ajoutant aussi -vcodec libx264 afin qu’il soit inclus ici:

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

Ou vous pouvez utiliser le filtre de format . Cet exemple utilisera le filtre d'échelle au lieu de -s et le filtre de format au lieu de -pix_fmt:

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

Également détaillé dans le Wiki officiel de FFmpeg sous la rubrique "Encodage pour les joueurs muets"; mon accentuation:

Vous devrez peut-être utiliser -pix_fmt yuv420p pour que votre sortie fonctionne dans QuickTime et la plupart des autres lecteurs. Ces lecteurs ne prennent en charge que l'espace couleur planaire YUV avec un sous-échantillonnage de chrominance 4: 2: 0 pour H. 264 vidéo. Sinon, en fonction de votre source, ffmpeg pourrait générer un format de pixel incompatible avec ces lecteurs.

40
JakeGould