2016-09-13 6 views
6

私はアンドロイドからライブをFacebookにストリームしたいです。 FBにストリーミングするための既存の例を適用することができました。javaCV Android、rtmpサーバーにストリーミング中のオーバーレイ上の奇妙な色

その最初のステップは多かれ少なかれ動作します(音声はまだ問題ですが、彼女の範囲にはありません)。私はFBにストリームすることができます。

今、透明なPNG画像でストリームをオーバーレイしたいと思っています。私は次の操作を行い

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

、各フレーム上:

私がによって起動時にFFmpegFrameFilterを作成してい

filter.push(yuvImage); 

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

問題は、私がすべき私は見当がつかないことをどのピクセル形式ですつかいます。私はすでに多くのピクセルフォーマットを試してみましたので、私はかなりイライラしていますhttps://postimg.org/image/45ha64q9z/

: 私のオーバーレイ画像は、私がこのような何かを得る上のピクセルフォーマットで、RGB色(https://postimg.org/image/f1ri3vj43/

を持っています。すべてが異なる出力で、ロゴが複数回表示されることがあります。

avutil.javaの可能性の中からどれを選ぶべきかを知る方法はありますか?

EDIT:あなたはhttps://github.com/y4nnick/android_streaming/blob/master/app/src/main/java/com/example/yannick/olay1/RecordActivity.java

EDITに全体のコードを見つけることができます:

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

あなたは、フィルタの「フォーマット= RGB [アウト]」を指定するので、あなたが引くのフレームは、おそらくRGB24であることを行っているので、私はAV_PIX_FMT_RGB24の代わりAV_PIX_FMT_NV21を試してみました。 –

+0

ご協力ありがとうございます。残念ながら私はロゴを赤い色合いで3回並べています。 https://postimg.org/image/he7rq0pev/。 – schw4ndi

+0

AV_PIX_FMT_BGR24で私はこれを得る:https://postimg.org/image/bf08l4egh/。色は今ですが、私はロゴの3つを取得し、元のcamview ist黒/白。私は、フレーム、またはFFmpegFrameRecorder上のピクセル形式のチャネル番号を変更する必要がありますか? – schw4ndi

答えて

1

が、私はそれを考え出した:

  1. フォーマットした見つける私が出回っ次の形式を試してみましたあなたのアンドロイドカメラは走ることでサポートします

    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)と一緒に行きます。だから、後藤https://developer.android.com/reference/android/graphics/ImageFormat.html

    mCamera.getParameters().setPreviewFormat(ImageFormat.YV12); 
    
  2. を呼び出すことによって、それにカメラを設定し、サポートされているフォーマットが正確に定義されているか確認してください。 842094169は後藤https://ffmpeg.org/ffmpeg-filters.html#overlay-1YV12 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. であり、あなたが使用するようにフィルタをチェックし、鉱山は、オーバーレイフィルタです。このフィルタは 'format'というパラメータを提供し、カメラから取得する最も近い(YV12はリストにない)に設定します。私の場合は「yuv420」。 フィルタは次のようになります。フレームを記録しながら

    filter = new FFmpegFrameFilter("movie="+path+"/image.png [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); 
    } 
    

をあなたが同じにすべてのあなたのpixelformatsを設定する必要があります。あなたのすべてのコンポーネントがサポートするフォーマットを見つけるためにすべてのサイトをスローするのはちょっと難しいです。

代わりに、YUVイメージをカメラからRGBイメージに変換することをお勧めします。 Converting YUV->RGB(Image processing)->YUV during onPreviewFrame in android?

これを試していないのは、これを遅らせてよりシンプルな解決策を最初に試みたからです。

関連する問題