Android平台GB28181接入端如何对接UVC摄像头?

我们在对接Android平台GB28181接入的时候,有公司提出这样的需求,除了采集执法记录仪摄像头自带的数据外,还想通过执法记录仪采集外接UVC摄像头。

 

实际上,这块对我们来说有点炒冷饭了,不算新的诉求。​大牛直播SDK​在2016年对接RTMP推送的时候,就有提供过YUV数据接口,供外部比如UVC Camera使用。

UVC Camera获取到YUV数据后,调用I420的接口编码打包RTMP推出去即可,废话不多说,上接口设计:

/*** 传I420图像接口** @param data: I420 data** @param width: 图像宽** @param height: 图像高** @param y_stride: y stride** @param u_stride: u stride** @param v_stride: v stride** @return {0} if successful*/public native int SmartPublisherOnCaptureVideoI420DataV2(long handle, byte[] data, int width, int height, int y_stride, int u_stride, int v_stride);

以经典的UVCCamera为例,我们看看它能提供的数据类型:

#define PIXEL_FORMAT_RAW 0    // same as PIXEL_FORMAT_YUV
#define PIXEL_FORMAT_YUV 1
#define PIXEL_FORMAT_NV12 2   // one format of YUV420SemiPlanar
#define PIXEL_FORMAT_NV21 3   // one format of YUV420SemiPlanar
#define PIXEL_FORMAT_RGB 4
#define PIXEL_FORMAT_RGB565 5
#define PIXEL_FORMAT_RGBX 6
#define PIXEL_FORMAT_BGR 7

比较常见的是PIXEL_FORMAT_YUV、PIXEL_FORMAT_NV12、或PIXEL_FORMAT_NV21,这里我们就以PIXEL_FORMAT_NV21为例,我们提供了ByteBuffer和byte数组两种类型的数据接口:

/*** 投递层NV21图像** @param index: 层索引, 必须大于等于0** @param left: 层叠加的左上角坐标, 对于第0层的话传0** @param top: 层叠加的左上角坐标, 对于第0层的话传0** @param y_plane: y平面图像数据** @param y_offset: 图像偏移, 这个主要目的是用来做clip的,一般传0** @param y_row_stride: stride information** @param uv_plane: uv平面图像数据** @param uv_offset: 图像偏移, 这个主要目的是用来做clip的,一般传0** @param uv_row_stride: stride information** @param width: width, 必须大于1, 且必须是偶数** @param height: height, 必须大于1, 且必须是偶数** @param  is_vertical_flip: 是否垂直翻转, 0不翻转, 1翻转** @param  is_horizontal_flip:是否水平翻转, 0不翻转, 1翻转** @param  scale_width: 缩放宽,必须是偶数, 0或负数不缩放** @param  scale_height: 缩放高, 必须是偶数, 0或负数不缩放** @param  scale_filter_mode: 缩放质量, 传0使用默认速度,可选等级范围是:[1,3],值越大缩放质量越好, 但速度越慢** @param  rotation_degree: 顺时针旋转, 必须是0, 90, 180, 270, 注意:旋转是在缩放, 垂直/水品反转之后再做, 请留意顺序** @return {0} if successful*/public native int PostLayerImageNV21ByteBuffer(long handle, int index, int left, int top,ByteBuffer y_plane, int y_offset, int y_row_stride,ByteBuffer uv_plane, int uv_offset, int uv_row_stride,int width, int height, int is_vertical_flip,  int is_horizontal_flip,int scale_width,  int scale_height, int scale_filter_mode,int rotation_degree);/*** 投递层NV21图像, 详细说明请参考PostLayerImageNV21ByteBuffer** @return {0} if successful*/public native int PostLayerImageNV21ByteArray(long handle, int index, int left, int top,byte[] y_plane, int y_offset, int y_row_stride,byte[] uv_plane, int uv_offset, int uv_row_stride,int width, int height, int is_vertical_flip,  int is_horizontal_flip,int scale_width,  int scale_height, int scale_filter_mode,int rotation_degree);

