1. 程式人生 > >EasyPusher Android如何在後臺採集視訊並上傳?

EasyPusher Android如何在後臺採集視訊並上傳?

EasyPusher Android是使用攝像頭採集視訊資料,並通過MediaCodec進行H264編碼,之後打包成RTSP格式並上傳的。

大家知道Android 的Camera是通過回撥來獲取YUV資料的,要想獲取到回撥資料,需要給Camera一個有效的Surface物件。通常我們用SurfaceView或者TextureView來提供這個surface。那如果app跑到後臺時,這個Surface就會被destory掉,這時候攝像頭就不再回調資料了。那整個推送過程就會停止。

那EasyPusher如何實現在“後臺”繼續推送呢?實際上我們藉助了懸浮視窗來建立這樣一個Surface供Camera使用。其實這裡並非真正的後臺,因為是有一個可見的view的。為了看起來更像是“後臺”,那我們可以把這個view 的尺寸設定為1*1(經測試,surfaceview設定為0*0時,其surface不會被create出來),這樣使用者實際上是看不到的,這樣就達到了“後臺”的效果。

首先我們建立一個Service,在onCreate裡,我們建立一個SurfaceView,並使用WindowsManager將它新增到Windows裡。這裡需要注意的是,因為我們要建立懸浮框,需要設定layoutParam引數為
TYPE_SYSTEM_OVERLAY,以保證其不依附於Activity.
關鍵程式碼如下:

    // Create new SurfaceView, set its size to 1x1, move it to the top left
    // corner and set this service as a callback
    mWindowManager = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
    mOutComeVideoView = new SurfaceView(this);


    WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(1, 1, WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
            WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, PixelFormat.TRANSLUCENT);
    layoutParams.gravity = Gravity.LEFT | Gravity.TOP;
    mWindowManager.addView(mOutComeVideoView, layoutParams);
    mOutComeVideoView.getHolder().addCallback(this);

// 在Callback裡實現建立攝像頭、啟動預覽等操作。