Unity环境下实现Camera高帧率RTMP推送

这篇具有很好参考价值的文章主要介绍了Unity环境下实现Camera高帧率RTMP推送。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Unity下RTMP直播背景方面不再赘述,今天主要讨论的是,Unity环境下,如何实现Camera高帧率RTMP推送,这里提到的高帧率,不再局限于常规环境下的30帧,以VR头显为例,更高的帧率(比如50帧),体验会更好。

Unity环境下实现Camera高帧率RTMP推送

Android平台Unity推送Camera

Unity环境下实现Camera高帧率RTMP推送

Windows平台Unity推送Camera

之前,我们老早实现了Unity环境下的RTMP低延迟推送,原生环境下,比如windows下,可轻松实现50帧+的编码和RTMP推送(需要播放端也有高帧率播放的能力)。

好多开发者对这块比较感兴趣,今天分享几个点,权当抛砖引玉:

  1. 数据源:拿到期望的高帧率数据是基础,以Android或Windows的Unity环境为例,如果你想推50帧,起码camera能每秒读到超过50帧的数据,这个在好多开发者看来,可能觉得不是难事,实际你会发现,在复杂场景下,ReadPixel()耗时还是比较大的,特别是Android端;
  2. 数据读取和数据投递、编码等拆分,确保不至于因为数据投递、编码等,彼此相互影响;
  3. 针对横竖屏或camera分辨率实时变化的处理;
  4. 编码瓶颈:高帧率环境下,如果是windows还好,android端,编超过30帧,特别是分辨率比较大的话还是吃力的,这时候需要酌情考虑硬编或高效的软编方案,一般来说,建议H.264;
  5. 帧率控制:帧率控制这块,好多开发者可能会忽略,比如,我每秒需要编45帧,实际可以拿到60帧数据,如何用合理的算法处理数据,确保投递60帧数据,编码45帧(drop 15帧)的情况下,还能流畅无卡顿感,在设备无性能瓶颈的情况下,如何实现设置45帧,实际编码出来45帧数据;
  6. 音频方面:一般来说,常用的无非几种组合模式:麦克风、Unity内部音频、麦克风+unity内部音频混音或Unity下2路内部音频混音,麦克风的话,可以原生实现,然后直接调用即可,Unity内部音频可以通过AudioClip读取数据,编码的话,考虑到通用性,一般建议AAC;

Frame的构建,可以参考一下设计:

/*
* FrameTexture构建
* WebSite: https://github.com/daniulive/SmarterStreaming
*/
public class FrameTexture {
  public FrameTexture(Texture2D texture, int is_vertical_flip, int is_horizontal_flip, int scale_width, int scale_height) {
    texture_ = texture;
    is_vertical_flip_ = is_vertical_flip;
    is_horizontal_flip_ = is_horizontal_flip;
    scale_width_ = scale_width;
    scale_height_ = scale_height;
  }

  public Texture2D texture_ ;
  public int is_vertical_flip_ ;
  public int is_horizontal_flip_;
  public int scale_width_;
  public int scale_height_;
}

数据投递接口设计(Android):

/**
   * 投递层RGBA8888图像,如果不需要Aplpha通道的话, 请使用RGBX8888接口, 效率高
   *
   * @param index: 层索引, 必须大于等于0, 注意:如果index是0的话,将忽略Alpha通道
   *
   * @param left: 层叠加的左上角坐标, 对于第0层的话传0
   *
   * @param top: 层叠加的左上角坐标, 对于第0层的话传0
   *
   * @param rgba_plane: rgba 图像数据
   *
   * @param offset: 图像偏移, 这个主要目的是用来做clip的, 一般传0
   *
   * @param row_stride: stride information
   *
   * @param width: width, 必须大于1, 如果是奇数, 将减1
   *
   * @param height: height, 必须大于1, 如果是奇数, 将减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 PostLayerImageRGBA8888ByteBuffer(long handle, int index, int left, int top,
                       ByteBuffer 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);


  /**
   * 投递层RGBA8888图像, 详细说明请参考PostLayerImageRGBA8888ByteBuffer
   *
   * @return {0} if successful
   */
  public native int PostLayerImageRGBA8888ByteArray(long handle, int index, int left, int top,
                            byte[] 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);

