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
parax264
. -
Después de ejecutar
./configure
parax264
la salida de la consola debe mostrarasm: yes
. -
Use un
x264
reciente. Veo muchos usuarios compilando versiones antiguas que pueden perder las optimizaciones. -
Luego recompile
ffmpeg
para que use el nuevox264
. Asegúrese de queffmpeg
no se vincule alx264
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.