ffmpeg h.264无效切割

时间:2012-04-30 12:22:25

标签: ffmpeg cdn h.264 video-encoding mpeg-4

我有一个包含数百个视频文件的s3存储桶 这些文件是通过使用ffmpeg剪切部分较大的视频文件而创建的 我为此编写了一个脚本,从另一个桶中下载原始视频文件,运行ffmpeg来剪切文件,并将新文件上传到它的桶中。 对于从/到s3下载和上传,我使用了this php library 我使用的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命令,使用相同的参数和相同的文件时,输出文件就可以了。这似乎是随意的。

我使用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服务器),我突然意识到其中两台机器安装错误(如@LordNeckbeard在答案中所说)。 我再次运行该过程,仅在无效文件上,仅在第三台机器上运行 - 这产生了所需的结果。

1 个答案:

答案 0 :(得分:0)

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

使用-vsync 2 -async 1时可能会忽略-vcodec copy -acodec copy

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

最后,-ss的位置很重要。作为一个输入选项(在-i之前),它会快得多,因为它会立即寻找你想要的时间,然后开始解码,但它不像-ss那样准确,它是一个完全解码所有内容的输出选项你想要的时间。如果准确性比速度更重要,那么请考虑将-ss作为输出选项进行测试。

相关问题