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

标签 android video ffmpeg mp4 whatsapp

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

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

我有什么:

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

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

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 0 0 0 0 0 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

最佳答案

"...The problem is that I can't edit another MP4 file to add this atom without corrupt the file.

测试这个small_VC1edit.mp4在 WhatsApp 中。如果它能满足您的要求,请继续阅读...

制作可播放的 MP4:

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

1) 在空白字节数组中,添加显示的 WhatsApp 样式 MP4 header 的前 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 个字节(对于您的输出文件,这八个字节中的四个值必须不同)。

2) 计算增量。

  • 请注意(新的)WhatsApp header 为 72 字节(在 moov 原子之前)。

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

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

  • a) 如果 WhatsApp header 比输入的 MP4 大:
    delta = (WhatsApp_header - input_MP4_header)

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

因此对于具有 160 个 header 字节的输入 small.mp4(接下来是 4 个字节的 moov 的大小(如 00 00 0D 83),然后是另外 4 个字节的 moov 的名称(作为 6D 6F 6F 76 或 "moov") 的 utf-8 文本。

我们可以说:160 MP4 字节 - 72 WhatsApp 字节 = 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 字节。

stco 的名称字节 73 74 63... 的起始字节 73 开始跳过 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 个条目需要编辑。我们的 Delta88 所以对于我们读取的每个整数值,减去 88,然后在同一个地方写回新值,再重复 41 次(使用 While 循环与 if 条件来break; 循环)。

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

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

关于android - WhatsApp 视频作为 Gif 以编程方式在 Android 上共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44893316/

相关文章:

Android 构建失败 - Ionic/Cordova - 无法添加 Assets 文件 - 文件已在存档中

android - 三星Touchwiz始终在Android 4.1.1中启动时提示默认应用程序

Ruby 视频教程

ffmpeg 提供了文本和文本文件。请只提供一个

windows - 在 Windows 上使用带有 Decklink 卡的 FFMpeg 进行流式传输

ffmpeg:用于过滤器比较的滑动覆盖

android - 如何以编程方式调用紧急电话

Android 从开始到特定字符删除字符串

linux图片转视频,两位数问题

audio - 如何替换视频文件一部分的视频轨道?