Windows的话,构建图层:

NT_PB_ExternalVideoFrameLayerConfig external_layer_c1 = new NT_PB_ExternalVideoFrameLayerConfig();

external_layer_c1.base_.type_ = (Int32)NTSmartPublisherDefine.NT_PB_E_LAYER_TYPE.NT_PB_E_LAYER_TYPE_EXTERNAL_VIDEO_FRAME;
external_layer_c1.base_.index_ = 0;
external_layer_c1.base_.enable_ = 1;
external_layer_c1.base_.region_.x_ = 0;
external_layer_c1.base_.region_.y_ = 0;
external_layer_c1.base_.region_.width_ = video_width_;
external_layer_c1.base_.region_.height_ = video_height_;

external_layer_c1.base_.offset_ = Marshal.OffsetOf(external_layer_c1.GetType(), "base_").ToInt32();
external_layer_c1.base_.cb_size_ = (uint)Marshal.SizeOf(external_layer_c1);

IntPtr external_layer_conf = Marshal.AllocHGlobal(Marshal.SizeOf(external_layer_c1));

Marshal.StructureToPtr(external_layer_c1, external_layer_conf, true);

UInt32 external_r = NTSmartPublisherSDK.NT_PB_AddLayerConfig(publisher_handle_, 0,
                                                             external_layer_conf, (int)NTSmartPublisherDefine.NT_PB_E_LAYER_TYPE.NT_PB_E_LAYER_TYPE_EXTERNAL_VIDEO_FRAME,
                                                             0, IntPtr.Zero);

Marshal.FreeHGlobal(external_layer_conf);

然后通过NT_PB_PostLayerImage()给图层投递数据即可:

/*
         * 给index层投递Image数据,目前主要是用来把rgb和yuv视频数据传给相关层
         * reserve: 保留字段,请传0
         * index: 层索引
         * image: 图像
         * flag: 请传0
         * pReserve: 保留字段,请传0
         * 
         * 成功返回 NT_ERC_OK
     */
[DllImport("SmartPublisherSDK", EntryPoint = "NT_PB_PostLayerImage", CallingConvention = CallingConvention.StdCall)]
        public static extern UInt32 NT_PB_PostLayerImage(IntPtr handle, Int32 reserve,
                                                         Int32 index, IntPtr image,
                                                         UInt32 flag, IntPtr pReserve);

以上是Unity环境下高帧率RTMP推送一点抛砖引玉的介绍,实际开发过程中,可能还需要考虑多实例、异常网络环境处理等各种情况,如果原生开发这块,有很好的积累,这块都不难。文章来源地址https://www.toymoban.com/news/detail-415029.html

