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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

如何实现RTMP推送Android Camera2数据

發(fā)布時間:2025/3/12 Android 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何实现RTMP推送Android Camera2数据 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Camera2簡介

在Google 推出Android 5.0的時候, Android Camera API 版本升級到了API2(android.hardware.camera2), 之前使用的API1(android.hardware.camera)就被標(biāo)為 Deprecated 了。

Camera API2相較于API1有很大不同, 并且API2是為了配合HAL3進(jìn)行使用的, API2有很多API1不支持的特性, 比如:

  • 更先進(jìn)的API架構(gòu);
  • 可以獲取更多的幀(預(yù)覽/拍照)信息以及手動控制每一幀的參數(shù);
  • 對Camera的控制更加完全(比如支持調(diào)整focus distance, 剪裁預(yù)覽/拍照圖片);
  • 支持更多圖片格式(yuv/raw)以及高速連拍等。
  • 在API架構(gòu)方面, Camera2和之前的Camera有很大區(qū)別, APP和底層Camera之前可以想象成用管道方式連接, 如下圖:

    這里引用了管道的概念將安卓設(shè)備和攝像頭之間聯(lián)通起來,系統(tǒng)向攝像頭發(fā)送 Capture 請求,而攝像頭會返回 CameraMetadata。這一切建立在一個叫作 CameraCaptureSession 的會話中。

    下面是 camera2包中的主要類:

    其中 CameraManager 是那個站在高處統(tǒng)管所有攝像投設(shè)備(CameraDevice)的管理者,而每個 CameraDevice 自己會負(fù)責(zé)建立 CameraCaptureSession 以及建立 CaptureRequest。

    CameraCharacteristics 是 CameraDevice 的屬性描述類,非要做個對比的話,那么它與原來的 CameraInfo 有相似性。

    Camera2 API調(diào)用基礎(chǔ)流程:

  • 通過context.getSystemService(Context.CAMERA_SERVICE) 獲取CameraManager;
  • 調(diào)用CameraManager .open()方法在回調(diào)中得到CameraDevice;
  • 通過CameraDevice.createCaptureSession() 在回調(diào)中獲取CameraCaptureSession;
  • 構(gòu)建CaptureRequest, 有三種模式可選 預(yù)覽/拍照/錄像.;
  • 通過 CameraCaptureSession發(fā)送CaptureRequest, capture表示只發(fā)一次請求, setRepeatingRequest表示不斷發(fā)送請求;
  • 拍照數(shù)據(jù)可以在ImageReader.OnImageAvailableListener回調(diào)中獲取, CaptureCallback中則可獲取拍照實際的參數(shù)和Camera當(dāng)前狀態(tài)。
  • 獲取數(shù)據(jù)后對接RTMP推送:

    通過OnImageAvailableListenerImpl 獲取到原始數(shù)據(jù),推送端以大牛直播SDK https://github.com/daniulive/SmarterStreaming/?的萬能推送接口為例,獲取數(shù)據(jù)后,調(diào)用SmartPublisherOnImageYUV420888() 完成數(shù)據(jù)傳送,底層進(jìn)行二次處理后,編碼后傳輸即可。

    接口描述:

    /** 專門為android.media.Image的android.graphics.ImageFormat.YUV_420_888格式提供的接口** @param width: 必須是8的倍數(shù)** @param height: 必須是8的倍數(shù)** @param crop_left: 剪切左上角水平坐標(biāo), 一般根據(jù)android.media.Image.getCropRect() 填充** @param crop_top: 剪切左上角垂直坐標(biāo), 一般根據(jù)android.media.Image.getCropRect() 填充** @param crop_width: 必須是8的倍數(shù), 填0將忽略這個參數(shù), 一般根據(jù)android.media.Image.getCropRect() 填充** @param crop_height: 必須是8的倍數(shù), 填0將忽略這個參數(shù),一般根據(jù)android.media.Image.getCropRect() 填充** @param y_plane 對應(yīng)android.media.Image.Plane[0].getBuffer()** @param y_row_stride 對應(yīng)android.media.Image.Plane[0].getRowStride()** @param u_plane 對應(yīng)android.media.Image.Plane[1].getBuffer()** @param v_plane 對應(yīng)android.media.Image.Plane[2].getBuffer()** @param uv_row_stride 對應(yīng)android.media.Image.Plane[1].getRowStride()** @param uv_pixel_stride 對應(yīng)android.media.Image.Plane[1].getPixelStride()** @param rotation_degree: 順時針旋轉(zhuǎn), 必須是0, 90, 180, 270** @param is_vertical_flip: 是否垂直翻轉(zhuǎn), 0不翻轉(zhuǎn), 1翻轉(zhuǎn)** @param is_horizontal_flip:是否水平翻轉(zhuǎn), 0不翻轉(zhuǎn), 1翻轉(zhuǎn)** @param scale_width: 縮放寬,必須是8的倍數(shù), 0不縮放** @param scale_height: 縮放高, 必須是8的倍數(shù), 0不縮放** @param scale_filter_mode: 縮放質(zhì)量, 范圍必須是[1,3], 傳0使用默認(rèn)速度** @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);}}}}

    以上就是基礎(chǔ)的Android Camera2介紹,和RTMP調(diào)用流程,感興趣的可以自行學(xué)習(xí)。

    總結(jié)

    以上是生活随笔為你收集整理的如何实现RTMP推送Android Camera2数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 欧美日韩三级 | 国产在线视频卡一卡二 | 欧美xxxxbbbb | 一区二区伊人 | 韩国三色电费2024免费吗怎么看 | 国产精品久久久久久久久借妻 | 蜜臀在线播放 | 国产成人精品在线视频 | 亚洲精品乱码久久久久99 | 国产盗摄在线观看 | 亚洲永久| 国外成人免费视频 | 免费av手机在线观看 | 日本免费不卡一区二区 | 久久国产毛片 | 成人快手免费看片 | 国产亚洲欧美日韩精品一区二区三区 | 天堂网2020 | 麻豆回家视频区一区二 | 胖女人毛片 | 色狠狠一区二区 | 国产又粗又猛视频 | 国产福利在线观看 | 最全aⅴ番号库 | 黄页视频在线观看 | 天天干天天操天天拍 | 黄色网免费观看 | 激情福利| 日本不卡一区二区三区视频 | 天天色天天| 高跟鞋肉丝交足91 | 在线看的av | 免费黄色在线播放 | 色老大视频 | 亚洲激情成人 | 亚洲熟乱 | 久久久6| 老司机av导航 | 成年女人18级毛片毛片免费 | 国产一区999 | 涩涩屋视频 | 欧美三级一区二区 | 亚洲激情三区 | caoprom97 | 夜夜草视频 | 日韩成人一级片 | 日本久久久久 | 一级黄色欧美 | 亚洲三级在线免费观看 | 中文有码一区 | 在线看黄色网址 | 中文字幕一二三四区 | 日韩精品电影在线 | 日韩电影一区二区在线观看 | 久久3p | 美女一级黄色片 | 国产第一福利 | 三级国产在线 | 午夜神马影院 | 婷婷综合五月 | 亚洲伊人成人网 | 免费成人在线观看动漫 | 视频一区二区三区精品 | 亚洲欧美综合视频 | 国产伦精品一区二区三区精品 | 美女久久久久久久久久 | 超碰影院在线 | 日本高清黄色 | 黄色aa毛片 | 国产精品中文字幕在线 | 少妇高潮毛片色欲ava片 | 艳母动漫在线播放 | 婷婷开心激情 | 成人夜色视频 | 免费在线黄网 | 午夜久久久 | 国产一级片毛片 | 色猫咪av| 亚洲成人中文字幕 | 香蕉在线观看 | 三级av在线免费观看 | 性欧美1819性猛交 | 成人精品福利 | 色综合天天射 | 亚洲一区欧美 | 欧美在线a | 一个人在线观看免费视频www | 国产激情久久久久 | 中文字幕 视频一区 | 日韩在线综合 | 日本男男激情gay办公室 | 欧美色激情 | 911亚洲精品 | 白浆影院| 国产精品一区二区免费 | 亚洲三级在线看 | 丰满尤物白嫩啪啪少妇 | 亚洲插插插| 在线免费不卡视频 |