android - poner - gifs para enviar por whatsapp
Video de WhatsApp como compartir Gif en Android programáticamente (1)
¿Cómo puedo convertir un archivo de video mp4 a un archivo gif de WhatsApp (se muestra como gif dentro de la interfaz de usuario de la aplicación pero internamente es un formato mp4 específico) para ser utilizado en la intención de compartir de Android, siendo reconocido como este tipo de medios por la aplicación de chat WhatsApp? ??
Busco mucho pero no puedo encontrar ninguna información de los documentos de WhatsApp (no tienen este tipo de documento de todos modos) o cualquier desarrollador con el mismo problema que yo.
LO QUE TENGO:
He descubierto que al comienzo de los archivos mp4 "gif" de WhatsApp, se presenta un valor de bucle si los lee en el editor hexadecimal, todos los archivos tienen esto. Elimine este valor y haga que WhatsApp reciba el video normal (no se comparte como gif).
¿Cómo puedo agregar este valor usando la codificación ffmpeg? (editar mis archivos mp4 manualmente con este valor corrompe los archivos, tal vez tenga que arreglar algún índice de encabezado mp4 que aún no conozco ...)
PRIMEROS 80 BYTES en hexadecimal (de principio a fin del átomo "moov" de la estructura mp4):
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
Un archivo mp4 corto generado por WhatsApp que internamente (en la aplicación) se mostró como un Gif (con diferente UI):
https://www.dropbox.com/s/kpynmx1bg3z76lz/VID-20171024-WA0009.mp4?dl=0
"... El problema es que no puedo editar otro archivo MP4 para agregar este átomo sin dañar el archivo .
Pruebe este small_VC1edit.mp4 en WhatsApp. Si hace lo que quieres, sigue leyendo ...
Para hacer un MP4 jugable :
Usar small.mp4 original como ejemplo de edición (descargar archivo y abrir con un editor hexadecimal).
1) En una matriz de bytes en blanco, agregue los primeros 72 bytes del encabezado MP4 de WhatsApp mostrado.
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
Has mostrado 80 bytes pero los últimos 8 bytes no son necesarios todavía (también cuatro de esos valores de ocho bytes deben ser diferentes para tu archivo de salida).
2) Calcula los deltas.
Tenga en cuenta que el (nuevo) encabezado de WhatsApp es de 72 bytes (antes del átomo
moov
).Tenga en cuenta que (original) Small.mp4 tiene 160 bytes de encabezado (antes del átomo
moov
).
Entonces use esta lógica ( aob ):
a) Si el encabezado de WhatsApp es más grande que la entrada MP4:
delta = ( WhatsApp_header - input_MP4_header)
b) Si el encabezado MP4 de entrada es más grande que WhatsApp:
delta = ( input_MP4_header - WhatsApp_header )
Entonces, para la entrada small.mp4 que tiene 160 bytes de encabezado (seguido de 4 bytes de TAMAÑO de moov (como 00 00 0D 83
) y luego sigue otros 4 bytes ahora de NOMBRE de moov (como 6D 6F 6F 76
o texto utf-8) de " moov
").
Podemos decir: 160 MP4 bytes - 72 WhatsApp bytes = Delta of 88
.
Si elimina estos 160 bytes originales y los reemplaza con los 72 bytes de WhatsApp más cortos, serán 88 bytes menos que ahora se deben tener en cuenta en la otra sección de datos de MOOV
. Esa sección es el átomo de STCO
.
3) Actualice el átomo STCO
con nuevas compensaciones:
En small.mp4, el átomo de STCO
comienza en el desplazamiento 1579 (como 73 74 63 6F
). Los 4 bytes anteriores (desplazamientos: 1575 a 1578) son stco
de stco
de stco
(como 00 00 00 B8
) que es el valor decimal 184 . Este TAMAÑO total de la longitud de bytes incluye la contabilidad de esos 4 bytes de TAMAÑO también.
Omita 12 bytes desde el byte inicial 73
de los bytes NOMBRE del stco
73 74 63...
saltee estos:
73 74 63 6F 00 00 00 00 00 00 00 2A
Ahora llega al punto para actualizar secuencialmente cada entero de 32 bits (4 bytes) de desplazamientos con el nuevo valor delta
. Pero, ¿cuántas compensaciones actualizar?
atomEditTotal = ( (stco_SIZE - 16) / 4); //gives 42 //PS: Minus by 16 is to trim off non-offset bytes.
Entonces hay 42 entradas para editar. Nuestro Delta
como 88, por lo que para cada número entero leemos valor, menos 88, luego lo volvemos a escribir en el mismo lugar, lo repetimos 41 veces (usando el ciclo While
con una condición if
para break;
el ciclo).
Para las pruebas, dado un archivo corrupto, si edita la primera entrada, debería ser suficiente para mostrar el cuadro 1 del video (si no es un archivo de audio).
PD: Después de editar los desplazamientos de STCO de small.mp4, simplemente elimine sus 160 bytes de inicio y una los conos de esos bytes MP4 restantes a la parte posterior / final del encabezado de 72 bytes de WhatsApp. Guardar matriz como nuevo archivo y prueba.