如何实现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不支持的特性, 比如:

  1. 更先进的API架构;
  2. 可以获取更多的帧(预览/拍照)信息以及手动控制每一帧的参数;
  3. 对Camera的控制更加完全(比如支持调整focus distance, 剪裁预览/拍照图片);
  4. 支持更多图片格式(yuv/raw)以及高速连拍等。

在API架构方面, Camera2和之前的Camera有很大区别, APP和底层Camera之前可以想象成用管道方式连接, 如下图:

fig.1

这里引用了管道的概念将安卓设备和摄像头之间联通起来,系统向摄像头发送 Capture 请求,而摄像头会返回 CameraMetadata。这一切建立在一个叫作 CameraCaptureSession 的会话中。

下面是 camera2包中的主要类:

fig.2

其中 CameraManager 是那个站在高处统管所有摄像投设备(CameraDevice)的管理者,而每个 CameraDevice 自己会负责建立 CameraCaptureSession 以及建立 CaptureRequest。

CameraCharacteristics 是 CameraDevice 的属性描述类,非要做个对比的话,那么它与原来的 CameraInfo 有相似性。

Camera2 API调用基础流程:

  1. 通过context.getSystemService(Context.CAMERA_SERVICE) 获取CameraManager;
  2. 调用CameraManager .open()方法在回调中得到CameraDevice;
  3. 通过CameraDevice.createCaptureSession() 在回调中获取CameraCaptureSession;
  4. 构建CaptureRequest, 有三种模式可选 预览/拍照/录像.;
  5. 通过 CameraCaptureSession发送CaptureRequest, capture表示只发一次请求, setRepeatingRequest表示不断发送请求;
  6. 拍照数据可以在ImageReader.OnImageAvailableListener回调中获取, CaptureCallback中则可获取拍照实际的参数和Camera当前状态。

获取数据后对接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调用流程,感兴趣的可以自行学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/553133.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android平台RTMP多实例推送的几种情况探讨

好多开发者提到,如何实现Android平台,多实例推送,多实例推送,有几种理解: 多路编码,多个实例分别推送到不同的RTMP URL(如Android采集板卡同时接2路出去);同一路编码&am…

雨林木风win11 64位全新专业版系统v2021.08

雨林木风win11 64位全新专业版系统v2021.08是目前非常火热的电脑操作系统,系统运行速度非常的快速,拥有稳定、安全、兼容性强等特点,多样化的服务可供你的使用,支持在线的升级,非常的便捷,可以提高系统的性…

面向内网无纸化会议/智慧教室/实时同屏,组播还是RTMP?

一、背景 为满足内网无纸化/电子教室等内网超低延迟需求,避免让用户配置单独的服务器,我们研发了轻量级RTSP服务开发包。 单播不再赘述,这里重点介绍下我们的组播技术方案: 组播解决的主要痛点是服务器部署和带宽占用问题&…

打印更无缝:微软改善Win11中通用打印体验

微软昨日透露,将会在 Windows 11 系统中改进打印体验。从下面的截图中可以看到,用户可以直接在设置应用中添加打印机。对于使用通用打印机驱动的打印机,微软增加了为打印作业添加密码的功能。 打印更无缝:微软改善Win11中通用打印…

Windows平台如何快速实现RTSP/RTMP直播播放

前段时间,我们在 https://blog.csdn.net/renhui1112/article/details/104143794 提到“RTSP播放器开发过程中需要考虑哪些关键因素”,本次主要介绍,如何调用SDK实现RTSP/RTMP播放能力。 本文以调用大牛直播SDK为例: demo说明 SD…

Windows平台RTSP播放器/RTMP播放器设计需要考虑的几个点

我们在实现Windows平台RTSP播放器或RTMP播放器的时候,需要考虑的点很多,比如多实例设计、多绘制模式兼容、软硬解码支持、快照、RTSP下TCP-UDP自动切换等,以下就其中几个方面,做个大概的探讨。 1. 视频绘制模式 我们在实现Windo…

网易邮箱大师如何定时发送 定时发送邮件方法步骤详解

网易邮箱大师是我们日常使用邮箱的最佳软件,不仅能批量登录邮件,还能定时发送邮件,可谓功能齐全,很多小伙伴不知道如何定时发送邮件,那么接下来小编说的这篇文章肯定会对你有帮助。 操作步骤如下: 1、打开…

Windows平台下如何实现Unity3D下的RTMP推送

