如何在Linux服务器上以编程方式将动态gif转换为视频(例如h264@mp4)?
我需要处理用户生成的内容,并以几种定义好的视频格式输出。因此,可能会有用户想要处理动态gif文件。我已经有一组工作正常的PHP脚本,可以使用avconv将视频文件转码为特定格式(如vpx@webm和h264@mp4,并缩放到特定分辨率),但是需要视频输入。
通常的方法似乎是提取gif的帧,然后进行编码,例如:
但这样会忽略由gif文件中的暂停信息确定的帧率。可以使用-r参数来定义avconv的帧率,但是:
我需要处理用户生成的内容,并以几种定义好的视频格式输出。因此,可能会有用户想要处理动态gif文件。我已经有一组工作正常的PHP脚本,可以使用avconv将视频文件转码为特定格式(如vpx@webm和h264@mp4,并缩放到特定分辨率),但是需要视频输入。
通常的方法似乎是提取gif的帧,然后进行编码,例如:
convert file.gif file%03d.png
avconv -i file%03d.png file.mp4
但这样会忽略由gif文件中的暂停信息确定的帧率。可以使用-r参数来定义avconv的帧率,但是:
- 它不考虑帧之间的暂停时间,因为它们可能不同(例如第一帧100ms暂停,第二帧250ms暂停,第三帧100ms暂停等)
- 由于输入来自用户,因此甚至可能有所变化,因为某些gif可能具有5fps和其他gif可能具有30fps
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转码为视频?
avconv
很烂。从 FFmpeg 的官网 下载最新的静态版本(不要下载来自 Libav 的假冒版本),然后尝试运行以下命令:ffmpeg -i input.gif -c:v libx264 -pix_fmt yuv420p -movflags +faststart output.mp4
- llogan