videos studio programacion para móviles libro edición desarrollo curso comprimir aplicaciones android video ffmpeg compression libx264

studio - Compresión rápida de video en Android



manual de programacion android pdf (2)

capacidades de la CPU x264

La salida / registro de su 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 reevaluar cómo compiló x264 para que sea compatible con 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 compilando versiones antiguas que pueden perder las optimizaciones.
  • Luego recompile ffmpeg para que use el nuevo x264 . Asegúrese de que ffmpeg no se vincule al x264 incorrecto si tiene varias versiones.

MediaCodec aceleración de hardware

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

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

Quiero subir archivos de video al servidor y comprimirlos antes de subirlos. Estoy usando ffmpeg libx264. He visto que Viber puede cargar un archivo de video de 30 segundos con un tamaño de 78 MB en un minuto [reducirlo 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-androideabi- --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 78 segundos de 30 segundos se comprime a 4,3 MB, lo que lleva alrededor de 1 minuto y 28 segundos. Aquí está el volcado de la consola: http://pastebin.com/rn81acGx . Principalmente quiero reducir el tiempo que lleva comprimir. ¿Cómo puedo conseguir esto?

Gracias por adelantado.


Tendrá que usar las capacidades de codificación acelerada por hardware del dispositivo, si corresponde. Por lo que puedo decir, ffmpeg no ofrece codificación acelerada HW en Android. Hay un libstagefright pero se usa para decodificar HW.

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