我如何将 mp4 视频文件转换为 WhatsApp gif 文件(它在应用程序用户界面中简单显示为 gif,但在内部是特定的 mp4 格式)以用于 android 共享 Intent ,被 whatsapp 识别为此类媒体聊天应用程序???
我搜索了很多,但我无法从 WhatsApp 文档(他们没有这种文档)或任何与我有相同问题的开发人员中找到任何信息。
我有什么:
我发现在 whatsapp“gif”mp4 文件的开头存在一个 loop 值,如果你在十六进制编辑器上阅读它们,所有文件都有这个。删除此值使 whatsapp 接收为常规视频(不共享为 gif)。
如何使用 ffmpeg 编码添加此值? (使用此值手动编辑我的 mp4 文件会损坏文件,也许我必须修复一些我还不知道的 mp4 header 索引...)
十六进制的前 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 原子之前)。
所以只要使用这个逻辑(a 或 b):
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 个条目需要编辑。我们的 Delta 为 88 所以对于我们读取的每个整数值,减去 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/
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere
question的一些答案关于redirect_to让我想到了其他一些问题。基本上,我正在使用Rails2.1编写博客应用程序。我一直在尝试自己完成大部分工作(因为我对Rails有所了解),但在需要时会引用Internet上的教程和引用资料。我设法让一个简单的博客正常运行,然后我尝试添加评论。靠我自己,我设法让它进入了可以从script/console添加评论的阶段,但我无法让表单正常工作。我遵循的其中一个教程建议在帖子Controller中创建一个“评论”操作,以添加评论。我的问题是:这是“标准”方式吗?我的另一个问题的答案之一似乎暗示应该有一个CommentsController参
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识
动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、
2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p