为什么 Quicktime 不能播放 FFmpeg 编码的电影文件?

Mic*_*ael 46 video ffmpeg quicktime

当我尝试打开刚使用以下命令创建的电影时:

ffmpeg -pattern_type glob -i '*.JPG' -s 640x480 movie.mp4
Run Code Online (Sandbox Code Playgroud)

我从 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.
Run Code Online (Sandbox Code Playgroud)

我对 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
Run Code Online (Sandbox Code Playgroud)

对比工作电影:

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
Run Code Online (Sandbox Code Playgroud)

对于输出:

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)
Run Code Online (Sandbox Code Playgroud)

与工作人员对比:

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)
Run Code Online (Sandbox Code Playgroud)

除了工作电影更长和源分辨率更低之外,我能看到的唯一区别是视频流中提到了一个额外的“[SAR 1:1 DAR 4:3]”,但我不知道这是什么是,或者如何尝试在非工作电影中强制它。

更新:我刚刚下载了 VLC,它可以正常播放电影。所以我知道 ffmpeg 在这里没有错。

Gia*_*968 74

基于此StackOverflow 答案,我会-pix_fmt yuv420p像这样添加到您的命令中;其中一条评论也提到了添加-vcodec libx264,因此将其包含在此处:

ffmpeg -pattern_type glob -i '*.JPG' -vcodec libx264 -s 640x480 \
-pix_fmt yuv420p movie.mp4
Run Code Online (Sandbox Code Playgroud)

或者您可以使用格式过滤器。此示例将使用比例过滤器而不是-s,并使用格式过滤器而不是-pix_fmt

ffmpeg -pattern_type glob -i '*.JPG' -vcodec libx264 \
-vf scale=640:-2,format=yuv420p movie.mp4
Run Code Online (Sandbox Code Playgroud)

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

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

  • 事实上,ffmpeg 选择了 yuv422p 的默认编码,这让 Quicktime 感到不安。添加`-pix_fmt yuv420p` 为我解决了! (9认同)