Android流媒体开发之路一:Camera2采集摄像头数据并手动预览

这篇具有很好参考价值的文章主要介绍了Android流媒体开发之路一:Camera2采集摄像头数据并手动预览。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近研究了一下android摄像头开发相关的技术,也看了Google提供的Camera2Basic调用示例,以及网上一部分代码,但都是在TextureView等预览基础上实现,而我想要做的是在不预览的情况下,能获取到摄像头原始数据流,并由自己来决定是否绘制显示。经过一番折腾,初步实现了自己的目的——CamCap程序。

1、需求分析

  其实主要就是在不预览的情况下获取到摄像头原始数据,目的嘛,一是为了灵活性,方便随时开启关闭预览,二是为了以后可以直接对数据进行处理,三是为了其他程序开发做一些准备。于是实现一下几个功能:

  • 获取摄像头数据,并手动绘制图像

  • 随时开启/关闭预览

  • 随时保存当前摄像头图像,即使在关闭预览情况下

2、Android Camera2接口

  查阅了一些资料,Android Java层由于从API21开始,已经废弃原Camera接口,所以这里采用Camera2接口。相比Camera接口来说,第二代摄像头接口,调用复杂多了,但是灵活性也更高了,通过Google的Camera2Basic例子可以很清楚的了解到使用方式。这里把CamCap程序中的Camera2的调用顺序整理如下:

android获取摄像头实时数据,编程,程序员,音视频开发,android,音视频,webrtc,ffmpeg,C++

image

和其他程序一样,通过ImageReader来获取到CameraCaptureSession传递出来的数据,与Google例子不同的是,我取消了把TextureView的传递,改为单独以ImageReader来获取图像流,并设置为YUV_420_888格式,以拿到原始数据。

打开摄像头

android获取摄像头实时数据,编程,程序员,音视频开发,android,音视频,webrtc,ffmpeg,C++

image

摄像头打开后,创建对话

android获取摄像头实时数据,编程,程序员,音视频开发,android,音视频,webrtc,ffmpeg,C++

image

3、调用libyuv做RGB之间的数据转换

  获取到YUV数据之后,就可以在UI界面上进行绘制了,通过简单了解,可以通过OpenGLES来绘制,也可以转为Bitmap直接在TextureView上绘制。这里为了简单,选择了后者。然而后来发现,android.graphics.Bitmap并不支持直接将YUV数据存入,只能转为RGB数据格式,才能存入Bitmap,进而在TextureView上绘制。YUV转换RGB,之前在C++上应用过很多次了,可以把现有代码修改一下放到java里运行,不过考虑到性能问题,决定还是使用libyuv。libyuv是一款以c/c++为基础的,专做YUV与RGB格式转换的开源项目,性能非常高。

【学习地址】:FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发

【文章福利】:免费领取更多音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击1079654574加群领取哦~

android获取摄像头实时数据,编程,程序员,音视频开发,android,音视频,webrtc,ffmpeg,C++

​​​​​​      使用libyuv,需要通过NDK交叉编译,并通过JNI来调用。libyuv编译起来也很简单,首先下载libyuv源码,代码地址是:https://chromium.googlesource.com/libyuv/libyuv 。然后确保NDK已经安装(这个直接在AndroidStudio中就能安装好),之后把NDK目录添加到环境变量。最后,进入libyuv目录,调用ndk-build即可。libyuv项目里已经写好了Android.mk,所以,直接编译就行了(我是在Windows上)。

android获取摄像头实时数据,编程,程序员,音视频开发,android,音视频,webrtc,ffmpeg,C++

image

注意!编译的时候遇到JPEG库没有指定的问题,如果不想依赖libjpeg,可以修改Android.mk,删除JPEG库相关编译项就可以解决。

在AndroidStudio上建立c++文件,封装libyuv接口,然后按照JNI规范暴露接口,同时在Java层封装类来调用native方法。

android获取摄像头实时数据,编程,程序员,音视频开发,android,音视频,webrtc,ffmpeg,C++

image

4、绘制图像

在绘制图像的时候,有个坑,那就是图像的旋转,这个是由于手机上的摄像头传感器的视野坐标,一般都是旋转了90度或270度的,所以,需要把摄像头采集到的画面,进行旋转,才能还原出正确的视野画面。传感器旋转方向通过以下值获得,

CameraManager.getCameraCharacteristics(camid).get(CameraCharacteristiCameraManager.getCameraCharacteristics(camid).get(CameraCharacteristics.SENSOR_ORIENTATION)cs.SENSOR_ORIENTATION)

根据这个值,构建Matrix将Bitmap进行旋转

android获取摄像头实时数据,编程,程序员,音视频开发,android,音视频,webrtc,ffmpeg,C++

image

Matrix构建代码如下:

android获取摄像头实时数据,编程,程序员,音视频开发,android,音视频,webrtc,ffmpeg,C++

image

与上面代码中类似,通过TextureView.lockCanvas(),获取到Canvas,调用drawBitmap()将图像写入,即可完成绘制。

5、运行截图

开启预览时的4:3画面和16:9画面

android获取摄像头实时数据,编程,程序员,音视频开发,android,音视频,webrtc,ffmpeg,C++

image

android获取摄像头实时数据,编程,程序员,音视频开发,android,音视频,webrtc,ffmpeg,C++

image

关闭预览,同时可以继续拍照

android获取摄像头实时数据,编程,程序员,音视频开发,android,音视频,webrtc,ffmpeg,C++

image

