日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android同屏或摄像头RTMP推送常用的数据接口设计探讨

發布時間:2025/3/12 Android 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android同屏或摄像头RTMP推送常用的数据接口设计探讨 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

好多開發者在調用Android平臺RTMP推送或輕量級RTSP服務接口時,采集到的video數據類型多樣化,如420sp、I420、yv12、nv21、rgb的,還有的拿到的圖像是倒置的,如果開發者在上層轉換后,傳到底層編碼處理,無疑加大了上層處理負擔,而且容易因為低效率影響體驗,本文以大牛直播SDK的Android平臺RTMP推送SDK編碼前video數據對接接口為例,看看常用的數據格式有哪些,相關資料,可參考 Github:

1.?Android攝像頭前后camera通過OnPreviewFrame()回調的數據接口:

Android自帶的camera攝像頭數據對接是最基礎的,需要考慮的是攝像頭方向問題,比如橫屏、豎屏、還有部分定制設備home鍵在左側的情況,相對來說處理比較簡單,直接上接口,不再贅述。

@Overridepublic void onPreviewFrame(byte[] data, Camera camera) {frameCount++;if (frameCount % 3000 == 0) {Log.i("OnPre", "gc+");System.gc();Log.i("OnPre", "gc-");}if (data == null) {Parameters params = camera.getParameters();Size size = params.getPreviewSize();int bufferSize = (((size.width | 0x1f) + 1) * size.height * ImageFormat.getBitsPerPixel(params.getPreviewFormat())) / 8;camera.addCallbackBuffer(new byte[bufferSize]);} else {if (isRTSPPublisherRunning || isPushingRtmp || isRecording || isPushingRtsp) {libPublisher.SmartPublisherOnCaptureVideoData(publisherHandle, data, data.length, currentCameraType, currentOrigentation);}camera.addCallbackBuffer(data);}}

?對應接口定義:

/*** Set live video data(no encoded data).** @param cameraType: CAMERA_FACING_BACK with 0, CAMERA_FACING_FRONT with 1*?* @param curOrg:* PORTRAIT = 1;????//豎屏* LANDSCAPE = 2;????//橫屏 home鍵在右邊的情況* LANDSCAPE_LEFT_HOME_KEY = 3; //橫屏 home鍵在左邊的情況** @return {0} if successful*/public native int SmartPublisherOnCaptureVideoData(long handle, byte[] data, int len, int cameraType, int curOrg);

2. 部分定制設備,只支持YV12的數據:

一般用于第三方攝像頭對接之用,第三方攝像頭,以YV12和NV21居多,部分需要旋轉。

????/*** YV12數據接口** @param data: YV12 data** @param width: 圖像寬** @param height: 圖像高** @param y_stride: ?y面步長** @param v_stride: v面步長** @param u_stride: u面步長** rotation_degree: 順時針旋轉, 必須是0, 90, 180, 270** @return {0} if successful*/public native int SmartPublisherOnYV12Data(long handle, byte[] data, int width, int height, int y_stride, ?int v_stride, int u_stride, int rotation_degree);

3. 支持NV21數據接口:

nv21數據接口,除了用于常規的camera數據接入外,部分定制攝像頭出來的數據發生翻轉,這個接口也支持。

????/*** NV21數據接口** @param data: nv21 data** @param len: data length** @param width: 圖像寬** @param height: 圖像高** @param y_stride: ?y面步長** @param uv_stride: ?uv面步長** rotation_degree: 順時針旋轉, 必須是0, 90, 180, 270** @return {0} if successful*/public native int SmartPublisherOnNV21Data(long handle, byte[] data, int len, int width, int height, int y_stride, ?int uv_stride, int rotation_degree);/*** NV21數據接口** @param data: nv21 data** @param len: data length** @param width: 圖像寬** @param height: 圖像高** @param y_stride: ?y面步長** @param uv_stride: ?uv面步長** rotation_degree: 順時針旋轉, 必須是0, 90, 180, 270** @param ?is_vertical_flip: 是否垂直翻轉, 0不翻轉, 1翻轉** @param ?is_horizontal_flip:是否水平翻轉, 0不翻轉, 1翻轉** @return {0} if successful*/public native int SmartPublisherOnNV21DataV2(long handle, byte[] data, int len, int width, int height, int y_stride, ?int uv_stride, int rotation_degree,int is_vertical_flip, int is_horizontal_flip);

4. 支持YUV數據接入:

支持標準的I420數據接口對接。

????/*** Set live video data(no encoded data).** @param data: I420 data*?* @param len: I420 data length*?* @param yStride: y stride*?* @param uStride: u stride*?* @param vStride: v stride** @return {0} if successful*/public native int SmartPublisherOnCaptureVideoI420Data(long handle, ?byte[] data, int len, int yStride, int uStride, int vStride);


5. 支持RGBA數據接入(支持裁剪后數據接入,主要用于同屏場景):

RGBA的主要用于屏幕共享場景下,為了便于推送屏幕部分區域,我們友好的加了裁剪參數。

????/*** Set live video data(no encoded data).** @param data: RGBA data*?* @param rowStride: stride information*?* @param width: width*?* @param height: height** @return {0} if successful*/public native int SmartPublisherOnCaptureVideoRGBAData(long handle, ?ByteBuffer data, int rowStride, int width, int height);/*** 投遞裁剪過的RGBA數據** @param data: RGBA data** @param rowStride: stride information** @param width: width** @param height: height** @param clipedLeft: 左; ?clipedTop: 上; clipedwidth: 裁剪后的寬; clipedHeight: 裁剪后的高; 確保傳下去裁剪后的寬、高均為偶數** @return {0} if successful*/public native int SmartPublisherOnCaptureVideoClipedRGBAData(long handle, ?ByteBuffer data, int rowStride, int width, int height, int clipedLeft, int clipedTop, int clipedWidth, int clipedHeight);/*** Set live video data(no encoded data).** @param data: ABGR flip vertical(垂直翻轉) data** @param rowStride: stride information** @param width: width** @param height: height** @return {0} if successful*/public native int SmartPublisherOnCaptureVideoABGRFlipVerticalData(long handle, ?ByteBuffer data, int rowStride, int width, int height);

6. 支持RGB565數據接入(主要用于同屏場景):

同屏場景居多。

????/*** Set live video data(no encoded data).** @param data: RGB565 data** @param row_stride: stride information** @param width: width** @param height: height** @return {0} if successful*/public native int SmartPublisherOnCaptureVideoRGB565Data(long handle,ByteBuffer data, int row_stride, int width, int height);

7.?支持camera數據接入(主要用于camera2接口對接):
? ? 為了更高效率的兼容camera2數據采集模式。

/** ?專門為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);

總結:

以上僅是Android編碼前video數據接口對接分享,感興趣的開發者可酌情參考,由此可見,部分公司或開發者提到,一個Android平臺的RTMP推送模塊只要幾個接口,化繁為簡幾乎是不可能的,除非。。

總結

以上是生活随笔為你收集整理的Android同屏或摄像头RTMP推送常用的数据接口设计探讨的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。