Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何实现RTMP推送Android Camera2数据

如何实现RTMP推送Android Camera2数据

原创
作者头像
音视频牛哥
修改于 2020-04-07 03:25:06
修改于 2020-04-07 03:25:06
1.6K00
代码可运行
举报
运行总次数:0
代码可运行

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之前可以想象成用管道方式连接, 如下图:

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

下面是 camera2包中的主要类:

​其中 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() 完成数据传送,底层进行二次处理后,编码后传输即可。

接口描述:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	/*
	*  专门为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);

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    private class OnImageAvailableListenerImpl implements ImageReader.OnImageAvailableListener {

        @Override
        public void onImageAvailable(ImageReader reader) {
            Image image = reader.acquireLatestImage();

            if ( image != null )
            {
                if ( camera2Listener != null )
                {
                    camera2Listener.onCameraImageData(image);
                }

                image.close();
            }
        }
    }

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    @Override
    public 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调用流程,感兴趣的可以自行学习。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android平台实现Camera2数据推送到RTMP服务器
在Google 推出Android 5.0的时候, Android Camera API 版本升级到了API2(android.hardware.camera2), 之前使用的API1(android.hardware.camera)就被标为 Deprecated 了。
音视频牛哥
2021/03/02
1.5K0
如何实现Android平台GB28181设备对接Camera2数据
在写如何实现Android平台GB28181设备对接Camera2数据说明之前,我在前两年的blog就有针对camera2的RTMP直播推送模块做过技术分享:
音视频牛哥
2022/09/27
7650
如何实现Android平台GB28181设备对接Camera2数据
Android Camera2 与 Camera API技术探究和RAW数据采集
Android Camera2 是 Android 系统中用于相机操作的一套高级应用程序接口(API),它取代了之前的 Camera API。以下是关于 Android Camera2 的一些主要信息:
音视频牛哥
2024/10/01
1K0
Android摄像头采集选Camera1还是Camera2?
好多开发者纠结,Android平台采集摄像头,到底是用Camera1还是Camera2?实际上,Camera1和Camera2分别对应相机API1和相机API2。Android 5.0开始,已经弃用了Camera API1,新平台重点开发Camera API2,Camera API1 会逐渐被淘汰。Camera API2 框架为应用提供更接近底层的相机控件,包括高效的零复制连拍/视频流以及曝光、增益、白平衡增益、颜色转换、去噪、锐化等方面的每帧控件。
音视频牛哥
2024/08/08
5680
Android摄像头采集选Camera1还是Camera2?
Android平台如何采集摄像头数据并实现低延迟RTMP推送
2015年,我们发布了第一版的Android平台RTMP摄像头|屏幕直播推送模块,几经迭代,功能强大、性能优异,在前些年几乎已经是业内延迟体验和口碑最好的RTMP模块了(毫秒级延迟,低延迟模式下100多毫秒)。鉴于我们侧重于传统行业音视频直播方案,我们从以下几个维度,介绍下Android平台RTMP摄像头采集推送模块的使用场景。
音视频牛哥
2024/11/20
6290
Android平台GB28181设备接入模块摄像头采集方向不对怎么办?
我们在做Android平台GB28181设备接入模块的时候,有开发者提到这样的诉求:他们的智能头盔、执法记录仪等设备,采集到的图像,是旋转了90、180甚至270°的,设备本身无法针对图像做翻转或者旋转操作,问我们这种情况下需要如何处理?
音视频牛哥
2022/12/17
5680
Android平台GB28181设备接入模块摄像头采集方向不对怎么办?
Android平台GB28181设备接入模块如何实现实时视频和本地录像双码流编码
我们在做Android平台GB28181设备接入模块的时候,遇到这样的场景,比如执法记录仪或智慧工地等场景下,由于GB28181设备接入模块,注册到国标平台后,平时只是心跳保持,或还有实时位置订阅,查看视频的时候,是按需看,而且有时候,网络环境并不是太好,所以,催生了这样一个诉求:部分开发者希望能本地录像的时候,录制高分辨率(比如1920*1080),国标平台侧发起实时视频查看请求的时候,上传低分辨率(如1280*720)数据,有点类似于IPC的主码流和子码流。
音视频牛哥
2023/05/23
5660
Android平台GB28181设备接入模块如何实现实时视频和本地录像双码流编码
Android平台RTMP推送模块如何对接NV21、YV12、RGB、YUV等编码前数据
我们在对接Android平台摄像头或者屏幕采集、编码打包推送场景的时候,随着采集设备的不同,出来的数据也是多样化的,比如NV21、YV12、RGB、YUV等,更有图像数据甚至是翻转或者倒置的,如果上层处理,效率低下,本篇文章主要介绍下常用的编码前数据接口。相关资料或版本测试,也可联系大牛直播SDK(官方)
音视频牛哥
2021/11/12
6940
Android平台GB28181设备接入模块如何对接NV21、YV12、RGB、YUV等外部数据
我们在对接Android平台GB28181设备接入模块的开发者时,遇到这样的场景,除了Android设备(如执法记录仪、智能安全帽等)自带的camera或camera2前后摄像头数据外,还有些场景是需要外部编码前或编码后数据,比如对接OTG类似的外置数据源,如NV12、NV21、YV12、RGB或YUV等格式,这里做个简单的汇总。
音视频牛哥
2023/05/25
3710
Android平台GB28181设备接入模块如何对接NV21、YV12、RGB、YUV等外部数据
Android平台RTMP推流或轻量级RTSP服务(同屏或摄像头)编码前数据接入类型总结
很多开发者在做Android平台RTMP推流或轻量级RTSP服务(摄像头或同屏)时,总感觉接口不够用,以大牛直播SDK为例 (Github) 我们来总结下,我们常规需要支持的编码前音视频数据有哪些类型:
音视频牛哥
2020/10/13
8840
Android平台GB28181设备接入模块之按需编码和双码流编码
我们在做执法记录仪或指挥系统的时候,会遇到这样的情况,大多场景下,我们是不需要把设备端的数据,实时传给国标平台端的,默认只需要本地录像留底,如果指挥中心需要查看前端设备实时数据的时候,发起视频播放请求,设备侧再推送数据到平台侧,如需语音广播,只要发起语音广播(broadcast),GB28181设备接入侧响应,然后发送INVITE请求等,完成语音广播和语音对讲。此外,考虑到设备侧的上行带宽瓶颈,一般来说,本地录像需要尽可能清晰(比如1920*1080分辨率),上传视频数据,传输1280*720分辨率,也就是我们传统意义提到的双码流编码。
音视频牛哥
2023/07/25
5030
Android平台GB28181设备接入模块之按需编码和双码流编码
Android Camera开发序列:Camera2 API 的简单描述和调用(预览、拍照、录像
Android 5.1 以后,添加了Camera2 的API,能够满足更多操纵camera的场景。当然,相对应camera1的调用,也变的复杂一点。
小驰行动派
2021/04/19
2.2K0
TRTCSDK自定义采集YUV视频通话
摄像头通话功能,是TRTCSDK对系统摄像头进行了封装,采集摄像头数据,编码传输通话。
ppchao
2020/11/13
2.9K0
TRTCSDK自定义采集YUV视频通话
Android native层实现MediaCodec编码H264/HEVC
Android平台在上层实现mediacodec的编码,资料泛滥,已经不再是难事,今天给大家介绍下,如何在Android native层实现MediaCodec编码H264/HEVC,网上千篇一律的接口说明,这里不再赘述,本文主要介绍下,一些需要注意的点,权当抛砖引玉,相关设计界面如下:
音视频牛哥
2022/08/29
1.4K0
TRTCSDK自定义采集YUV视频通话
摄像头通话功能,是TRTCSDK对系统摄像头进行了封装,采集摄像头数据,编码传输通话。
ppchao
2020/12/02
3.3K0
TRTCSDK自定义采集YUV视频通话
Android多媒体之Camera2的相关操作
零、前言 Android 5.0+ (API 21) Camera过时.png ---->[源码里让我们用camera2] * @deprecated We recommend using t
张风捷特烈
2019/02/25
3.1K0
Android多媒体之Camera2的相关操作
关于Camera性能优化的一些建议
上一篇文章主要介绍Camera的基本功能,我们在做相机应用的时候,除了相机的基本功能,还有一个非常重要的点,就是性能不能查,有几个方面:预览不能卡顿、拍照速度要快、录制视频不能卡。
马上就说
2022/05/25
2.8K0
关于Camera性能优化的一些建议
2016级android在线测试15-图像 camera2
1. ImageView类用于显示各种图像,例如:图标、图片,下面对于ImageView类加载图片方法的描述错误的是()
达达前端
2022/04/29
6620
Android Camera2详解
Camera API2是Google从Android5.0开始推出的配合HAL3使用的一套新架构,相比于API1,对应用层开发者而言开放了更多的自主控制权,主要特性包括:
雪月清
2020/06/23
2.9K0
Android Camera2
从 Android 5.0 开始,Google 引入了一套全新的相机框架 Camera2(android.hardware.camera2)并且废弃了旧的相机框架 Camera1(android.hardware.Camera)。作为一个专门从事相机应用开发的开发者来说,这一刻我等了太久了,Camera1 那寥寥无几的 API 和极差的灵活性早已不能满足日益复杂的相机功能开发。Camera2 的出现给相机应用程序带来了巨大的变革,因为它的目的是为了给应用层提供更多的相机控制权限,从而构建出更高质量的相机应用程序。本文是 Camera2 教程的开篇作,本章将介绍以下几个内容:
ppchao
2020/12/01
2.5K0
Android Camera2
推荐阅读
相关推荐
Android平台实现Camera2数据推送到RTMP服务器
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验