具体的参数,可参考SmartPublisherV2的DEMO,看看onPreviewFrame()里面,我们针对摄像头数据回调的处理:

int w = videoWidth, h = videoHeight;
int y_stride = videoWidth, uv_stride = videoWidth;
int y_offset = 0, uv_offset = videoWidth * videoHeight;
int is_vertical_flip = 0, is_horizontal_flip = 0;
int rotation_degree = 0;

如果有水平镜像问题,is_horizontal_flip传1,水平翻转下就好。

需要注意的是,UVC Camera采集的多大分辨率,就设置多大分辨率下去,如果需要缩放数据,调用native接口的时候,传递scale_width和scale_height下去,让底层缩放就好了,甚至如果摄像头角度不对,旋转下就好了,是的,接口就这么智能。

其他,GB28181的接口,本文就不再赘述了,之前已经提过多次,UVC Camera和执法记录仪自带的摄像头,就是数据源不同而已,其他信令交互和媒体传输并无差别。

 

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

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

相关文章

win10系统电脑wifi图标不见了的开启方法

很多的用户都习惯了在桌面右下方的小图标中设置网络,但是很多时候都遇到了图标不见了的情况,win10系统电脑wifi图标不见了怎么办呢?就此问题,今天就为你们带来了win10系统电脑wifi图标不见了的开启方法,一起看看吧。 w…

Android平台实现系统内录(捕获播放的音频)并推送RTMP服务技术方案探究

几年来,我们在做无纸化同屏或在线教育相关场景的时候,总是被一件事情困扰:如何实现Android平台的系统内录,并推送到其他播放端,常用的场景比如做无纸化会议或教育的时候,主讲人或老师需要放一个视频&#x…

windows10电脑无法连接到internet怎么解决

许多上网的小伙伴都不知道电脑无法连接到internet怎么办而导致电脑没法上网的问题,windows10电脑无法连接到internet怎么解决?就此问题,今天就专门为大家带来了电脑无法连接到internet解决方法,快来学习看看吧。 windows10电脑无法连接到int…

Android平台GB28181设备接入端PTZ对接详解

PTZCmd实现背景 上一篇blog“Android平台GB28181设备接入模块之球机/云台控制探究”谈到,Android平台做国标GB28181设备接入端的时候,PTZ控制要不要处理?如果处理,难度大不大? 首先说要不要处理:如果只是…

Win7笔记本查看无线网卡是否“支持的承载网络”的方法

如果你笔记本电脑无线网卡可以支持的承载网络,那么我们就可以将无线网卡开启wifi共享,不过我们要怎么查看呢?就此问题,下面小编介绍Win7笔记本查看无线网卡是否“支持的承载网络”的方法,一起来学习吧! Win7笔记本查看无线网卡是…

Android平台GB28181设备接入模块摄像头采集方向不对怎么办?

背景 我们在做Android平台GB28181设备接入模块的时候,有开发者提到这样的诉求:他们的智能头盔、执法记录仪等设备,采集到的图像,是旋转了90、180甚至270的,设备本身无法针对图像做翻转或者旋转操作,问我们…

Win7系统无法复制粘贴怎么解决

现在电脑已经成为了我们每天都要使用的工具,然而随着使用的时间越长,就越容易出现各种电脑问题,不管是多小的问题,都会影响我们使用电脑。Win7系统无法复制粘贴怎么解决?今天请跟小编一起来看看Win7系统的电脑突然无法…

Android平台GB28181设备接入模块分辨率发生变化怎么办?

技术背景 我们在做Android平台gb28181设备接入模块的时候,遇到这样的情况,比如横竖屏分辨率不锁定,采集摄像头的时候,可以实现,横屏状态采集横屏,竖屏状态采集竖屏,简单来说,横屏状…

如何查看Win11系统的版本号

