WhatsApp视频作为Gif在Android上共享以编程方式

时间:2017-07-03 20:15:42

标签: android video ffmpeg mp4 whatsapp

如何将mp4视频文件转换为WhatsApp gif文件(它简单显示为应用程序UI内的gif,但内部是特定的mp4格式),用于android共享意图,被whatsapp识别为此类媒体聊天应用程序???

我搜索了很多,但我找不到WhatsApp文档中的任何信息(他们没有这种文档)或任何与我有相同问题的开发者。

我有什么:

我发现在whatsapp“gif”mp4文件的开头有一个循环值,如果你在十六进制编辑器上读取它们,所有文件都有这个。删除此值使whatsapp作为常规视频接收(不作为gif共享)。

如何使用ffmpeg编码添加此值? (用这个值手动编辑我的mp4文件会破坏文件,也许我必须修复一些我还不知道的mp4标题索引...)

enter image description here

以十六进制表示的第一个80个字节(从mp4结构开始的“moov”原子开始):

00 00 00 1C 66 74 79 70 6D 70 34 32 00 00 00 01 6D 70 34 31 6D 70 34 32 69 73 6F 6D 00 00 00 18 62 65 61 6D 01 00 00 00 01 00 00 00 00 00 00 00 05 00 00 00 00 00 00 0C 6C 6F 6F 70 00 00 00 00 00 00 00 08 77 69 64 65 00 00 04 9F 6D 6F 6F 76

由WhatsApp生成的短mp4文件,内部(在应用程序时)显示为Gif(具有不同的UI):

https://www.dropbox.com/s/kpynmx1bg3z76lz/VID-20171024-WA0009.mp4?dl=0

1 个答案:

答案 0 :(得分:1)

  

“...问题是我无法编辑另一个MP4文件来添加这个原子   没有破坏文件

在WhatsApp中测试此small_VC1edit.mp4。如果它符合您的要求,请继续阅读......

制作可播放的MP4

使用原始small.mp4作为编辑示例(下载文件并使用十六进制编辑器打开)。

1)在空白字节数组中,添加所示WhatsApp风格MP4标题的前72个字节。

00 00 00 1C 66 74 79 70 6D 70 34 32 00 00 00 01 6D 70 34 31 6D 70 34 32 69 73 6F 6D 00 00 00 18 62 65 61 6D 01 00 00 00 01 00 00 00 00 00 00 00 05 00 00 00 00 00 00 0C 6C 6F 6F 70 00 00 00 00 00 00 00 08 77 69 64 65

您已经显示了80个字节,但还不需要最后8个字节(对于您的输出文件,这8个字节值中的4个必须不同)。

2)计算增量。

  • 请注意(新) WhatsApp 标头为72个字节(在moov原子之前)。

  • 请注意(原始) Small.mp4 有160个字节的标头(在moov原子之前)。

所以只需使用此逻辑( a b ):

  • a)如果WhatsApp标题大于输入MP4:
    delta = ( WhatsApp_header - input_MP4_header)

  • b)如果输入的MP4标题大于WhatsApp:
    delta = ( input_MP4_header - WhatsApp_header )

因此对于输入small.mp4有160个头字节(接下来是4个字节的moov的SIZE(作为00 00 0D 83)然后跟随另外4个字节的moov的NAME(作为6D 6F 6F 76或“moov”的utf-8文本。

我们可以说:160 MP4 bytes - 72 WhatsApp bytes = Delta of 88

如果删除这些原始的160个字节并用更短的72个WhatsApp字节替换它们,它们将减少88个字节,现在必须在MOOV数据的另一部分中考虑。该部分是STCO原子。

3)使用新的偏移更新STCO原子:

在small.mp4中,STCO原子从偏移量1579开始(为73 74 63 6F)。前4个字节(偏移量:1575到1578)是stco的SIZE字节(00 00 00 B8),它是十进制值 184 。这个字节长度的总SIZE包括计算那4个SIZE字节。

73的NAME字节stco的起始字节73 74 63...中跳过12个字节,请跳过这些:

73 74 63 6F 00 00 00 00 00 00 00 2A

现在,您可以使用新的delta值顺序更新每个32位整数(4个字节)的偏移量。但要更新多少补偿?

atomEditTotal = ( (stco_SIZE - 16) / 4); //gives 42 //PS: Minus by 16 is to trim off non-offset bytes.

因此有42个条目需要编辑。我们的Delta 88 因此,对于每个整数,我们读取值,减去88,然后在同一位置将其写回新值,再重复41次(使用While循环if条件到break;循环)。

为了测试,给定一个损坏的文件,如果您编辑第一个条目,它应该足以显示视频的第1帧(如果是非音频文件)。

PS:在编辑了small.mp4的STCO偏移后,只需删除它的起始160字节,然后将剩余的MP4字节连接/连接到72字节WhatsApp标头的后端/末尾。将数组保存为新文件并进行测试。