为什么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 2014年

ffprobe video.mp4可用于检查使用哪种像素格式。
l --marc l

Answers:


47

根据这个StackOverflow答案,我将这样添加-pix_fmt yuv420p到您的命令中;评论之一提到也要添加-vcodec libx264,因此包含在此处:

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

或者,您可以使用格式过滤器。本示例将使用scale过滤器代替-s,使用format过滤器代替-pix_fmt

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

在官方的FFmpeg Wiki标题“为愚蠢的玩家编码”下也进行了详细说明;我的重点:

您可能需要使用-pix_fmt yuv420p输出才能在QuickTime和大多数其他播放器中使用。这些播放器仅支持具有H.264视频4:2:0色度子采样的YUV平面色彩空间。否则,根据您的来源,ffmpeg可能会输出为可能与这些播放器不兼容的像素格式。


6
确实,ffmpeg选择的是yuv422p的默认编码,这会使Quicktime感到不适。添加-pix_fmt yuv420p为我解决了!
Nick Desaulniers 2015年

只有第一个解决方案为我
PR
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.