北京时间6月24日的晚上,微软正式的发布了全新一代的操作系统——Windows11,很多朋友都想第一时间去尝尝鲜,Win11系统有很多版本号,为了深入了解自己系统,于是想要查看一下系统版本,这要怎么查看呢?接下来小…

Win11无法使用以太网怎么办 Win11无法连接网络怎么办

最近有不少Windows用户都将自己的电脑升级到了Windows11系统,但是不少用户在使用的时候也遇到了一些问题,例如有些用户升级后发现自己的以太网无法使用,这要怎么解决呢?下面小编就带着大家一起看看吧! 操作方法: 1、我们可以看…

Win11系统如何设置黑暗模式

微软已经正式的发布了Windows11操作系统,Win11采用的是全新的界面,开始菜单和图标的设计,现在,暗黑模式开始逐渐流行了,很多朋友对黑暗主题情有独钟,黑色的主题特别适合晚上使用电脑,Win11操作系…

RTSP、RTMP播放器拉到的视频图像角度不对怎么办?

我们在做RTSP、RTMP播放器的时候,遇到这样的诉求:特别是RTSP,有些摄像头安装可能倒置或者旋转了90亦或270,拉取到图像,势必需要对视频图像做一定的处理,确保显示正常。 为此,我们提供了以下接口…

Android平台GB28181设备接入端如何调节实时音量?

我们在对接Android平台GB28181设备接入端的时候,有开发者提出这样的疑惑,如何调整设备接入端的实时音量? 实际上,这块我们前几年在做RTMP直播推送模块的时候,已经发布了相关的接口,这里再回顾下&#xff1…

Win10系统如何查看声卡ID

在Win10系统的日常使用过程中,我们可能经常需要去查看电脑的声卡ID,但很多小伙伴都不知道要如何查看声卡ID,那么碰到这种情况时,Win10系统如何查看声卡ID呢?下面就和小编一起来看看Win10系统查看声卡ID的方法吧。 Win10系统如何查…

Win10系统如何退出桌面磁贴功能

桌面磁贴是Modern开始界面下的那些方格,但是很多小伙都用不太习惯却不知道如何去关闭这个功能,那么Win10系统如何退出桌面磁贴功能呢?就此问题,下面小编整理了Win10系统退出桌面磁贴功能的解决方法,一来看看解决办法吧。 Win10系…

【技术分享】如何实现功能完备性能优异的RTMP、RTSP播放器?

技术背景 这几年,我们对接了太多有RTSP或RTMP直播播放器诉求的开发者,他们当中除了寻求完整的解决方案的,还有些是技术探讨,希望能借鉴我们播放端的开发思路或功能特性,完善自己的产品。 忙里偷闲,今天我…

我正在参加2022年度博客之星评选,大家帮我点个五星好评

大家好,我是音视频牛哥,致力于跨平台的实时RTMP推流、转发、RTMP/RTSP直播播放、GB28181设备接入。 有幸参加2022年度博客之星评选,欢迎大家帮点五星好评。如果我的博客能给开发者带来哪怕一丝启发,对博主来说,也甚感…

Win10系统切换输入法快捷键设置方法

无论是家用电脑还是办公电脑,一般都没有单一的输入法。有些人每次使用时都必须使用鼠标单击,其实真的很麻烦。Windows10系统切换输入法与以往的都不同,Win10系统如何修改切换输入法按键?就此问题,小编今天就把Win10切换输入法快捷…

rtmp/rtsp/hls公网真正可用的测试地址

相信大家在调试播放器的时候,都有这样的困惑,很难找到合适的公有测试源,以下是大牛直播SDK(GitHub地址)整理的真正可用的直播地址源。 其中,rtmp和rtsp的url,用我们播放器验证通过。 1. rtmp:…

Firefox火狐浏览器怎么设置中文 火狐浏览器语言设置方法

如果下载的是官方版的火狐浏览器,默认的预言可能会是英文版的,如何将火狐浏览器设置中文的呢? 1、打开浏览器,在地址栏中输入about:config,然后按下回车。 2、在列表中找到“general.useragent.locale”,双击&#…