Compresión rápida de video en Android

Quiero subir archivos de video al servidor y comprimir antes de cargar. Estoy usando ffmpeg libx264. He visto que el viber puede cargar un archivo de video de 30 segundos de tamaño 78MB en un minuto [reduzca a 2,3 MB]. Quiero saber cómo lo hacen tan rápido?

Lo que he intentado hasta ahora –

FFMPEG version : n2.4.2 Built with gcc 4.8 Build Configuraiton : --target-os=linux --cross-prefix=/home/sb/Source-Code/ffmpeg-android/toolchain-android/bin/arm-linux-androidabi- --arch=arm --cpu=cortex-a8 --enable-runtime-cpudetect --sysroot=/home/sb/Source-Code/ffmpeg-android/toolchain-android/sysroot --enable-pic --enable-libx264 --enable-libass --enable-libfreetype --enable-libfribidi --enable-fontconfig --enable-pthreads --disable-debug --disable-ffserver --enable-version3 --enable-hardcoded-tables --disable-ffplay --disable-ffprobe --enable-gpl --enable-yasm --disable-doc --disable-shared --enable-static --pkg-config=/home/sb/Source-Code/ffmpeg-android/ffmpeg-pkg-config --prefix=/home/sb/Source-Code/ffmpeg-android/build/armeabi-v7a-neon --extra-cflags='-I/home/sb/Source-Code/ffmpeg-android/toolchain-android/include -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fno-strict-overflow -fstack-protector-all -mfpu=neon' --extra-ldflags='-L/home/sb/Source-Code/ffmpeg-android/toolchain-android/lib -Wl,-z,relro -Wl,-z,now -pie' --extra-libs='-lpng -lexpat -lm' --extra-cxxflags= 

Mando:

 ffmpeg -y -i /storage/emulated/0/main.mp4 -s 480x320 -r 20 -c:v libx264 -preset ultrafast -c:a copy -me_method zero -tune fastdecode -tune zerolatency -strict -2 -b:v 1000k -pix_fmt yuv420p /storage/emulated/0/output.mp4 

El resultado hasta ahora es que un archivo de 30 segundos de 78MB se comprime a 4.3MB, lo que demora alrededor de 1min 28seconds. Aquí está el volcado de consola: http://pastebin.com/rn81acGx . Principalmente quiero reducir el tiempo que lleva comprimir. ¿Cómo puedo conseguir esto?

Gracias por adelantado.

Capacidad de la CPU x264

La salida / registro de la consola ffmpeg muestra el siguiente mensaje de libx264:

 using cpu capabilities: none! 

Para su dispositivo, esperaría algo como:

 using cpu capabilities: ARMv7 NEON 

Debería volver a evaluar cómo compiló x264 para que admita las capacidades de su CPU. Con none codifica significativamente más lento.

  • No use la opción de configuración --disable-asm para x264 .
  • Después de ejecutar ./configure para x264 la salida de la consola debe mostrar asm: yes .
  • Use un x264 reciente. Veo muchos usuarios comstackndo versiones antiguas que pueden perder optimizaciones.
  • Luego recomstack ffmpeg para que use el nuevo x264 . Asegúrese de que ffmpeg no enlace al x264 incorrecto si tiene múltiples versiones.

Aceleración de hardware MediaCodec

Actualmente, ffmpeg admite la deencoding H.264 asistida por hardware y HEVC a través de la API MediaCodec en Android, lo que puede ayudar a reducir el tiempo total de procesamiento. Para obtener más información y una lista actualizada de las capacidades, consulte FFmpeg Wiki: Aceleración de hardware .

Para usarlo, asegúrese de que su ffmpeg esté comstackdo con --enable-jni y --enable-mediacodec .

Tendrá que usar las capacidades de encoding acelerada por hardware del dispositivo, si corresponde. Por lo que puedo decir, ffmpeg no ofrece encoding HW acelerada en Android. Hay una libstagefright pero se usa para la deencoding HW.

Dependiendo de la versión de su API objective, puede usar MediaCodec (API 16) para hacer encoding HW y MediaMuxer (API 18) para mux en mp4 . Si logras codificar con MediaCodec puedes usar ffmpeg para hacer la parte mux, que solo requeriría API 16.