tutorials - FFmpeg en Android
opencv python tutorial pdf español (9)
Después de mucha investigación, en este momento esta es la biblioteca compilada más actualizada para Android que encontré:
https://github.com/bravobit/FFmpeg-Android
- En este momento está usando la
FFmpeg release n4.0-39-gda39990
- Incluye FFmpeg y FFProbe
- Contiene interfaz de Java para lanzar los comandos.
- FFprobe o FFmpeg pueden eliminarse del APK, consulte la wiki https://github.com/bravobit/FFmpeg-Android/wiki
Tengo compilado FFmpeg (libffmpeg.so) en Android. Ahora tengo que crear una aplicación como RockPlayer o usar el marco multimedia de Android existente para invocar FFmpeg.
¿Tiene pasos / procedimientos / código / ejemplo sobre la integración de FFmpeg en Android / StageFright?
¿Me pueden guiar sobre cómo puedo usar esta biblioteca para la reproducción multimedia?
Tengo un requisito donde ya tengo flujos de transporte de audio y video, que necesito para enviar a FFmpeg y decodificarlo / renderizarlo. ¿Cómo puedo hacer esto en Android, ya que las API de IOMX están basadas en OMX y no puedo conectar FFmpeg aquí?
Además, no pude encontrar la documentación sobre las API de FFmpeg que deben usarse para la reproducción.
Es extraño que este proyecto no haya sido mencionado: AndroidFFmpeg de Appunite
Tiene instrucciones paso a paso muy detalladas para copiar / pegar en la línea de comandos, para personas perezosas como yo))
Estos son los pasos que he seguido para que ffmpeg funcione en Android:
- Construye bibliotecas estáticas de ffmpeg para Android. Esto se logró mediante la construcción del puerto de Android ffmpeg de libffmpeg ( libffmpeg ) utilizando el sistema de compilación de Android . Simplemente coloque las fuentes debajo / externas y elimine. También necesitarás extraer bionic (libc) y zlib (libz) de la compilación de Android, ya que las bibliotecas ffmpeg dependen de ellos.
Cree una biblioteca dinámica envolviendo la funcionalidad ffmpeg usando el NDK Android. Hay mucha documentación sobre cómo trabajar con el NDK. Básicamente, deberá escribir algún código C / C ++ para exportar la funcionalidad que necesita fuera de ffmpeg a una biblioteca en la que Java pueda interactuar a través de JNI. El NDK le permite enlazar fácilmente con las bibliotecas estáticas que ha generado en el paso 1, simplemente agregue una línea similar a esta en Android.mk:
LOCAL_STATIC_LIBRARIES := libavcodec libavformat libavutil libc libz
Utilice la biblioteca dinámica ffmpeg-wrapping desde sus fuentes Java. Hay suficiente documentación sobre JNI por ahí, deberías estar bien.
En cuanto al uso de ffmpeg para la reproducción, hay muchos ejemplos (el binario ffmpeg en sí mismo es un buen ejemplo), here un tutorial básico. La mejor documentación se puede encontrar en los encabezados.
Buena suerte :)
He hecho un pequeño proyecto para configurar y construir X264 y FFMPEG usando el Android NDK. 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 termine de hacer que la interfaz JNI sea buena para mis propios usos, la introduciré.
La ventaja sobre el sistema de compilación de olvaffe es que no requiere los archivos de Android.mk para construir las bibliotecas, solo usa los makefiles regulares y la cadena de herramientas. Esto hace que sea mucho menos probable que deje de funcionar cuando extraiga un nuevo cambio de FFMPEG o X264.
Inspirado por muchas otras implementaciones de FFmpeg en Android (principalmente el proyecto guadianproject ), encontré una solución (con soporte de Lame también).
(lame y FFmpeg: https://github.com/intervigilium/liblame and http://bambuser.com/opensource )
llamar a FFmpeg:
new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare();
FfmpegController ffmpeg = null;
try {
ffmpeg = new FfmpegController(context);
} catch (IOException ioe) {
Log.e(DEBUG_TAG, "Error loading ffmpeg. " + ioe.getMessage());
}
ShellDummy shell = new ShellDummy();
String mp3BitRate = "192";
try {
ffmpeg.extractAudio(in, out, audio, mp3BitRate, shell);
} catch (IOException e) {
Log.e(DEBUG_TAG, "IOException running ffmpeg" + e.getMessage());
} catch (InterruptedException e) {
Log.e(DEBUG_TAG, "InterruptedException running ffmpeg" + e.getMessage());
}
Looper.loop();
}
}).start();
y para manejar la salida de la consola:
private class ShellDummy implements ShellCallback {
@Override
public void shellOut(String shellLine) {
if (someCondition) {
doSomething(shellLine);
}
Utils.logger("d", shellLine, DEBUG_TAG);
}
@Override
public void processComplete(int exitValue) {
if (exitValue == 0) {
// Audio job OK, do your stuff:
// i.e.
// write id3 tags,
// calls the media scanner,
// etc.
}
}
@Override
public void processNotStartedCheck(boolean started) {
if (!started) {
// Audio job error, as above.
}
}
}
La implementación más fácil de construir y fácil de usar que he encontrado está hecha por el equipo de proyecto guardianio: https://github.com/guardianproject/android-ffmpeg
Para hacer mi aplicación FFMPEG utilicé este proyecto ( https://github.com/hiteshsondhi88/ffmpeg-android-java ), así que no tengo que compilar nada. Creo que es la forma fácil de usar FFMPEG en nuestras aplicaciones de Android.
Más información en http://hiteshsondhi88.github.io/ffmpeg-android-java/
Por diversas razones, el multimedia fue y nunca es fácil en términos de lograr la tarea sin comprometer la eficiencia. ffmpeg es un esfuerzo para mejorarlo día a día. Soporta diferentes formatos de codecs y contenedores.
Ahora, para responder a la pregunta de cómo usar esta biblioteca , diría que no es tan simple escribirla aquí. Pero puedo guiarte en 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 a 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 está teniendo errores pero los desarrolladores están trabajando continuamente. En ese proyecto, tiene toda la configuración lista que puede usar para continuar su investigación. Aquí hay un enlace al project desde code.google.com o ejecute el comando " git clone https://code.google.com/p/dolphin-player/ " en un terminal. Puedes ver dos proyectos llamados P y P86. Puedes usar cualquiera de ellos.
La sugerencia adicional que me gustaría ofrecer es que cuando esté compilando el código ffmpeg, dentro de build.sh debe habilitar los modificadores / demodificadores / codificadores / decodificadores 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 con ustedes.
Algunos conceptos básicos: cuando decimos un archivo de video, ej: avi, es una combinación de audio y video
Archivo de video = Video + Audio
Video = Codec + Muxer + Demuxer
codec = codificador + decodificador
=> Video = codificador + decodificador + Muxer + Demuxer (Mpeg4 + Mpeg4 + avi + avi - Ejemplo para un contenedor avi)
Audio = Codec + Muxer + Demuxer
codec = codificador + decodificador
=> Audio = codificador + decodificador + Muxer + Demuxer (mp2 + mp2 + avi + avi - Ejemplo para un contenedor avi)
El códec (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 cuadro. AVI no es un códec, es un contenedor que utiliza el códec de video de Mpeg4 y el códec de audio de mp2.
Muxer / demuxer se utiliza para combinar / separar los marcos de un archivo utilizado durante la codificación / decodificación.
Por lo tanto, si desea utilizar el formato avi, debe habilitar los componentes de video y los componentes de audio.
Por ejemplo, para avi, debe habilitar lo siguiente. Codificador mpeg4, decodificador mpeg4, codificador mp2, decodificador mp2, avi muxer, avi demuxer.
phewwwwwww ...
Programmatically 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, cualquier ayuda necesaria, por favor hágamelo saber.
Tuve el mismo problema, encontré la mayoría de las respuestas aquí fuera de fecha. Terminé escribiendo un contenedor en FFMPEG para acceder desde Android con una sola línea de código.