安卓Unity3D Camera图像和音频采集推送代码

2023-11-04

    安卓Unity3d 可以使用ReadPixels从当前Render Target读取图像,音频可以从AudioClip读取,具体调用GetData接口,读取到的可能是float类型,有些音频编码器可能需要sint16格式,这需要做一个转换。 读图像先用StartCoroutine创建协程,等待WaitForEndOfFrame, 之后调用ReadPixels就好,调用之前要创建一个和Camera一样的大小Texture2D, 创建代码如下:

 Texture2D image_texture = new Texture2D(w, h, texture_format_, false);

  启动停止协程,捕获图像代码如下:

// Github: https://github.com/daniulive/SmarterStreaming
// Copyright (C) 1130758427@qq.com

public class TestCameraCapture: MonoBehaviour
{
    Coroutine coroutine_ = null;

    void OnDisable()
    {
        coroutine_ = StartCoroutine(captureImage());
    }

    void OnEnable()
    {
       StopCoroutine(coroutine_);
       coroutine_ = null;
    }

    IEnumerator captureImage() 
    {

        yield return new WaitForEndOfFrame();
        image_texture.ReadPixels(new Rect(0, 0, w, h), 0, 0, false);

        // 编码图像
  }

}

  这个是Unity3D官方给出的代码:

using System.IO;
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;

public class ExampleClass : MonoBehaviour
{
    // Take a shot immediately
    IEnumerator Start()
    {
        UploadPNG();
        yield return null;
    }

    IEnumerator UploadPNG()
    {
        // We should only read the screen buffer after rendering is complete
        yield return new WaitForEndOfFrame();

        // Create a texture the size of the screen, RGB24 format
        int width = Screen.width;
        int height = Screen.height;
        Texture2D tex = new Texture2D(width, height, TextureFormat.RGB24, false);

        // Read screen contents into the texture
        tex.ReadPixels(new Rect(0, 0, width, height), 0, 0);
        tex.Apply();

        // Encode texture into PNG
        byte[] bytes = tex.EncodeToPNG();
        Destroy(tex);

        // For testing purposes, also write to a file in the project folder
        // File.WriteAllBytes(Application.dataPath + "/../SavedScreen.png", bytes);


        // Create a Web Form
        WWWForm form = new WWWForm();
        form.AddField("frameCount", Time.frameCount.ToString());
        form.AddBinaryData("fileUpload", bytes);

        // Upload to a cgi script
        var w = UnityWebRequest.Post("http://localhost/cgi-bin/env.cgi?post", form);
        yield return w.SendWebRequest();
        if (w.result != UnityWebRequest.Result.Success)
            print(w.error);
        else
            print("Finished Uploading Screenshot");
        yield return null;
    }
}

   上面代码是读取图像后保存成PNG图片,只要把读取的纹理传给我写的C接口即可:

// Github: https://github.com/daniulive/SmarterStreaming
// Copyright (C) 1130758427@qq.com

 private int postLayerImageRGBA8888Native(long handle, int index, int left, int top,
                                            long rgba_plane, int offset, int 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){

            return obj_.Call<int>("OnPostLayerImageRGBA8888Native", handle, index, left, top,
                rgba_plane, offset, row_stride, width, height,
                is_vertical_flip, is_horizontal_flip,
                scale_width, scale_height, scale_filter_mode, rotation_degree);
        }

        private int postLayerImageRGBX8888Native(long handle, int index, int left, int top,
                                            long rgbx_plane, int offset, int 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){

            return obj_.Call<int>("OnPostLayerImageRGBX8888Native", handle, index, left, top,
                rgbx_plane, offset, row_stride, width, height,
                is_vertical_flip, is_horizontal_flip,
                scale_width, scale_height, scale_filter_mode, rotation_degree);
        }

读Camera和读Screen差不多,在我自己手机上硬编码视频可以跑到60帧,有些眼镜性能较弱,帧率稍微低些,不过基本都能满足需求, 实际开发中遇到不少问题,经验就是多看Unity3D官方文档,基本都能找到解决方案.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

