【发布时间】:2017-04-07 04:02:51
【问题描述】:
如何在 linux 服务器上以编程方式将动画 gif 转换为视频(例如 h264@mp4)?
我需要它来处理用户生成的内容,这些内容应该以多种定义的视频格式输出;因此,用户可能想要处理动画 gif 文件。我已经有一组工作 php 脚本可以使用 avconv 将视频文件转码为特定格式(如 vpx@webm 和 h264@mp4,缩放到特定分辨率),但因此我需要视频输入。
通常的方法似乎是提取 gif 的帧,然后对其进行编码,例如
convert file.gif file%03d.png
avconv -i file%03d.png file.mp4
但这会丢弃由 gif 文件中的暂停信息确定的帧速率。可以使用 -r 为 avconv 定义帧率,但是
- 这不考虑帧之间的暂停,因为它们可能不同(例如第 1 帧 100 毫秒暂停,第 2 帧 250 毫秒暂停,第 3 帧 100 毫秒暂停,...)
- 由于输入来自用户,它甚至可能会有所不同,因为某些 gif 可能有 5 fps 而其他 30 fps
我注意到 avconv 能够自行处理 gif,因此可能会尊重正确的暂停,但是当我这样做时(类似地在 How to convert GIF to Mp4 is it possible? 中描述)
avconv -i file.gif -r 30 file.mp4
avconv 将只获取 gif 的第一帧,而它至少将文件检测为视频:
Duration: 00:00:00.04, start: 0.000000, bitrate: N/A
Stream #0.0: Video: gif, pal8, 640x480, 25 tbn
(示例 gif 'file.gif' 有 15 帧,每帧有 100 毫秒的暂停 => 1.5 秒的持续时间,循环)
- 我错过了什么?怎么了?
- 对于这个用例可能有更好的工具吗?
- 什么是大型网站,例如9gag 用于将上传的 GIF 转码为视频?
【问题讨论】:
-
您是否有一个示例 GIF,其中延迟因帧而异?
-
@LordNeckbeard 刚刚用 gimp 创建了这个:s.xi-intersection.de/test2.gif - 大量使用了这个功能。暂停是每帧毫秒:100、150、200、250、300、400、50、50, 500, 200, 100, 100, 50, 75, 200, 200, 200, 200, 50, 50, 50, 40
-
avconv糟透了。获取最近的static build offfmpeg(来自 FFmpeg,而不是来自 Libav 的仿冒品),然后尝试:ffmpeg -i input.gif -c:v libx264 -pix_fmt yuv420p -movflags +faststart output.mp4 -
@LordNeckbeard 实际上,这确实解决了问题;似乎是 avconv 中的错误或类似情况。请您这么好心并根据您的评论做出回答吗?
标签: linux video ffmpeg video-processing avconv