如何将mp4视频文件转换为WhatsApp gif文件(它简单显示为应用程序UI内的gif,但内部是特定的mp4格式),用于android共享意图,被whatsapp识别为此类媒体聊天应用程序???
我搜索了很多,但我找不到WhatsApp文档中的任何信息(他们没有这种文档)或任何与我有相同问题的开发者。
我有什么:
我发现在whatsapp“gif”mp4文件的开头有一个循环值,如果你在十六进制编辑器上读取它们,所有文件都有这个。删除此值使whatsapp作为常规视频接收(不作为gif共享)。
如何使用ffmpeg编码添加此值? (用这个值手动编辑我的mp4文件会破坏文件,也许我必须修复一些我还不知道的mp4标题索引...)
以十六进制表示的第一个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
答案 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标头的后端/末尾。将数组保存为新文件并进行测试。