android获取摄像头实时数据,编程,程序员,音视频开发,android,音视频,webrtc,ffmpeg,C++

image

原文链接:Android流媒体开发之路一:Camera2采集摄像头数据并手动预览 - 简书文章来源地址https://www.toymoban.com/news/detail-560351.html

到了这里,关于Android流媒体开发之路一:Camera2采集摄像头数据并手动预览的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【AWS系列】巧用 G5g 畅游Android流媒体游戏

    Amazon EC2 G5g 实例由 AWS Graviton2 处理器提供支持 ,并配备 NVIDIA T4G Tensor Core GPU,可为 Android 游戏流媒体等图形工作负载提供 Amazon EC2 中最佳的性价比。它们是第一个具有 GPU 加速功能的基于 Arm 的实例。 借助 G5g 实例,游戏流媒体客户可以在基于 Arm 的实例上本

    2024年02月03日
    浏览(44)
  • 音视频流媒体开发难以学习?今天教你如何“丝滑”入门

    Android平台最常用的渲染工具就是鼎鼎大名的 OpenGL ,程序员多多少少都有听过它,目前市面上众多3A游戏引擎很多就是由OpenGL编写的,而与此同时,对咱们Android开发来说,为什么要学习Opengl呢?其实就俩字: 高薪 ! 今天就带大家来了解了解 OpenGL ! OpenGL到底是什么呢?很多人

    2023年04月08日
    浏览(51)
  • 【流媒体视频监控平台开发wvp-GB28181-pro】

    1.原有视频监控,基于海康、大华web控件和SDK 2.开源wvp-GB28181-pro gitee地址:https://gitee.com/pan648540858/wvp-GB28181-pro.git B站大佬北小菜:https://space.bilibili.com/487906612 ZLMediaKit简单介绍 视频监控平台工作流程 登陆 点击对应监控通道 访问ZLMediaKit,进行拉流推流 无人访问时ZLMediaKit断开

    2024年02月06日
    浏览(45)
  • Qt/C++音视频开发51-推流到各种流媒体服务程序

    最近将推流程序完善了很多功能,尤其是增加了对多种流媒体服务程序的支持,目前支持mediamtx、LiveQing、EasyDarwin、nginx-rtmp、ZLMediaKit、srs、ABLMediaServer等,其中经过大量的对比测试,个人比较建议使用mediamtx和ZLMediaKit,因为这两者支持的格式众多,不仅同时支持rtsp/rtmp推流,

    2024年02月09日
    浏览(60)
  • 一个.Net开发的功能强大、易于使用的流媒体服务器和管理系统

    推荐一个视频管理系统,非常适合个人或者公司打造视频网站。 这是基于.Net Core开发的,跨平台的开源项目;支持多种音视频格式,如MP3、MP4、AVI、WMV、FLV等;支持本地管理与远程管理,让管理员可以轻松的管理视频资源。 而且该项目还提供多平台的客户端,支持Web、桌面

    2024年02月05日
    浏览(73)
  • 流媒体服务器(17)—— 流媒体开源服务 MediaSoup 初识

    目录 前言 正文 一、简单介绍 二、关键特色 1. 超强 SFU 功能 2. Node.js 模块 3. 客户端 SDK 三、架构组成 1. 关键实例 2. 重要模块 四、发展现状 https://liuzhen.blog.csdn.net/article/details/115603863 https://liuzhen.blog.csdn.net/article/details/115603863 最近收看了一期微软(中国)关于云原生、大数据

    2023年04月09日
    浏览(51)
  • 用Qt开发的ffmpeg流媒体播放器,支持截图、录像,支持音视频播放,支持本地文件播放、网络流播放

    本工程qt用的版本是5.8-32位,ffmpeg用的版本是较新的5.1版本。它支持TCP或UDP方式拉取实时流,实时流我采用的是监控摄像头的RTSP流。音频播放采用的是QAudioOutput,视频经ffmpeg解码并由YUV转RGB后是在QOpenGLWidget下进行渲染显示。本工程的代码有注释,可以通过本博客查看代码或者

    2024年02月03日
    浏览(105)
  • 使用Nginx搭建流媒体

    参考地址 安装 ffmpeg 1、下载安装ffmpeg 2、安装依赖 3、编译安装 ffmpeg 4、创建全局链接 5、验证 安装nginx 1、下载依赖包 2、 解压安装nginx 3、配置启动脚本 4、修改 nginx.conf 文件 在原有的nginx.conf 文件中 server 里面增加如下配置 5、 启动 nginx 6、上传视频测试验证 参数说明 022

    2024年02月07日
    浏览(52)
  • 流媒体协议之RTSP详解

    RTSP(Real Time Streaming Protocol):实时流媒体协议,是由Real network 和 Netscape共同提出的如何有效地在IP网络上传输流媒体数据的应用层协议,RTSP提供一种可扩展的框架,使能够提供能控制的,按需传输实时数据,如音频流、视频流、metadata; 遵循规范IETF RFC 2326,4567,6064,其语法和操作参

    2024年02月05日
    浏览(57)
  • 流媒体协议RTSP初篇(一)

    今日天气微凉,小雨稀稀拉拉的落下,写写文章开心一点。 一、前情提要之工作流程 RTSP、RTP、RTCP、SDP四个协议一般是打包使用的,各司其职完成传输媒体流的使命。大致流程如下: 身份卡: 老板 : RTSP 秘书 : SDP RTCP : 质量经理 RTP : 小工 小剧场: 老板A: 有媒体资源 老板

    2024年02月07日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包