到了这里,关于Unity环境下实现Camera高帧率RTMP推送的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Windows环境下使用VLC获取到大疆无人机的RTMP直播推流

    下载地址:http://nginx-win.ecsds.eu/download/ 下载nginx 1.7.11.3 Gryphon.zip,解压后修改文件夹名称为nginx-1.7.11.3-Gryphon; 下载地址:GitHub - arut/nginx-rtmp-module: NGINX-based Media Streaming Server 将nginx-rtmp-module-master.zip解压后复制到目录nginx-1.7.11.3-Gryphon下; 打开nginx-1.7.11.3-Gryphonconf目录下面的

    2024年02月05日
    浏览(55)
  • 利用ffmpeg实现rtmp推流直播

    我们这次利用ffmpeg实现rtmp推流(最终推流地址统一为rtmp://127.0.0.1:1935/live/123) 1.首先下载ffmpeg和ffplay 官方下载链接为:FFmpeg 下载后开始配置环境变量: 系统属性-环境变量-path-添加ffmpeg/bin的路径; 打开命令窗口,输入ffmpeg,检测是否配置成功  以上代表正常安装配置(这一步很简单

    2023年04月08日
    浏览(37)
  • DXGI高帧率屏幕录像软件源码解析(声音捕获,抓屏,ffmpeg录像,MP4录像,flv录像,麦克风采集)(第4篇编码,录像部分)

    本文DEMO源码下载: https://download.csdn.net/download/xjb2006/85109025 dxgi桌面屏幕录像(windows屏幕录像,硬件编码,声音捕获,音视频同步) 由于篇幅有限,分为4篇发表: 1、SDK接口一览: 2、声音采集部分: 3、屏幕捕获部分: 4、编码,录像部分: 距离上篇文章已经过了快1年了,才

    2023年04月17日
    浏览(52)
  • OpenCV+FFmpeg 实现人脸检测Rtmp直播推流(Python快速实现)

    windows平台笔记本摄像头视频采集、人脸识别,识别后将视频推流到RTMP流媒体服务器,在任意客户端可以进行RTMP拉流播放。 效果如图: 使用VLC播放器进行拉流。 需要先安装OpenCV的python包以及FFmpeg。 对于ffmpeg有两种调用方式,但这两种方式都需要先安装ffmpeg,调用的具体区别

    2024年02月12日
    浏览(42)
  • Android平台Unity下如何通过WebCamTexture采集摄像头数据并推送至RTMP服务器或轻量级RTSP服务

    我们在对接Unity下推送模块的时候,遇到这样的技术诉求,开发者希望在Android的Unity场景下,获取到前后摄像头的数据,并投递到RTMP服务器,实现低延迟的数据采集处理。 在此之前,我们已经有了非常成熟的RTMP推送模块,也实现了Android平台Unity环境下的Camera场景采集,针对

    2024年01月21日
    浏览(70)
  • 用nginx实现一个直播服务—RTMP推流和HTTP-FLV拉流

    目录 一、环境准备 二、安装编译nginx所需的安装包和下载nginx原代码包 三、nginx配置 四、启动nginx服务 五、测试推流和拉流服务 六、摄像头数据采集 七、查看统计 这篇文章主要记录用nginx实现直播服务,通过RTMP推流和通过HTTP-FLV或RTMP拉流,并在页面中播放。 CentOS Linux rel

    2024年02月13日
    浏览(54)
  • EasyCVR如何实现国标级联无人机推送的RTMP推流通道?

    EasyCVR视频融合平台基于云边端一体化架构,可支持多协议、多类型设备接入,包括:NVR、IPC、视频编码器、无人机、车载设备、智能手持终端、移动执法仪等。平台具有强大的数据接入、处理及分发能力,可在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、

    2024年02月12日
    浏览(53)
  • SRS OBS利用RTMP协议实现音视频推拉流;WebRTC 屏幕直播分享工具

    参考:https://ossrs.net/lts/zh-cn/docs/v5/doc/getting-started 1)docker直接运行SRS服务: 运行起来后可以http://localhost:8080/ 看到服务基本信息: 2) OBS 推流 在设置里设置直播地址: 然后回到首页点击开始直播 3)点击http://localhost:8080/ 可以网页查看流视频 SRS低延迟启动(暂时测试下来延迟

    2024年04月13日
    浏览(60)
  • Android平台RTMP推送或GB28181设备接入端如何实现采集audio音量放大?

    我们在做Android平台RTMP推送和GB28181设备对接的时候,遇到这样的问题,有的设备,麦克风采集出来的audio,音量过高或过低,特别是有些设备,采集到的麦克风声音过低,导致播放端听不清前端采集的audio,这时候,就需要针对采集到的audio,做音量放大处理。 先说如何采集,

    2024年02月13日
    浏览(51)
  • rtmp直播

    技术要求:nginx+nginx-rtmp+ffmpeg+VLC 跟着大佬走的: 传送门 准备工作: 首先需要一台公网ip的服务器 这是使用天翼云的弹性云主机: 免费 试用1个月 天翼云官网 点击关机,更多里面选择重置密码, 默认用户名为root 使用xshell连接 弹性ip:xx.xx.xx.xx root 密码 创建目录:mkdir rtmp 切

    2024年02月11日
    浏览(49)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包