好多开发者苦于很难在unity3d下实现RTMP直播推送,本次以大牛直播SDK(Github)的Windows平台RTMP推送模块(以推摄像头为例,如需推屏幕数据,设置相关参数即可)为例,介绍下unity3d的RTMP…

Android平台如何实现屏幕数据采集并推送至RTMP服务器

随着无纸化、智慧教室等场景的普及,好多企业或者开发者开始寻求更高效稳定低延迟的RTMP同屏方案,本文以大牛直播SDK(Github)的同屏demo(对应工程:SmartServicePublisherV2)为例,介绍下如何采集编码推送RTMP…

网易邮箱大师如何注册邮箱 注册邮箱方法步骤介绍

网易邮箱大师是款高效强大的全平台邮箱客户端,支持所有邮箱登录,功能强大,一个PC端就能登录多个邮箱,很多小伙伴不知道如何注册登录邮箱,那么就跟着小编一起来看看如何操作吧。 操作步骤如下: 1、打开网易…

D3D还是GDI? Windows平台播放RTSP或RTMP渲染模式比较

先说结论,Windows平台播放渲染这块,支持D3D的前提下,优先D3D,如果检测到不支持D3D,数据回调上来,GDI模式绘制。 相比GDI模式,D3D绘制更细腻,绘制效率更高,CPU占用低&…

Android投屏(屏幕共享)设计需要考虑的关键因素

许多开发者,在做智慧教室同屏、会议同屏之类的方案时,基于Andriod平台的采集,往往遇到各种各样的问题,以下就几个点,抛砖引玉: 1. 内网环境下,组播还是RTMP? 回答:这个…

微信公众号怎么给微店设置运费

微信小店想要设置运费,该怎么设置呢?今天我们就来看看使用微信公众号设置微店运费的教程。 1、在电脑登录你的微信公众号服务号,确保已经事先开通了微信小店功能 微信公众号怎么给微店设置运费? 2、点击左侧导航栏的微信小店,进去后点击…

RTSP/RTMP播放端录像不可忽视的几个设计要点

很多开发者提到,拉取的摄像机(一般RTSP流)或RTMP流,如果需要录制,需要考虑哪些因素,本文以大牛直播SDK的Windows平台拉流端录像为例(github),做个简单的介绍:…

海康摄像机rtsp地址格式(官方最新版)

★目前海康录像机、网络摄像机,网络球机的RTSP单播取流格式如下(车载录像机不支持RTSP取流): rtsp://用户名:密码IP:554/Streaming/Channels/101 →录像机示例: 取第1个通道的主码流预览 rtsp://admin:hik1234510.…

QQ邮箱怎么发送文件夹 怎样在QQ邮箱里发送压缩文件夹

有很多用户想要知道怎么样才能通过QQ邮箱来发送自己的一些文件压缩包,应该怎么操作呢?不要慌,现在小编就给大家分享一下,下面一起来学习操作步骤吧! 其实,无论何种邮箱都无法发送文件夹,都只能对文件进行操作。如果文…

时光手帐怎么修改作品 时光手帐修改作品封面方法

对于自己在时光手账Pro中的手账本封面是可以随时更改的。那么,怎么在时光手账Pro中更改自己手账封面?下面我使用苹果手机(安卓端操作方法一致)来分享一下具体的操作流程。 首先打开手机,点击进入时光手账Pro。 时光手帐怎么修改作品 时光手帐修改作品…

几款优秀的点播、RTSP/RTMP直播播放器介绍

1.ijkplayer 项目地址: https://github.com/Bilibili/ijkplayer 介绍:Ijkplayer 是Bilibili发布的基于 FFplay 的轻量级 Android/iOS 视频播放器。实现了跨平台功能,API 易于集成;编译配置可裁剪,方便控制安装包大小&…

Android平台RTMP推流或轻量级RTSP服务(摄像头或同屏)编码前数据接入类型总结

很多开发者在做Android平台RTMP推流或轻量级RTSP服务(摄像头或同屏)时,总感觉接口不够用,以大牛直播SDK为例 (Github) 我们来总结下,我们常规需要支持的编码前音视频数据有哪些类型: 1. Android摄像头前后…

作业帮口算批改怎么开 作业帮口算批改如何用

作业帮口算批改功能怎么用?作业帮最近全新改版的消息传的很火,新增了口算批改的功能,很吸引人。但是还有很多用户不是很清楚作业帮口算批改功能怎么用,下面是小编整理的关于作业帮口算批改功能怎么用的相关资讯,快来看看吧! 作业…