FFmpeg en Android

Resuelto Jag asked hace 54 años • 0 respuestas

Tengo FFmpeg compilado (libffmpeg.so) en Android. Ahora tengo que crear una aplicación como RockPlayer o usar el marco multimedia existente de Android para invocar FFmpeg.

  1. ¿Tiene pasos/procedimientos/código/ejemplo sobre la integración de FFmpeg en Android/StageFright?

  2. ¿Puede guiarme sobre cómo puedo usar esta biblioteca para la reproducción multimedia?

  3. Tengo un requisito en el que ya tengo transmisiones de transporte de audio y video, que necesito enviar a FFmpeg y decodificarlas/renderizarlas. ¿Cómo puedo hacer esto en Android, ya que las API de IOMX están basadas en OMX y no pueden conectar FFmpeg aquí?

  4. Además, no pude encontrar documentación sobre las API de FFmpeg que deben usarse para la reproducción.

Jag avatar Jan 01 '70 08:01 Jag
Aceptado

Estos son los pasos que seguí para hacer que ffmpeg funcione en Android:

  1. Cree bibliotecas estáticas de ffmpeg para Android. Esto se logró construyendo el puerto ffmpeg de Android de olvaffe ( libffmpeg ) utilizando el sistema de compilación de Android . Simplemente coloque las fuentes debajo de /external y makealéjelas. También necesitarás extraer bionic(libc) y zlib(libz) de la compilación de Android, ya que las bibliotecas ffmpeg dependen de ellos.
  2. Cree una biblioteca dinámica que incluya la funcionalidad ffmpeg utilizando el NDK de Android . Existe mucha documentación sobre cómo trabajar con el NDK. Básicamente, necesitará escribir código C/C++ para exportar la funcionalidad que necesita de ffmpeg a una biblioteca con la que Java pueda interactuar a través de JNI. El NDK le permite vincular fácilmente las bibliotecas estáticas que generó en el paso 1, simplemente agregue una línea similar a esta en Android.mk:LOCAL_STATIC_LIBRARIES := libavcodec libavformat libavutil libc libz

  3. Utilice la biblioteca dinámica ffmpeg-wrapping de sus fuentes java. Hay suficiente documentación sobre JNI, debería estar bien.

Con respecto al uso de ffmpeg para la reproducción, hay muchos ejemplos (el binario ffmpeg en sí es un buen ejemplo), aquí hay un tutorial básico. La mejor documentación se puede encontrar en los encabezados.

Buena suerte :)

yonilevy avatar Jan 27 '2011 18:01 yonilevy

Por varias razones, Multimedia fue y nunca es fácil en términos de lograr la tarea sin comprometer la eficiencia. ffmpeg es un esfuerzo por mejorarlo día a día. Admite diferentes formatos de códecs y contenedores.

Ahora, para responder a la pregunta de cómo utilizar esta biblioteca , diría que no es tan sencillo escribirla aquí. Pero puedo guiarte de las siguientes maneras .

1) Dentro del directorio ffmpeg del código fuente, tiene output_example.c o api_example.c . Aquí puede ver el código donde se realiza la codificación/decodificación. Obtendrá una idea de qué API dentro de ffmpeg debe llamar. Este sería tu primer paso.

2) Dolphin Player es un proyecto de código abierto para Android. Actualmente tiene errores pero los desarrolladores trabajan continuamente. En ese proyecto tienes lista toda la configuración que puedes utilizar para continuar tu investigación. Aquí hay un enlace al proyecto desde code.google.com o ejecute el comando " git clone https://code.google.com/p/dolphin-player/ " en una terminal. Puedes ver dos proyectos llamados P y P86. Puedes utilizar cualquiera de ellos.

Un consejo adicional que me gustaría ofrecer es que cuando esté compilando el código ffmpeg, dentro de build.sh debe habilitar los muxers/demuxers/encoders/decoders de los formatos que desea usar. De lo contrario, el código correspondiente no se incluirá en las bibliotecas. Me tomó mucho tiempo darme cuenta de esto. Así que pensé en compartirlo contigo.

Algunos conceptos básicos: cuando decimos un archivo de video, por ejemplo: avi, es una combinación de audio y video.

Archivo de vídeo = Vídeo + Audio


Vídeo = Códec + Muxer + Demuxer

códec = codificador + decodificador

=> Vídeo = codificador + decodificador + Muxer + Demuxer (Mpeg4 + Mpeg4 + avi +avi - Ejemplo para contenedor avi)


Audio = Códec + Muxer + Demuxer

códec = codificador + decodificador

=> Audio = codificador + decodificador + Muxer + Demuxer (mp2 + mp2 + avi + avi - Ejemplo para contenedor avi)


Codec (el nombre se deriva de una combinación de en*co*der/*dec*oder) es solo una parte del formato que define los algoritmos utilizados para codificar/decodificar un fotograma. AVI no es un códec, es un contenedor que utiliza el códec de vídeo Mpeg4 y el códec de audio mp2.

Muxer/demuxer se utiliza para combinar/separar los fotogramas de un archivo utilizado durante la codificación/decodificación.

Entonces, si desea utilizar el formato avi, debe habilitar Componentes de video + Componentes de audio.

Por ejemplo, para avi, debe habilitar lo siguiente. Codificador mpeg4, decodificador mpeg4, codificador mp2, decodificador mp2, avi muxer, avi demuxer.

ufwwwwww...

Mediante programación, build.sh debe contener el siguiente código:

--enable-muxer=avi --enable-demuxer=avi (Generic for both audio/video. generally Specific to a container)
--enable-encoder=mpeg4 --enable-decoder=mpeg4(For video support)
--enable-encoder=mp2 --enable-decoder=mp2 (For Audio support)

Espero no haberte confundido más después de todo esto...

Gracias. Si necesita ayuda, hágamelo saber.

Sandeep avatar Mar 27 '2012 08:03 Sandeep

La implementación más fácil de construir y usar que he encontrado la realizó el equipo de theguardianproject: https://github.com/guardianproject/android-ffmpeg

Guy avatar Oct 31 '2012 11:10 Guy

Hice un pequeño proyecto para configurar y construir X264 y FFMPEG usando el NDK de Android. Lo principal que falta es una interfaz JNI decente para que sea accesible a través de Java, pero esa es la parte fácil (relativamente). Cuando llegue el momento de hacer que la interfaz JNI sea buena para mis propios usos, la incluiré.

La ventaja sobre el sistema de compilación de olvaffe es que no requiere archivos Android.mk para compilar las bibliotecas, solo utiliza los archivos MAKE normales y la cadena de herramientas. Esto hace que sea mucho menos probable que deje de funcionar cuando realiza nuevos cambios desde FFMPEG o X264.

https://github.com/halfninja/android-ffmpeg-x264

Nick avatar Jun 24 '2011 11:06 Nick