JavaCV Android, Colores extraños en la superposición mientras se transmite al servidor rtmp

Quiero transmitir al facebook en vivo desde android. Pude adaptar un ejemplo existente para la transmisión a FB.

Ese primer paso más o menos funciona (el audio sigue siendo un problema, pero no en el ámbito de su). Puedo transmitir a FB.

Ahora quiero superponer el flujo con una imagen png transparente.

Estoy creando un FFmpegFrameFilter al iniciar por:

try{ filter = new FFmpegFrameFilter("movie="+path+"/image.png [logo];[in][logo]overlay=0:0:format=rgb [out]",imageWidth, imageHeight); filter.start(); }catch (FrameFilter.Exception e){ Log.e(CLASS_LABEL,"Error while starting filter: "+e.getMessage()); e.printStackTrace(); } 

Y en cada marco hago lo siguiente:

 filter.push(yuvImage); Frame frame; while ((frame = filter.pull()) != null) { recorder.record(frame,avutil.AV_PIX_FMT_NV21); } 

El problema es que no tengo idea de qué formato de píxel debo usar. Mi imagen de superposición tiene colores rgb ( https://postimg.org/image/f1ri3vj43/ )

Con el formato de píxeles anterior obtengo algo como esto: https://postimg.org/image/45ha64q9z/

Estoy bastante frustrado ya que ya probé muchos formatos de píxeles. Todos con una salida diferente, a veces el logotipo aparece varias veces.

¿Hay una manera de averiguar cuál debería elegir entre las posibilidades de avutil.java?

EDIT: Puede encontrar el código completo en https://github.com/y4nnick/android_streaming/blob/master/app/src/main/java/com/example/yannick/olay1/RecordActivity.java

EDIT: Ya he probado los siguientes formatos:

 // AV_PIX_FMT_ARGB --> 4 at once, all black/white // AV_PIX_FMT_0RGB --> 4 at once, all black/white // AV_PIX_FMT_BGR8 --> 1 a bit to big, strange colors // AV_PIX_FMT_BGR4_BYTE --> 1 a bit to big, stranger blue tint // AV_PIX_FMT_YUVA422P_LIBAV --> error: Cannot initialize the conversion context. // AV_PIX_FMT_FLAG_ALPHA --> error: Cannot initialize the conversion context. // AV_PIX_FMT_FLAG_PLANAR --> error: Cannot initialize the conversion context. // AV_PIX_FMT_RGB4 --> error: Cannot initialize the conversion context. // AV_PIX_FMT_RGB32_1 --> 4 at a time, all black/white // AV_PIX_FMT_0BGR --> 4 at a time, all black/white // AV_PIX_FMT_YVYU422 --> 2 side by side, gruen, purple tint // AV_PIX_FMT_YUVJ422P --> Fatal signal 11 (SIGSEGV) at 0x61f7xf000 (code=1), thread 18401 (e.yannick.olay1) // AV_PIX_FMT_BAYER_BGGR8 --> 1 a bit to big, black/white // AV_PIX_FMT_BAYER_GBRG8 --> 1 a bit to big, black/white // AV_PIX_FMT_FLAG_RGB --> 2 a bit to big, black/white // AV_PIX_FMT_RGB555LE --> 2 a bit to big, strange colors // AV_PIX_FMT_RGB555BE --> 2 a bit to big, strange colors // AV_PIX_FMT_RGB555 --> 2 a bit to big, strange colors // AV_PIX_FMT_RGB4_BYTE --> 1 a bit to big, orange tint // AV_PIX_FMT_RGBA64 --> 8 side by side, black/white // AV_PIX_FMT_RGB24 --> 3 side by side, red tint 

One Solution collect form web for “JavaCV Android, Colores extraños en la superposición mientras se transmite al servidor rtmp”

Me lo imaginé:

  1. Averigüe qué formatos soporta su cámara Android mediante la ejecución

     mCamera = Camera.open(); Camera.Parameters params = mCamera.getParameters(); for(int i: params.getSupportedPreviewFormats()) { Log.e(TAG, "preview format supported are = "+i); } 

    Obtendrá una lista de enteros. En mi caso 17 y 842094169. Voy a ir con 842094169 (YV12). Así que ajuste su cámara a eso llamando

     mCamera.getParameters().setPreviewFormat(ImageFormat.YV12); 
  2. Vaya a https://developer.android.com/reference/android/graphics/ImageFormat.html y compruebe cómo se definen exactamente los formatos compatibles. 842094169 es YV12 is a 4:2:0 YCrCb planar format comprised of a WxH Y plane followed by (W/2) x (H/2) Cr and Cb planes.

  3. Vaya a https://ffmpeg.org/ffmpeg-filters.html#overlay-1 y compruebe el filtro que desea usar, el mío es el filtro de superposición. Este filtro proporciona un parámetro llamado 'formato', establezca en el más cercano (YV12 no está en la lista) que obtiene de su cámara. En mi caso 'yuv420'. El filtro ahora se ve así:

     filter = new FFmpegFrameFilter("movie="+path+"/image.png [logo];[in][logo]overlay=0:0:format=yuv420 [out]",imageWidth, imageHeight); 
  4. Establecer el formato de píxeles correcto durante la grabación del fotograma:

     Frame frame; while ((frame = filter.pull()) != null) { Log.i(LOG_TAG,"In record-pull"); recorder.record(frame,avutil.AV_PIX_FMT_YUV420P); } 

De hecho usted debe fijar todos sus pixelformats a iguales. Es un poco difícil de buscar echar todos los sitios para encontrar un formato que todos sus "componentes" de apoyo.

Una alternativa sugerida sería convertir la imagen YUV de la cámara a una imagen RGB. Consulte Conversión de YUV-> RGB (procesamiento de imágenes) -> YUV durante onPreviewFrame en android?

No lo intenté porque enseñé que esto sería lento y probado una solución más simple primero.

  • Construyendo FFMPEG con librtmp para android
  • La forma correcta de hacer streaming RTMP multiplataforma / reproducir aplicaciones. Phonegap livu plugin?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.