我有一个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流到客户的闪存播放器)。
我的问题是,只有一小部分新文件是按h.264编码出来的,但大多数不是(h.264是必须的,否则文件不会在客户端播放)。
我无法将问题追溯到原始视频,因为当我手动使用相同的ffmpeg命令,具有相同的参数和相同的文件时,输出文件就很好了。这似乎是武断的。
我使用ff探头获取有关文件的编解码器的信息。
例如:
大(原始)视频文件之一的探针:
..。 视频: h264,yuv420p,640x352,499 kb/s,25 fps,25 tbr,90k tbn,50 tbc ..。
对应的新剪切文件的f探针:
..。 视频: mpeg4,yuv420p,640x352 PAR 1:1 DAR 20:11,227 kb/s,25 fps,25 tbr,25 tbn,25 tbc ..。
可以看出,不同的是'mpeg4‘和’H 264‘。
任何关于什么会导致新文件以错误的编码出现的洞察力,我们将不胜感激。
谢谢!
编辑:问题解决
在分析了所有的文件之后,我注意到大约三分之二的文件是错误的编解码器。
由于我在裁剪过程中使用了三台机器(三台独立的EC2服务器),我想到其中两台机器上安装了ffmpeg (正如@LordNeckbeard在他的答复中所建议的那样)。
我再次运行该进程,仅在无效文件上运行,仅在第三台计算机上运行--这将产生所需的结果。
发布于 2012-05-01 02:39:39
输出文件上的"mpeg4“最有可能表示ffmpeg正在重新编码,而不是复制视频流。我不能对音频说同样的话,因为你没有提供这些信息。旧的ffmpeg使用"mpeg4“视频编码器作为默认的输出使用MP4容器。检查您的脚本或库,因为当手动调用ffmpeg时,一切都按预期工作。
较少关注的是,-vsync 2 -async 1在使用-vcodec copy -acodec copy时可能会被忽略。
还请注意,您可能希望通过qt-faststart (它包含在ffmpeg源代码中)或MP4Box来运行您的剪切输出。这将将一些数据移动到文件的开头,这样视频就可以在客户端完全下载之前开始播放。
最后,-ss的位置很重要。作为一个输入选项(在-i之前),它的速度要快得多,因为它会立即找到您想要的时间,然后开始解码,但是它不像输出选项那样精确,因为输出选项在您需要的时间之前对所有内容都进行了彻底的解码。如果准确性比速度更重要,那么考虑测试-ss作为输出选项。
https://stackoverflow.com/questions/10383635
复制相似问题