android ffmpeg mp4 mediacodec mediamuxer

Agregar un mapa de bits de marca de agua a un video en Android: MediaMuxer o ffmpeg de 4.3



mp4 mediacodec (4)

Esto es lo que funcionó para mí:

ffmpeg -i input.avi -i logo.png -filter_complex ''overlay=10:main_h-overlay_h-10'' -strict -2 output.avi

ffmpeg recomendó el uso -strict -2 inorder para permitir el uso de códecs experimentales. sin la inclusión, la respuesta aceptada anteriormente no funciona.

Aquí está mi escenario:

  • Descarga una película avi desde la web.
  • Abrir un recurso de mapa de bits
  • Superponer este mapa de bits en la parte inferior de la película en todos los fotogramas en segundo plano
  • Guarda el video en almacenamiento externo
  • La duración del video es de 15 segundos por lo general.

¿Es posible lograr esto usando MediaMuxer? Cualquier información al respecto se recibe con mucho gusto.

He estado buscando en http://bigflake.com/mediacodec/#DecodeEditEncodeTest (Gracias @fadden) y dice allí:

"Descodificar el marco y copiarlo en un ByteBuffer con glReadPixels() toma aproximadamente 8 ms en el Nexus 5, lo suficientemente rápido para mantener el ritmo con la entrada de 30 fps, pero los pasos adicionales necesarios para guardarlo en el disco como PNG son caros (aproximadamente la mitad un segundo)"

Así que tener casi 1 segundo / cuadro no es aceptable. De lo que estoy pensando, una forma sería guardar cada cuadro como PNG, abrirlo, agregar la superposición de mapa de bits en él y luego guardarlo. Sin embargo, esto tomaría un tiempo enorme para lograrlo.

Me pregunto si hay una manera de hacer cosas como esta:

  1. Abrir archivo de video desde almacenamiento externo
  2. Empezar a decodificarlo
  3. Cada cuadro decodificado se modificará con la superposición de mapa de bits en la memoria
  4. El marco se envía a un codificador.

En iOS vi que había una forma de tomar el audio original + video original + una imagen y agregarlos en un contenedor y luego codificar todo ...

¿Debo cambiar a ffmpeg? ¿Qué tan estable y compatible es ffmpeg? ¿Estoy arriesgando problemas de compatibilidad con dispositivos Android 4.0+? ¿Hay alguna manera de usar ffmpeg para lograr esto? Soy nuevo en este dominio y sigo haciendo investigación.

Años después edita:
Han pasado años desde la pregunta y ffmpeg no es realmente fácil de agregar a un software comercial en términos de licencia. ¿Cómo evolucionó esto? Las nuevas versiones de Android son más capaces en esto con el sdk predeterminado?


No sé mucho sobre el MediaMuxer pero ffmpeg admite la funcionalidad de superposición. FFMPEG tiene varios filtros, uno de ellos es el filtro de superposición. Lo que entiendo es que desea superponer una imagen (es decir, png) en el video, ffmpeg seguramente es un marco útil para hacer este trabajo. Puede configurar el formato de salida. Puede configurar las coordenadas de la imagen que se va a sobre-jugar.

P.ej

ffmpeg -i input.avi -i logo.png -filter_complex ''overlay=10:main_h-overlay_h-10'' output.avi

El comando anterior agrega overlays logo.png en el archivo de video input.avi en la esquina inferior izquierda.

Más información sobre los filtros está disponible en el siguiente sitio web,

https://www.ffmpeg.org/ffmpeg-filters.html#overlay-1

Si esta es una solución a su problema, necesita el código C equivalente al comando anterior. También necesita ver el rendimiento del ffmpeg porque es un marco de software puro.

Espero haber entendido tu pregunta correctamente y esto ayuda.


Puede probar INDE Media Pack - https://software.intel.com/en-us/articles/intel-inde-media-pack-for-android-tutorials

Tiene una función de transcodificación / remuxing como clase MediaComposer y varios efectos de muestra como JpegSubstituteEffect - muestra cómo sustituir un cuadro de video por una imagen de un archivo jpg y TextOverlayEffect para superponer texto en un cuadro de video, etc. Se podría mejorar fácilmente al efecto de marca de agua


Si necesita hacer esto sin ffmpeg en el dispositivo Android:

Comience desde: github.com/google/grafika

La respuesta a su pregunta entre los ejemplos de Play Video (PlayMovieActivity.java) y Record Gl App (RecordFBOActivity.java) .

Pasos:

  1. Configure mInputWindowSurface como superficie de entrada del codificador de video.

  2. Decodifique el fotograma de la secuencia de video usando MoviePlayer como textura de video (externa).

  3. Dibuja esta textura de video en superficie.

  4. Dibuje una marca de agua en la misma superficie sobre la textura de video.

  5. Notifique a MediaCodec que esté lista para la codificación:

    mVideoEncoder.frameAvailableSoon(); mInputWindowSurface.setPresentationTime(timeStampNanos);

    y luego ir a Paso 2.

No te olvides de ajustar la velocidad de decodificación. Simplemente quite SpeedControlCallback que en el ejemplo está configurado para decodificar video de 60 FPS.

Ventajas de esta manera:

  1. Media Codec utiliza decodificador / codificador de hardware para el procesamiento de video.

  2. Puede cambiar la tasa de bits de vídeo de resultado.