Telegram 跨平台GIF(MP4) 制作标准
tastySugarTelegram 可以把没有音频流的 mp4 文件作为"GIF"播放。这给我们日常的聊天带来了许多的便利,过去的 .gif 格式的压缩效率完全比不上 h.264 编码的效率,而且传统 gif 的帧率也低。h.264 编码的 GIF 让我们可以用更小的体积来实现更为流畅、清晰的画面。
(下文中所有的 GIF 均指仅有一条视频流,没有音频流的 mp4 文件)
tl;dr 请看最下面
然而,telegram的客户端有一些限制, 导致制作出来的一些GIF会有一些播放困难。
一般遇到的播放问题一般有两种。
问题1:无法自动播放
问题2:无法解码
下面将针对这两个问题的已知原因进行一个归纳。
1、无法自动播放的情况
1-1. telegram ios 客户端不会自动下载超过 1.0 MB的 GIF,需要点击下载。下载后便与一般 GIF 无异。因此,这个问题我们只需要知道其存在就好,不需要刻意去避免。
1-2. telegram android 客户端会把超过一定分辨率的 GIF 识别成“Video”,既无法自动播放,也无法循环播放。无法循环的 GIF 可以说是失去了存在的意义。所以这是一个必须要避免的问题。虽说我们暂时没有实验出极限分辨率,不过,分辨率的长宽均小于 1280x720 的视频可以避免出现这个问题的。
2、无法解码
telegram 是一个跨平台的 IM 软件。因为现在很多的手机对于视频的支持不是很好,所以对于以某些参数的编码的视频文件无法解码。
我没看源码,不知道 telegram 手机端是调用的自己的解码包还是调用的手机的系统解码包。所以不知道问题是出在手机没有支持,还是只是 telegram 手机端没有支持这些参数。
2-1. 编码类型:请务必采用 h.264 (AVC) 编码。其它编码的 GIF 无法在手机端播放。
2-2. 色彩:请务必采用 yuv420 采样的色彩空间。
对于色彩空间的详细解释可以点击这里,主要看第三节(图像的表示方法:RGB模型 vs YUV模型)和第五节(色度半采样)。
有些软件在默认参数时生成的视频是 yuv444 的视频,这将会导致移动端无法解码。例如说:使用 ffmpeg 把每一帧的画面拆分成 PNG 图片再把 PNG 图片合成为 mp4 视频时,默认参数会生成 yuv444 的视频。(解决办法,加入 -pix_fmt yuv420p 或 -vf format=yuv420p 参数)
2-4 色深:请务必采用 8 bit 色深。
移动端不支持 10bit 色的视频。
2-3 帧率:虽然暂未发现帧率会导致无法解码的情况,但是对于一般的电影和动画素材,我推荐恒定帧率(CFR)的23.98(在有的软件中是用23.976、24000/1001来表示的)的帧率。
3、 其它已知问题
3-1 telegram 在发送 .gif 文件时,会把 .gif 文件重编码为 264 编码的 .mp4 文件发送,而在某个版本的客户端中,对于文件的重命名有问题。
一般来说正常的转码后文件命名应该是 filename.gif.mp4,而有的时候会出现 filename.gifmp4 的情况,也就是文件虽是 mp4 文件但是拓展名不是 .mp4 的情况。ios telegram 客户端严格按拓展名识别文件类型,在遇到这种文件的情况下是无法播放的。解决办法:把 .gif 文件手动转成 .mp4 后再发送,或者干脆不要发送 .gif 文件。
3-2 画面比例(Aspect Ratio):
telegram 桌面版和 Android 版不会在乎视频文件中储存的画面比例信息,只会按照实际分辨率来播放视频,而在 ios 和网页端中,视频文件里存储的画面比例才会起作用。
两个结论:
1. 不要试图用改变 SAR/DAR 的方式来修复 GIF 画面比例。请使用 resize 的方式重编码。
2. 在使用 AVS+MEGUI 制作 GIF 时,在连续制作多个画面长宽不相同的 GIF 时,每次要重新载入读取 .avs 文件。不要想着反正都是在同一个 avs 脚本上,路径和名字都相同,懒得再载入一次。 MEGUI 只会在载入 .avs 文件时才会计算该脚本的画面比例,如果在制作第二个 GIF 文件时没有重新选定载入该 avs 文件时,生成的视频文件采用的是上一个文件的画面比例数据。
tl;dr:
在遇到播放问题时请使用 mediainfo 来检查视频格式是否满足以下要求,这些要求也是 GIF 制作者需要遵循的标准。
![](/file/d9feda731243962f6e8d1.png)
![](/file/92d30db05d4cb6c0c2907.png)
需检查的项目自上到下为:
- 拓展名是否为 .mp4
- Format(格式)要为 AVC,也就是 h.264 编码。
- 宽度要小于1280,高度要小于720。Display aspect ratio(画面比例)要和宽度处以高度的值匹配。
- Color space (色彩空间)要为 YUV,Chroma subsampling(色度采样)要是 4:2:0,Bit depth(位深)要是 8 bits.
满足以上条件的以 .mp4 封装的视频流,即可在 telegram 上正常作为 GIF 使用。
推荐阅读