安卓Unity3D Camera图像和音频采集推送代码 的相关文章

  • 当 K8s 集群达到万级规模,阿里巴巴如何解决系统各组件性能问题?

    作者 阿里云容器平台高级技术专家 曾凡松 逐灵 本文主要介绍阿里巴巴在大规模生产环境中落地 Kubernetes 的过程中 在集群规模上遇到的典型问题以及对应的解决方案 内容包含对 etcd kube apiserver kube cont
  • mysql 数字to char_mysql数字tochar

    例如 指定一个字段的类型为 INT 6 就可以保证所包含数字少于 6 个的值从 二 字符串类型 MySQL 提供了 8 个基本的字符串类型 分别 CHAR VARCHAR 查看当前安装的 MySQL 所支持的字符集 show charset
  • 数字电路设计之Xilinx全局时钟网络的使用

    为了实现同步电路设计 Xilinx使用了一种时钟分配树 其实感觉就是多个H组成的时钟网络 这样就可以使得每个时钟的延时都一样 为了使用Xilinx的全局时钟 可以使用全局时钟原语 IBUFGP U1 I clk in O clk out 全
  • [394]chrome浏览器的options参数

    1 背景 在使用selenium浏览器渲染技术 爬取网站信息时 默认情况下就是一个普通的纯净的chrome浏览器 而我们平时在使用浏览器时 经常就添加一些插件 扩展 代理之类的应用 相对应的 当我们用chrome浏览器爬取网站时 可能需要对
  • 野火13:GPIO输入——按键检测

    include stm32f10x h include bsp led h include bsp key h int main void LED端口初始化 跟上一节的LED一模一样 直接拿过来用 LED GPIO Config LED1
  • Check failed: registry.count(type) == 1 (0 vs. 1) Unknown layer type: Python

    在使用caffe的python层时经常容易出现如下错误 Check failed registry count type 1 0 vs 1 Unknown layer type Python 其原因是没有开启对python的支持 需要在Ma
  • rke部署k8s集群(包含清理)

    1 下载rke工具 https github com rancher rke releases 选择对应版本然后重命名为rke 2 禁用虚拟内存 vm swappiness 0 3 ssh配置文件打开配置 AllowTcpForwardin
  • C# 使用NAudio实现声音的录制(麦克风 , 扬声器)

    NAudio 简介 NAudio是个相对成熟 开源的C 音频开发工具 它包含录音 播放录音 格式转换 混音调整等功能 本次介绍主要功能有音频 录音文件播放 实时音频流波形图显示等 第一步 添加引用 在NuGet中搜索NAudio 并安装 第
  • SLAM笔记(九)再谈李代数

    内容接SLAM笔记 一 SLAM中的数学概览 李群 定义 实数空间上的连续群 对乘法 逆都是连续的 解析的 举例 如GL n SO n SE n 李代数 Lie algebra 定义 由一个集合 一个数域 和一个二元运算 组成 满足封闭 双
  • 基于ILRuntime和Addressable搭建热更框架记录——ILRuntime踩坑记录

    前言 原本就想基于新资源管理系统来做热更 现在开始做这个事情 以下会记录一些重要步骤及所踩的坑 Unity版本 2020 1 ILRuntime版本 1 6 6 接上文 基于ILRuntime和Addressable搭建热更框架记录 接入I
  • idea纯java工程使用gradle指定生成jar的Main-Class,idea生成jar

    build gradle核心代码如下 jar manifest attributes Main Class com example sample Application from configurations compile collect
  • 【Electron Playground 系列】文件下载篇

    作者 long woo 文件下载是我们开发中比较常见的业务需求 比如 导出 excel web 应用文件下载存在一些局限性 通常是让后端将响应的头信息改成 Content Disposition attachment filename xx
  • 以编译ipk包方式修改openwrt web界面。

    一 在 home wfly mt7620 op openwrt package 下 建立 test files目录 二 1 进入 test files目录建立test lua文件 如下 module luci controller admi
  • [datawhale202302]CS224W图机器学习:图机器学习导论

    结论速递 本次task是图机器学习的导论 围绕了几个问题展开 图机器学习的动机 图数据是有关联的数据 在现实生活中的例子 图机器学习与传统机器学习的区别 难点有哪些 图机器学习的基本概念 图神经网络的基本形式 图嵌入 图机器学习可以解决的任
  • 数据结构题目-二叉树的遍历

    目录 问题 BK 二叉树非递归前序遍历 附加代码模式 问题 BL 二叉树非递归中序遍历 附加代码模式 题 BM 二叉树非递归后序遍历 附加代码模式 问题 BN 求二叉树中序遍历序根节点的下标 问题 BO 根据前序 中序还原二叉树 问题 BP
  • Eclipse中各种查找快捷键

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 1 ctrl h打开搜索界面 File Search containing text填 File name patterns填写hello 可以找到hello为命名的文件
  • pls_integer类型

    今天在看一个触发器代码的时候碰到了一个pls integer类型 以前没碰到过 记录一下 PLS INTEGER可以存储一个有符号的整形值 其精度范围和BINARY INTEGER一样 是 2 31 2 31 PLS INTEGER和NUM
  • SSEGCN

    目录 SSEGCN 论文内容 1 研究背景 2 相关方法 3 研究方法 Input and Encoding Layer Attention Layer Aspect aware Attention Self Attention Synta
  • 游戏服务器引擎的设计(二)开发游戏服务器底层 及libuv使用

    服务器底层 个人任务认为稳定 高效 易用最重要 如果非要排个序的话 稳定 gt 易用 gt 高效 我是用的libuv这个库作为基础支持库的 为啥用它 主要是网络库不想自己写了 有现成的最好 这个库是轻量级的库而且跨平台 windows下分装

