如何实现RTMP推送Android Camera2数据
Camera2簡介
在Google 推出Android 5.0的時候, Android Camera API 版本升級到了API2(android.hardware.camera2), 之前使用的API1(android.hardware.camera)就被標為 Deprecated 了。
Camera API2相較于API1有很大不同, 并且API2是為了配合HAL3進行使用的, API2有很多API1不支持的特性, 比如:
在API架構方面, Camera2和之前的Camera有很大區別, APP和底層Camera之前可以想象成用管道方式連接, 如下圖:
這里引用了管道的概念將安卓設備和攝像頭之間聯通起來,系統向攝像頭發送 Capture 請求,而攝像頭會返回 CameraMetadata。這一切建立在一個叫作 CameraCaptureSession 的會話中。
下面是 camera2包中的主要類:
其中 CameraManager 是那個站在高處統管所有攝像投設備(CameraDevice)的管理者,而每個 CameraDevice 自己會負責建立 CameraCaptureSession 以及建立 CaptureRequest。
CameraCharacteristics 是 CameraDevice 的屬性描述類,非要做個對比的話,那么它與原來的 CameraInfo 有相似性。
Camera2 API調用基礎流程:
獲取數據后對接RTMP推送:
通過OnImageAvailableListenerImpl 獲取到原始數據,推送端以大牛直播SDK https://github.com/daniulive/SmarterStreaming/?的萬能推送接口為例,獲取數據后,調用SmartPublisherOnImageYUV420888() 完成數據傳送,底層進行二次處理后,編碼后傳輸即可。
接口描述:
/** 專門為android.media.Image的android.graphics.ImageFormat.YUV_420_888格式提供的接口** @param width: 必須是8的倍數** @param height: 必須是8的倍數** @param crop_left: 剪切左上角水平坐標, 一般根據android.media.Image.getCropRect() 填充** @param crop_top: 剪切左上角垂直坐標, 一般根據android.media.Image.getCropRect() 填充** @param crop_width: 必須是8的倍數, 填0將忽略這個參數, 一般根據android.media.Image.getCropRect() 填充** @param crop_height: 必須是8的倍數, 填0將忽略這個參數,一般根據android.media.Image.getCropRect() 填充** @param y_plane 對應android.media.Image.Plane[0].getBuffer()** @param y_row_stride 對應android.media.Image.Plane[0].getRowStride()** @param u_plane 對應android.media.Image.Plane[1].getBuffer()** @param v_plane 對應android.media.Image.Plane[2].getBuffer()** @param uv_row_stride 對應android.media.Image.Plane[1].getRowStride()** @param uv_pixel_stride 對應android.media.Image.Plane[1].getPixelStride()** @param rotation_degree: 順時針旋轉, 必須是0, 90, 180, 270** @param is_vertical_flip: 是否垂直翻轉, 0不翻轉, 1翻轉** @param is_horizontal_flip:是否水平翻轉, 0不翻轉, 1翻轉** @param scale_width: 縮放寬,必須是8的倍數, 0不縮放** @param scale_height: 縮放高, 必須是8的倍數, 0不縮放** @param scale_filter_mode: 縮放質量, 范圍必須是[1,3], 傳0使用默認速度** @return {0} if successful*/public native int SmartPublisherOnImageYUV420888(long handle, int width, int height,int crop_left, int crop_top, int crop_width, int crop_height,ByteBuffer y_plane, int y_row_stride,ByteBuffer u_plane, ByteBuffer v_plane, int uv_row_stride, int uv_pixel_stride,int rotation_degree, int is_vertical_flip, int is_horizontal_flip,int scale_width, int scale_height, int scale_filter_mode); private class OnImageAvailableListenerImpl implements ImageReader.OnImageAvailableListener {@Overridepublic void onImageAvailable(ImageReader reader) {Image image = reader.acquireLatestImage();if ( image != null ){if ( camera2Listener != null ){camera2Listener.onCameraImageData(image);}image.close();}}} @Overridepublic void onCameraImageData(Image image) {synchronized(this){Rect crop_rect = image.getCropRect();if(isPushingRtmp || isRTSPPublisherRunning) {if(libPublisher != null){Image.Plane[] planes = image.getPlanes();// crop_rect.left, crop_rect.top, crop_rect.width(), crop_rect.height(),// 這里縮放寬高可以填0,使用原視視頻寬高都可以的libPublisher. SmartPublisherOnImageYUV420888(publisherHandle, image.getWidth(), image.getHeight(),crop_rect.left, crop_rect.top, crop_rect.width(), crop_rect.height(),planes[0].getBuffer(), planes[0].getRowStride(),planes[1].getBuffer(), planes[2].getBuffer(), planes[1].getRowStride(), planes[1].getPixelStride(),displayOrientation, 0, 0,videoWidth, videoHeight, 1);}}}}以上就是基礎的Android Camera2介紹,和RTMP調用流程,感興趣的可以自行學習。
總結
以上是生活随笔為你收集整理的如何实现RTMP推送Android Camera2数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【NLP】一行Python代码中自动化文
- 下一篇: USB外接摄像头不能用怎么办