如何使用PHP + shell命令优化视频到动画GIF转换

时间:2011-11-29 08:00:59

标签: php shell video ffmpeg imagick

我有一个将任何视频转换为动画GIF的网络应用程序。该应用程序在PHP中运行,以下步骤通过php的shell_exec执行:

  1. 将视频缩放到较小尺寸(如果它们很大)(ffmpeg -i $ in -s 200x150 -an $ out)
  2. 使用ffmpeg每x秒提取1个jpeg(ffmpeg -i $ in -ss $ ss -vframes 1 $ out)
  3. 使用imagick将jpegs转换为动画GIF(convert -delay $ delay -loop 0 $ dir / * $ out)

    抛开 - 我不使用ffmpeg gif89a输出的原因是因为质量很差。

  4. 我想能够除了任何主要的图像格式,但最常见的可能是.flv(flash)和.avi / .mpg。

    我的应用运行良好,但我是一个完美主义者,它需要更快的可扩展性。

    我的网络服务器有16个核心,我想尽可能多地使用它们,但ffmpeg似乎不支持.flv多线程,而.avi和其他一些支持。此外,ffmpeg在输出到jpegs时不支持多线程。

    是否有人知道支持.flv和其他多线程的任何其他程序?有没有更有效的方法从视频创建动画GIF,同时保持相对不错的质量(又不是ffmpeg支持的100色调色板)?

    此外,如果有人知道哪些编解码器可能最适合第1和第2阶段,特别是对于flv,我很想知道。我已经做了几个小时的测试,但是有很多选择我还没有得出任何可靠的结论。

    ***更新:我的在线应用程序目前运作良好animated gif generator。我仍然希望能让它更快,所以如果有人遇到类似的情况......请告诉我!

1 个答案:

答案 0 :(得分:0)

你可以直接转换AFAIK

ffmpeg -i [input_video] output.gif

虽然您应该添加额外的用户参数,其中包含帧速率,大小等的合理默认值...(否则输出将是巨大的)并且为了进一步优化图像,您可以使用gifsicle

编辑:好的,同意ffmpeg的gif编码可以使用改进 - 它可以从添加量化器中获益最多:

http://www.ece.mcmaster.ca/~xwu/cq.c

  
    

算法:RGB空间的贪婪正交二分法用于方差            通过包含 - 排除技巧辅助最小化。            对于速度,不进行最近邻搜索。略            通过更复杂的方式可以期待更好的性能            但更昂贵的版本。