linux - 在保持帧速率的同时将动画 gif 转换为 linux 服务器上的视频

标签 linux video ffmpeg video-processing avconv

如何在 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 定义一个帧率,但是

  • 这不考虑帧之间的停顿,因为它们可能不同(例如第一帧 100 毫秒停顿,第二帧 250 毫秒停顿,第三帧 100 毫秒停顿,...)
  • 由于输入来自用户,它甚至可能会有所不同,因为一些 gif 可能有 5fps 而其他的 30fps

我注意到 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 文件转码为视频?

最佳答案

另一个 Avconv 错误 (YAAB)

ffmpeg 有更好的 GIF 解复用支持(和 improved GIF encoding )。我建议放弃 avconv 并获取 ffmpeg(来自 FFmpeg 的真实版本;而不是来自 Libav 的老骗子)。 static build很简单,或者你当然可以compile .

例子

ffmpeg -i in.gif -c:v libx264 -pix_fmt yuv420p -movflags +faststart out.mp4

参见 FFmpeg Wiki: H.264 Encoding Guide更多示例。

关于linux - 在保持帧速率的同时将动画 gif 转换为 linux 服务器上的视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29561033/

相关文章:

linux - 基本内核模块的 Makefile

linux - 如何在 linux (Debian jessie) 上打开一个端口

css - 使用 CSS 媒体查询改变 YouTube 视频质量

php - 如何使用PHP或Linux脚本找到PDF的方向?

linux - 从文件中提取并将详细信息粘贴到另一个文件

html - YouTube视频作为自适应 “box” div背景

ios - 如何将 Youtube 视频嵌入到我的应用程序中?

ffmpeg - 有没有办法使用各种 ffmpeg 命令找出 ffmpeg 在我的系统中的性能是否最佳?

Ffmpeg - 多重叠加 - 错误在哪里?

php - ffmpeg:在php中使用返回的数据