【问题标题】:PHP/FFMPEG - why does my video conversion result in empty file?PHP/FFMPEG - 为什么我的视频转换会导致空文件?
【发布时间】:2019-04-05 01:37:12
【问题描述】:

我正在尝试将我服务器上的视频从 .webm 转换为 .mp4。

shell_exec('ffmpeg -i file.webm output.mp4');

但是,这会导致 mp4 为空(0 字节 - 或者,有时非常奇怪的是 28 字节。)输入文件存在,并且为 45MB。

This answer 建议显式复制输入编解码器,但结果相同。

shell_exec('ffmpeg -i file.webm -vcodec copy -acodec-copy output.mp4');

我做错了什么?

[ ===== 编辑 ===== ]

在尝试了更多的东西之后,受到 cmets 的启发,我仍然不喜欢转换为 MP4。

看来我正在运行 FFMPEG v.2.8.15。这似乎比当前版本的 4~ 低了很多,但是我大约一周前才安装了这个,所以我不确定为什么会这样,我不知道如何更新它(我在WHM 面板。)

无论如何,我的问题与路径无关,因为如果我将 .mp4 更改为 .webm,相同的命令可以正常工作 - 我得到一个成功转换的 .webm 文件。

但是当我跑步时:

$foo = shell_exec('ffmpeg -i file.webm -vcodec copy -acodec copy output3.mp4 -report');

...我得到this FFMPEG log output。

我也试过了:

shell_exec('ffmpeg -fflags +genpts -i file.webm -r 24 KKK.mp4 -report');

...来自this answer,和

shell_exec('ffmpeg -i file.webm -c:v copy III.mp4');

...来自this article。

两者都会导致相同的问题,即 0 字节的 .mp4 文件。

【问题讨论】:

  • 您需要显示来自ffmpeg 命令的完整日志。两者都行。
  • 在没有 shell_exec 的终端上运行时的输出是什么?
  • -acodec -copy 不是-acodec-copy。最好确保您还拥有最新的 ffmpeg 并使用更新的语法:-c:v copy-c:a copy
  • 对不起,上面的错字:我会再试一次:-acodec copy 而不是-acodec-copy。最好确保您还拥有最新的 ffmpeg 并使用更新的语法:-c:v copy-c:a copy
  • 您可能需要指定文件的完整路径,可能还需要指定可执行文件。

标签: php video ffmpeg


【解决方案1】:

问题

您正在尝试将 VP9 视频和 Opus 音频混合到 MP4 容器中。目前,将 Opus 混合到 MP4 容器中被认为是实验性的,需要-strict experimental(或-strict -2),但你的ffmpeg 太旧了,无法支持。 Download a new version.

解决方案

  • 不要将典型的 WebM 格式(VP9 或 VP8 + Opus 或 Vorbis)混合到 MP4 中。如果您想要一组更常见的 MP4 格式,您可以使用 AAC 音频将其重新编码为 H.264(或 H.265):

    ffmpeg -i input -c:v libx264 -c:a aac -movflags +faststart output.mp4
    
  • 如果您知道要在 MP4 中使用 VP9 + Opus,或者升级您的 ffmpeg 并在命令中添加 -strict experimental(或 -strict -2)输出选项:

    ffmpeg -i input -c copy -strict experimental -movflags +faststart output.mp4
    
  • 或者首先不要重新混入 MP4。 HTML5 视频在 WebM 中支持 VP9 + Opus,因此如果您的目标浏览器支持,请使用原始文件。

【讨论】:

  • 谢谢。我会升级 FFMPEG,但我不知道如何升级,因为我对服务器管理知识知之甚少,而且我仅限于在 WHM 中可以做的事情,运行 Centos 7(我无权访问物理服务器)。其次,我正在转换为 MP4,因为 Mac 上的 Safari(包括 iPhone)doesn't support WEBM 所以我的想法是转换为支持的第二种格式。
  • 此外,您在解决方案下给我的命令仍然导致 0 字节 MP4 :-( FFMPEG 日志说我需要为此进行实验;我通过将 -strict -2 附加到命令(我知道你说我的​​版本太旧而无法使用实验性,但我还是尝试了),我得到了相同的结果 - 0 字节和我需要使用实验性的抱怨。
  • @Utkanos 使用-strict -2/-strict experimental 不是一个通用的包罗万象的方法:当您尝试使用特定的实验性功能时需要它。您遇到两种不同的情况。旧的 FFmpeg AAC 编码器 (-c:a aac) 曾经被认为是实验性的,这就是为什么你的旧 ffmpeg 需要 -strict -2 才能使用它。现代版本不需要该编码器的-strict。您的旧 ffmpeg 不支持 MP4 中的 Opus,但现代版本支持,但为此需要 -strict。
  • 谢谢,@LordNeckbeard。最后,在我的情况下,服务器新手是否可以直接更新我的 ffmpeg 版本?我查看了您链接的下载页面,但我不知道应该单击哪个链接来构建服务器(Centos 7)或者我用它做什么。我很乐意去学习,我只需要一个启动项来为我指明正确的方向。
  • @Utkanos 我稍后会在您的other question 中提供答案。这里的答案将专门解决 MP4 中的 Opus 问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-30
  • 1970-01-01
  • 2015-12-25
  • 2010-12-26
相关资源
最近更新 更多