javaCV Android,流式传输到rtmp服务器时叠加的奇怪颜色

我想从android直播到facebook。 我能够调整现有的流式传输示例到FB。

第一步或多或少有效(音频仍然是一个问题,但不在她的范围内)。 我可以流到FB。

我现在想用透明的png图像覆盖流。

我在启动时创建一个FFmpegFrameFilter:

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(); } 

并在每个框架上执行以下操作:

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

问题是我不知道我应该使用哪种像素格式。 我的叠加图像有rgb颜色( https://postimg.org/image/f1ri3vj43/ )

使用上面的像素格式,我得到这样的东西: https : //postimg.org/image/45ha64q9z/

我很沮丧,因为我已经尝试了很多像素格式。 所有输出都不同,有时徽标会多次出现。

有没有办法找出我应该从avutil.java的可能性中选择哪一个?

编辑:您可以在https://github.com/y4nnick/android_streaming/blob/master/app/src/main/java/com/example/yannick/olay1/RecordActivity.java上find整个代码。

编辑:我已经尝试过以下格式:

 // 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 

我想到了:

  1. 通过运行找出Android摄像头支持的格式

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

    您将获得一个整数列表。 在我的案例17和842094169.我将使用842094169(YV12)。 所以通过调用将相机设置为相机

     mCamera.getParameters().setPreviewFormat(ImageFormat.YV12); 
  2. 转到https://developer.android.com/reference/android/graphics/ImageFormat.html并检查您的支持格式是如何准确定义的。 842094169是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. 转到http://img.androidcookie.com/android/ffmpeg-filters.html [logo];[in][logo]overlay=0:0:format=yuv420 [out]”,imageWidth, imageHeight);

  4. 在录制帧时设置正确的像素格式:

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

实际上,您必须将所有像素格式设置为相同。 搜索所有网站以find所有“组件”支持的格式有点棘手。

建议的替代方案是将YUV图像从相机转换为RGB图像。 请参阅在android中onPreviewFrame期间转换YUV-> RGB(image processing) – > YUV?

我没有尝试过,因为我教过这会慢,并尝试一个更简单的解决方案。