我有一个包含数百个视频文件的 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 在他的回答中所建议的那样)。
我再次运行该过程,仅在无效文件上,仅在第三台机器上 - 产生了预期的结果。