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

34

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 la redimensionne à 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

par rapport au 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 celui qui travaille:

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)

Mis à part que le film de travail est plus long et une résolution source inférieure, la seule différence que je peux voir 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 que cela est, ou comment essayer de le forcer dans le film non fonctionnel.

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

Michael
la source
2
Pour l'avenir, lorsque vous posez des questions sur ffmpeg, veuillez toujours inclure la sortie de ligne de commande complète et non coupée. Il aurait dû vous dire quelque chose sur le format de pixel non compatible avec certains lecteurs, si je ne me trompe pas (et si vous avez une version récente).
slhck
ffprobe video.mp4peut être utilisé pour vérifier le format de pixel utilisé.
l --marc l

Réponses:

47

Sur la base de cette réponse StackOverflow , j'ajouterais -pix_fmt yuv420pà votre commande comme ceci; l'un des commentaires mentionne l' ajout -vcodec libx264également, il est donc 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 utilise le filtre d'échelle à la place de -set le filtre de format à la place de -pix_fmt:

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

Également développé dans le Wiki officiel de FFmpeg sous la rubrique «Encodage pour les joueurs muets»; accent sur le mien:

Vous devrez peut-être utiliser -pix_fmt yuv420ppour que votre sortie fonctionne dans QuickTime et la plupart des autres lecteurs. Ces lecteurs ne prennent en charge que l'espace colorimétrique plan YUV avec un sous-échantillonnage de chrominance 4: 2: 0 pour la vidéo H.264. Sinon, selon votre source, ffmpeg peut produire un format de pixel qui peut être incompatible avec ces lecteurs.

JakeGould
la source
6
En effet, ffmpeg choisissait l'encodage par défaut de yuv422p qui bouleversait Quicktime. L'ajout l'a -pix_fmt yuv420présolu pour moi!
Nick Desaulniers
seule la première solution a fonctionné pour moi
PR