EasyPusher Android如何在後臺採集視訊並上傳?
阿新 • • 發佈:2019-02-05
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裡實現建立攝像頭、啟動預覽等操作。
…