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

Raz*_*uar 8 video mp4 android ffmpeg whatsapp

我怎样才能将mp4视频文件转换为WhatsApp gif文件(它简单显示为应用程序用户界面内的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文件,内部(在app)显示为Gif(具有不同的UI):

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

VC.*_*One 2

“...问题是我无法编辑另一个 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
Run Code Online (Sandbox Code Playgroud)

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

2) 计算增量。

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

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

所以只需使用这个逻辑(ab):

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

  • b) 如果输入 MP4 标头比 WhatsApp 大:
    delta = ( input_MP4_header - WhatsApp_header )

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

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

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

STCO3)用新的偏移量更新原子:

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

从的 NAME 字节73的起始字节跳过 12 个字节,因此跳过这些:stco73 74 63...

73 74 63 6F 00 00 00 00 00 00 00 2A
Run Code Online (Sandbox Code Playgroud)

现在您到达了用新值顺序更新偏移量的每个 32 位整数(4 字节)的点delta。但是要更新多少个偏移量呢?

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

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

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

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