0

我有一个包含数百个视频文件的 s3 存储桶。
这些文件是通过使用 ffmpeg 剪切较大视频文件的一部分而创建的。
我为此编写了一个脚本,它从另一个存储桶下载原始视频文件,运行 ffmpeg 剪切文件,并将新文件上传到它的存储桶。为了从/向 s3 下载和上传,我使用了这个 php 库
我使用的 ffmpeg 语法:

ffmpeg -y -vsync 2 -async 1 -ss [time-in] -t [duration] -i [large-input-video.mp4] -vcodec copy -acodec copy [short-output-video.mp4]

这应该只是在指定时间之间剪切原始文件,而不对 a/v 编解码器进行任何更改。
所有原始视频文件都以 h.264 编码,这也是新文件所需的编码(将通过 CDN 流式传输到客户端的 Flash 播放器)。

我的问题是只有一小部分新文件以 h.264 编码输出,但大多数不是(h.264 是必须的,否则文件不会在客户端播放)。
我无法将问题追溯到原始视频,因为当我手动使用相同的 ffmpeg 命令、相同的参数和相同的文件时,输出文件就很好了。似乎随意。

我使用 ffprobe 来获取有关文件编解码器的信息。
例如:
大型(原始)视频文件之一的 ffprobe:

...
流 #0.0(und):视频:h264、yuv420p、640x352、499 kb/s、25 fps、25 tbr、90k tbn、50 tbc
...

对应新剪切文件的ffprobe:

...
流 #0.0(und):视频:mpeg4、yuv420p、640x352 [PAR 1:1 DAR 20:11]、227 kb/s、25 fps、25 tbr、25 tbn、25 tbc
...

可以看出,区别在于“mpeg4”与“h264”。

任何关于什么可能导致新文件以错误编码出现的见解将不胜感激。

谢谢!

编辑:问题已解决
在分析了所有文件后,我注意到其中大约三分之二的文件使用了错误的编解码器。
由于我在切割过程中使用了三台机器(三台独立的 EC2 服务器),我突然想到其中两台 ffmpeg 安装错误(正如@LordNeckbeard 在他的回答中所建议的那样)。
我再次运行该过程,仅在无效文件上,仅在第三台机器上 - 产生了预期的结果。

4

1 回答 1

0

输出文件上的“mpeg4”很可能表明 ffmpeg 正在重新编码而不是复制视频流。由于您没有提供该信息,因此我不能对音频说同样的话。较旧的 ffmpeg 使用“mpeg4”视频编码器作为使用 MP4 容器的输出的默认值。检查您的脚本或库,因为在手动调用 ffmpeg 时一切都按预期工作。

不太关心的是-vsync 2 -async 1在使用时可能会被忽略-vcodec copy -acodec copy

另请注意,您可能希望通过qt-faststart(它包含在 ffmpeg 源代码中)或替代地运行您的剪切输出MP4Box。这会将一些数据移动到文件的开头,以便视频可以在客户端完全下载之前开始播放。

最后是物品的摆放-ss。作为输入选项(之前-i),它要快得多,因为它会立即寻找您想要的时间然后开始解码,但它不如-ss输出选项准确,后者在您想要的时间之前完全解码所有内容。如果准确性比速度更重要,那么考虑将测试-ss作为输出选项。

于 2012-05-01T02:39:39.043 回答