随机推荐

  • python之批量转换采样率

    需求 将本地音频16K采样率批量转换为8K采样率 批量转换采样率 import os import librosa import soundfile 定义转换采样率的函数 接收3个变量 原音频路径 重新采样后的音频存储路径 目标采样率 de
  • EXCEL VBA与SQL server的交互(二)

    引言 书接上回 接着讲VBA与SQL server的交互 本篇主要内容包括VBA执行存储过程 以及VBA与SQL server交互的一些技术细节 偏技术的会放在文章的最后 不感兴趣的可以直接跳过 正文 我们上回用VBA从SQL server
  • Shell 流程控制

    和Java PHP等语言不一样 sh的流程控制不可为空 如 以下为PHP流程控制写法
  • 基于Hive数据仓库的标签画像实战

    Hive数据仓库 建立用户画像首先需要建立数据仓库 用于存储用户标签数据 Hive是基于Hadoop的数据仓库工具 依赖于HDFS存储数据 提供的SQL语言可以查询存储在HDFS中的数据 开发时一般使用Hive作为数据仓库 存储标签和用户特
  • Matlab快速入门——逻辑与流程控制

    1 if else end A rand 1 10 limit 0 5 B A gt limit if any B fprintf Indices of values gt 4 2f n limit disp find B else dis
  • 视频分辨率无损放大软件 Topaz Video Enhance AI 2.3.0

    视频分辨率无损放大软件 Topaz Video Enhance AI 2 3 0 Topaz Video Enhance AI是一款非常好用的视频分辨率放大软件 用户可以通过这款软件将视频的分辨率进行自定义调节 最高能够将其放大至8K分辨率
  • python导入标准库的关键字是,导入整个Python标准库

    我需要一种方法将整个Python标准库导入我的程序 虽然这看起来似乎是一个坏主意 但我想这样做是因为py2exe会将整个标准库与我的程序打包在一起 所以我的用户可以在我给它们的shell中从中导入它 是否有捷径可寻 加分点 我希望这个动作不
  • NSX-T 问题一(亚信无代理杀毒部署期间,主机传输节点无法安装问题)

    项目场景 某金融客户部署亚信无代理杀毒期间出现了NSX T部署问题 之前由于未查询兼容性列表 使用了NSX T 3 2版本 与亚信厂商沟通后 更改为使用NSX T 3 1 3 5版本 问题描述 部署期间在安装主机传输节点处出现NSX 安装失
  • 【华为OD机试python】称砝码【 2023 Q1 A卷

    题目描述 现有n种砝码 重量互不相等 分别为 m1 m2 m3 mn 每种砝码对应的数量为 x1 x2 x3 xn 现在要用这些砝码去称物体的重量 放在同一侧 问能称出多少种不同的重量 注 称重重量包括 0 数据范围 每组输入数据满足 1
  • Java多线程通信-Semaphore(信号量)

    一 semaphone 信号量 Semaphone 信号量 是一个同步工具类 用来控制同时访问某个资源的线程数量 还可以用来实现某些资源池 或者给容器添加边界 Semaphone管理着一组 虚拟 的许可 permit 许可的初始数量可通过构
  • C++中的多态——理解虚函数表及多态实现原理

    多态及其实现原理 一 多态的概念 概念 构成条件 二 虚函数的重写 重写的定义 重写的特殊情况 override和final关键字 区分重写 重载 重定义 抽象类的概念 三 多态的实现原理 父类对象模型 补充 生成默认构造方法的场景 子类对
  • Kubenetes 集群Master与Node节点

    Master节点 Kubernetes里的Master指的是集群控制节点 在每个Kubernetes集群里都需要有一个Master来负责整个集群的管理和控制 基本上Kubernetes的所有控制命令都发给它 它负责具体的执行过程 我们后面执
  • Python所有方向的学习路线图,让Python初学者少走弯路

    举个例子 如果你要学习爬虫 那么你就去学Python爬虫学习路线图上面的知识点 这样学下来之后 你的知识体系是比较全面的 比起在网上找到什么就学什么 容易造成重复学 有时候也会学到一些用处不大的东西 还有一点就是 有了学习路线图 你就能够明
  • Vue 并排放置两个div的写法

    Vue的开发文档 Layout布局模块 https element eleme cn zh CN component select 样例 使用
  • 华为OD机试 - 等和子数组最小和(Java)

    题目描述 给定一个数组nums 将元素分为若干个组 使得每组和相等 求出满足条件的所有分组中 组内元素和的最小值 输入描述 第一行输入 m 接着输入m个数 表示此数组nums 数据范围 1 lt m lt 50 1 lt nums i lt
  • MySQL高级学习笔记

    目录 1 MySQL数据库逻辑架构 1 网络连接层 2 服务层 MySQL Server 1 连接池 Connection Pool 2 系统管理和控制工具 Management Services Utilities 3 SQL接口 SQL
  • 信息系统、课设、毕设

    信息系统 课设 毕设 可使用技术 后端 PHP Node js等 前端 jQuery vue等 UI layui elementui等 数据库 SQLserver MySQL等 APP uniapp等 适合 进销存ERP系统 商城 网站 A
  • mac卸载idea

    idea只有30天的试用期 比较穷 买不起正版 又不想用破解 是因为发现破解的版本写代码的时候反应好迟钝 一个报红的问题修复后半天还不好 到期了只能完全卸载重新装一遍 这样也还有个好处 能用最新版 一直在追求最新版的路上 给像我一样的强迫症
  • C语言:格式化输入输出函数

    C语言 格式化输入输出函数 1 格式化输出函数 printf 2 格式化输入函数 scanf C语言提供的格式化输入输出函数的原型在头文件stdio h中声明 在使用时应在程序头部包含该文件 include
  • 安卓Unity3D Camera图像和音频采集推送代码

    安卓Unity3d 可以使用ReadPixels从当前Render Target读取图像 音频可以从AudioClip读取 具体调用GetData接口 读取到的可能是float类型 有些音频编码器可能需要sint16格式 这需要做一个转换