Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Adición de mapa de bits de marca de agua en video en android: MediaMuxer de 4.3 o ffmpeg

Aquí está mi escenario:

  • Descargar una película de 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 marcos en el fondo
  • Guardar el vídeo en el almacenamiento extarnal
  • La longitud del video es de 15 segundos por lo general

¿Es posible lograr esto con MediaMuxer? Cualquier información sobre el asunto se recibe con gusto

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

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

Así que tener casi 1 seg / marco no es aceptable. De lo que estoy pensando una manera sería guardar cada fotograma como PNG, abrirlo, añadir la superposición de mapa de bits en él y luego guardarlo. Sin embargo, esto tomaría un tiempo enorme para lograr.

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

  1. Abrir archivo de vídeo desde un almacenamiento externo
  2. Comienza a decodificarlo
  3. Cada trama decodificada será alterada con la superposición de mapa de bits en la memoria
  4. La trama se envía a un codificador.

En iOS vi que hay una manera de tomar el audio original + video original + una imagen y agregarlos en un contenedor y luego simplemente codificar todo el asunto …

¿Debo cambiar a ffmpeg? ¿Qué tan estable y compatible es ffmpeg? ¿Estoy arriesgando problemas de compatibilidad con dispositivos Android 4.0 y superiores? ¿Hay una manera de utilizar ffmpeg para lograr esto? Soy nuevo en este dominio y todavía estoy haciendo investigación.


Años más tarde editar:
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 versiones más recientes de android son más capaces en esto con el sdk predeterminado?

  • Cómo agregar un átomo MOOV en un archivo de video mp4
  • Cómo jugar video .mp4 en videoview en android?
  • Cómo combinar múltiples archivos .mp4 en .mp4 simple ffmpeg android
  • Error de MediaMuxer "Error al detener el muxer"
  • Cómo subir un video desde un teléfono Android (como Android) mientras se está grabando
  • Android no puede reproducir vídeo H264 / AAC
  • Android MediaCodec: Reduce el tamaño del video mp4
  • Android: guarda una secuencia rtsp (h264) en un archivo mp4
  • 4 Solutions collect form web for “Adición de mapa de bits de marca de agua en video en android: MediaMuxer de 4.3 o ffmpeg”

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

    P.ej

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

    Acima del comando añade sobreimpresión logo.png en el archivo de vídeo input.avi en la esquina inferior izquierda.

    Más información sobre los filtros está disponible en la siguiente página web,

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

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

    Espero haber entendido su pregunta correctamente y esto ayuda.

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

    Tiene funcionalidad de transcodificación \ remuxing como clase MediaComposer y varios efectos de muestra como JpegSubstituteEffect – muestra cómo sustituir el marco de vídeo por una imagen de archivo jpg y TextOverlayEffect a superposición de texto en el marco de vídeo, etc Podría ser fácilmente mejorado a efecto de marca de agua

    Introduzca aquí la descripción de la imagen

    Si necesitas hacer esto sin ffmpeg en el dispositivo Android:

    Comienza desde: https://github.com/google/grafika

    La respuesta a tu pregunta entre ejemplos de Play video ( PlayMovieActivity.java ) y Record Gl App ( RecordFBOActivity.java ) .

    Pasos:

    1. Configurar mInputWindowSurface como superficie de entrada del codificador de vídeo.

    2. Decodificar el marco de la secuencia de vídeo utilizando MoviePlayer como textura de vídeo (externa).

    3. Dibuja esta textura de vídeo en Surface.

    4. Dibujar marca de agua en la misma superficie sobre la textura de vídeo.

    5. Notificar a MediaCodec que la superficie está lista para la codificación
      ( mVideoEncoder.frameAvailableSoon();, mInputWindowSurface.setPresentationTime(timeStampNanos); ) … goto paso 2 .

    No olvide ajustar la velocidad de decodificación. Sólo eliminar SpeedControlCallback que en el ejemplo establecido para descifrar 60 FPS de vídeo.

    Ventajas de esta manera:

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

    2. Puede cambiar la velocidad de bits del vídeo de resultado.

    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 recomienda el uso -strict -2 para permitir el uso de códecs experimentales. Sin la inclusión, la respuesta aceptada anterior no funciona.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.