Android平台下VR头显如何低延迟播放4K以上超高分辨率RTSP|RTMP流

本文涉及的产品
视觉智能开放平台,分割抠图1万点
视觉智能开放平台,视频资源包5000点
视觉智能开放平台,图像资源包5000点
简介: 这段内容讲述了VR头显中实现高分辨率视频播放的技术背景与实现方法,并强调了其重要性。高分辨率对于提升VR体验至关重要,它能提供更清晰的画面、增强沉浸感、补偿透镜放大效应,并维持宽广视场角下的图像质量。文中提到的大牛直播SDK具备极低的延迟(200-400ms),支持多种协议与格式,并具有丰富的功能特性,如多实例播放、事件回调、视频及音频格式支持等。此外,提供了基于Unity的播放器示例代码,展示了如何配置播放参数并开始播放。最后,作者指出此类技术在远程控制、虚拟仿真等应用场景中的重要意义。

技术背景

VR头显需要更高的分辨率以提供更清晰的视觉体验、满足沉浸感的要求、适应透镜放大效应以及适应更广泛的可视角度,超高分辨率的优势如下:

  1. 提供更清晰的视觉体验:VR头显的分辨率直接决定了用户所看到的图像的清晰度。更高的分辨率意味着更多的像素数,可以呈现更细腻、更逼真的图像,从而提升用户的视觉体验,更高的分辨率可以进一步减少图像中的颗粒感和纱窗效应,让用户感受到更加真实的虚拟世界。
  2. 满足沉浸感的要求:VR头显的主要目的是为用户提供沉浸式的体验,使用户感觉自己完全置身于虚拟环境中。为了达到这种效果,头显需要能够呈现足够清晰、细腻的图像,以便用户能够清晰地看到虚拟环境中的各种细节。更高的分辨率可以确保用户在头部移动或转动时,依然能够保持画面的清晰度和稳定性,从而增强沉浸感。
  3. 适应透镜放大效应:VR头显通过透镜将小屏幕放大至用户眼前,以模拟大屏幕的效果。然而,这种放大效应会导致图像的像素密度降低,使得图像看起来相对模糊。因此,为了保持放大后的图像依然清晰,VR头显需要更高的分辨率来弥补透镜放大带来的像素密度降低问题。
  4. 适应更广泛的可视角度:一些VR头显设计倾向于在画质可以接受的情况下,尽量增大可视角度,以便用户能够更自然地观察虚拟环境。然而,这也会导致图像在边缘区域出现拉伸和变形。为了保持这些区域依然清晰可辨,VR头显需要更高的分辨率来确保整个画面的清晰度和稳定性。

技术实现

实际上,大牛直播SDK在2018年就发布了Unity的RTSP|RTMP的播放模块,平台陆续覆盖了Windows、Android、iOS和Linux,Unity下播放RTSP|RTMP流,原理很简单,底层原生模块,把RTSP|RTMP流拉过来,做解析解码回调YUV或RGB数据到上层,Unity环境下,做绘制即可。说来容易,难点在于,如果需要更好的解码效率、资源占用和低延迟,需要确保每个环节都做到极致,总体延迟可以达到200-400ms。

image.gif

目前我们实现的功能如下:

  • [支持播放协议]高稳定、超低延迟(毫秒级延迟,行业内几无效果接近的播放端)、业内首屈一指的RTMP、RTSP直播播放SDK;
  • [多实例播放]支持多实例播放;
  • [事件回调]支持网络状态、buffer状态等回调;
  • [视频格式]支持RTMP扩展H.265,H.264;
  • [音频格式]支持AAC/PCMA/PCMU/Speex;
  • [H.264/H.265软解码]支持H.264/H.265软解;
  • [H.264硬解码]Android/iOS支持H.264特定机型硬解;
  • [H.265硬解]Android/iOS支持H.265特定机型硬解;
  • [RTSP模式设置]支持RTSP TCP/UDP模式设置;
  • [RTSP TCP/UDP自动切换]支持RTSP TCP、UDP模式自动切换;
  • [RTSP超时设置]支持RTSP超时时间设置,单位:秒;
  • [RTSP 401认证处理]支持上报RTSP 401事件,如URL携带鉴权信息,会自动处理;
  • [缓冲时间设置]支持buffer time设置;
  • [首屏秒开]支持首屏秒开模式;
  • [低延迟模式]支持超低延迟模式设置;
  • [复杂网络处理]支持断网重连等各种网络环境自动适配;
  • [快速切换URL]支持播放过程中,快速切换其他URL,内容切换更快;
  • [实时静音]支持播放过程中,实时静音/取消静音;
  • [实时快照]支持播放过程中截取当前播放画面;
  • [渲染角度]支持0°,90°,180°和270°四个视频画面渲染角度设置;
  • [渲染镜像]支持水平反转、垂直反转模式设置;
  • [实时下载速度更新]支持当前下载速度实时回调(支持设置回调时间间隔);
  • [音视频自适应]支持播放过程中,音视频信息改变后自适应播放;
  • [扩展录像功能]完美支持和录像模块组合使用。

废话不多说,上代码,先说开始播放:

/*
 * SmartPlayerAndroidMono.cs
 * Author: daniusdk.com
 * Created on 2018/05/10.
 */
public void Play()
{
    if (is_running)
    {
        Debug.Log("已经在播放。。");   
        return;
    }
    //获取输入框的url
    string url = input_url_.text.Trim();
    OpenPlayer();
    if ( player_handle_ == 0 )
        return;
    NT_U3D_Set_Game_Object(player_handle_, game_object_);
    /* ++ 播放前参数配置可加在此处 ++ */
    int is_using_tcp = 0;        //TCP/UDP模式设置
    NT_U3D_SetRTSPTcpMode(player_handle_, is_using_tcp);
    int is_report = 0;
    int report_interval = 1;
    NT_U3D_SetReportDownloadSpeed(player_handle_, is_report, report_interval);  //下载速度回调
    NT_U3D_SetBuffer(player_handle_, play_buffer_time_);                        //设置buffer time
    NT_U3D_SetPlayerLowLatencyMode(player_handle_, is_low_latency_ ? 1 : 0);    //设置是否启用低延迟模式
    NT_U3D_SetMute(player_handle_, is_mute_ ? 1 : 0);                           //是否启动播放的时候静音
    NT_U3D_SetAudioVolume(player_handle_, cur_audio_volume_);                   //设置播放音量
    NT_U3D_SetVideoDecoderMode(player_handle_, is_hw_decode_ ? 1 : 0);          //设置H.264软硬解模式
    NT_U3D_SetVideoHevcDecoderMode(player_handle_, is_hw_decode_ ? 1 : 0);          //设置H.265软硬解模式
    int is_output = 1;
    int disable_use_image_planes = 0;
    bool is_supports_texture_format = SystemInfo.SupportsTextureFormat(TextureFormat.RG16);
    Debug.Log("is_supports_texture_format: " + is_supports_texture_format);
    int is_supported_multiple_format = is_supports_texture_format? 1:0;
    int max_images = 3;
    int buffer_pool_max_size = 0;
    NT_U3D_SetImageReaderOutput(player_handle_, is_output, disable_use_image_planes, is_supported_multiple_format, max_images, buffer_pool_max_size);  //硬解码image reader
    int is_fast_startup = 1;
    NT_U3D_SetFastStartup(player_handle_, is_fast_startup);                     //设置快速启动模式
    int rtsp_timeout = 10;
    NT_U3D_SetRTSPTimeout(player_handle_, rtsp_timeout);                        //设置RTSP超时时间
    int is_auto_switch_tcp_udp = 1;
    NT_U3D_SetRTSPAutoSwitchTcpUdp(player_handle_, is_auto_switch_tcp_udp);    //设置TCP/UDP模式自动切换
    int is_audiotrack = 1;
    NT_U3D_SetAudioOutputType(player_handle_, is_audiotrack);                   //设置音频输出模式: if 0: 自动选择; if with 1: audiotrack模式
    NT_U3D_SetUrl(player_handle_, videoUrl);
    /* -- 播放前参数配置可加在此处 -- */
    int flag = NT_U3D_StartPlay(player_handle_);
    if (flag  == DANIULIVE_RETURN_OK)
    {
        is_need_get_frame_ = true;
        Debug.Log("播放成功");
    }
    else
    {
        is_need_get_frame_ = false;
        Debug.LogError("播放失败");
    }
    is_running = true;  
}

image.gif

对应的OpenPlayer实现如下:

private void OpenPlayer()
{
    if ( java_obj_cur_activity_ == null )
    {
        Debug.LogError("getApplicationContext is null");
        return;
    }
    player_handle_ = NT_U3D_Open();
    if (player_handle_ != 0)
        Debug.Log("open success");
    else
        Debug.LogError("open fail");
}

image.gif

ClosePlayer实现如下:

private void ClosePlayer()
{
    is_need_get_frame_ = false;
    is_need_init_texture_ = false;
    int flag = NT_U3D_StopPlay(player_handle_);
    if (flag == DANIULIVE_RETURN_OK)
    {
        Debug.Log("停止成功");
    }
    else
    {
        Debug.LogError("停止失败");
    }
    flag = NT_U3D_Close(player_handle_);
    if (flag == DANIULIVE_RETURN_OK)
    {
        Debug.Log("关闭成功");
    }
    else
    {
        Debug.LogError("关闭失败");
    }
    player_handle_ = 0;
    NT_U3D_UnInit();
    is_running = false;
    video_format_ = VideoFrame.FORMAT_UNKNOWN;
    video_width_ = 0;
    video_height_ = 0;
}

image.gif

总结

VR头显下播放超高分辨率的RTSP或RTMP,实现低延迟的播放,意义很大,比如平衡操控场景下,可以远程操控挖掘机等危险设备,提高工作效率、改善工作环境、降低安全风险、节约人力成本。在虚拟仿真、无人机操控等场景下也意义重大,感兴趣的开发者,可以单独跟我交流。

相关文章
|
3天前
|
IDE 开发工具 Android开发
安卓与iOS开发对比:平台选择对项目成功的影响
【9月更文挑战第10天】在移动应用开发的世界中,选择正确的平台是至关重要的。本文将深入探讨安卓和iOS这两大主要移动操作系统的开发环境,通过比较它们的市场份额、开发工具、编程语言和用户群体等方面,为开发者提供一个清晰的指南。我们将分析这两个平台的优势和劣势,并讨论如何根据项目需求和目标受众来做出最佳选择。无论你是初学者还是有经验的开发者,这篇文章都将帮助你更好地理解每个平台的特性,并指导你做出明智的决策。
|
4天前
|
开发工具 Android开发 iOS开发
安卓与iOS开发:平台选择的艺术与科学
在移动应用开发的广阔天地中,安卓与iOS两大平台如同东西方哲学的碰撞,既有共通之处又各具特色。本文将深入探讨这两个平台的设计理念、开发工具和市场定位,旨在为开发者提供一份简明扼要的指南,帮助他们在这场技术与商业的博弈中找到自己的道路。通过比较分析,我们将揭示每个平台的优势与局限,以及它们如何影响应用的性能、用户体验和市场接受度。无论你是初涉江湖的新手,还是经验丰富的老手,这篇文章都将为你的选择提供新的视角和思考。
16 5
|
4天前
|
人工智能 Android开发 iOS开发
安卓与iOS开发:平台选择的艺术
在移动应用开发的广阔天地里,安卓和iOS两大操作系统各占半壁江山。本文将深入探讨这两个平台的开发环境、工具及市场趋势,帮助开发者在选择适合自己项目的平台时做出更明智的决策。通过比较各自的优势与局限,我们不仅能更好地理解每个系统的核心特性,还能洞察未来技术发展的脉络。无论你是刚入行的新手还是资深开发者,这篇文章都将为你提供有价值的参考和启示。
18 5
|
4天前
|
Linux Android开发 iOS开发
探索Android与iOS开发:平台之战还是互补共生?
在移动应用开发的浩瀚宇宙中,Android和iOS这两大星系始终吸引着无数开发者的目光。它们各自拥有独特的引力场,引领着技术潮流的方向。本文将穿梭于这两个平台的星际空间,揭示它们背后的力量对比,以及如何在这两者之间找到平衡点,共同推动移动应用开发的进步。
13 1
|
4天前
|
移动开发 开发框架 Android开发
安卓与iOS开发:平台之战的新篇章
在移动应用开发的广阔天地中,安卓和iOS始终占据着主导地位。本文通过比较这两个平台的发展历程、技术特点及未来趋势,探讨了它们之间的竞争与合作。文章旨在为开发者提供一个清晰的平台选择指南,并预测未来移动开发的可能走向。
11 1
|
6天前
|
移动开发 开发工具 Android开发
安卓与iOS开发:平台差异及其对开发者的影响
在移动开发的大潮中,安卓和iOS两大阵营各领风骚。本文将探讨这两个平台的关键差异,包括开发环境、编程语言、用户界面设计、应用分发以及商业模式等方面。通过比较分析,我们旨在为开发者提供一个清晰的指导,帮助他们根据项目需求和个人偏好做出明智的平台选择。同时,文章也将分享一些跨平台开发工具的使用经验,以期最大化开发效率和市场覆盖。
|
6天前
|
移动开发 Android开发 Swift
安卓与iOS开发环境对比:选择合适的平台
在数字时代的浪潮中,移动应用开发成为技术前沿的热门领域。两大主流操作系统——安卓和iOS,各自拥有独特的开发环境与生态。本文将深入探讨这两种平台的开发特点,帮助开发者根据自己的需求和资源选择最合适的开发路径。从工具支持到用户群体,从编程语言到市场分布,我们将一一剖析,为即将踏上移动开发之旅的朋友们提供一盏明灯。
|
3月前
|
人工智能 编解码 5G
虚拟现实(VR)与增强现实(AR)的融合:开启全新交互时代
【6月更文挑战第17天】虚拟现实(VR)与增强现实(AR)融合成混合现实(MR),打造全新交互体验。MR结合VR的沉浸感和AR的现实增强,应用于教育、游戏、设计和营销,带来创新教学方式、沉浸式游戏体验和高效设计工具。尽管面临技术挑战,随着5G和AI的发展,MR有望引领未来交互的革命。
|
3月前
|
传感器 数据可视化 安全
【虚拟现实】二、主要的AR/VR硬件设备
【虚拟现实】二、主要的AR/VR硬件设备
51 3
|
20天前
|
编解码 vr&ar 芯片
VR与AR:未来的科技趋势
【8月更文挑战第26天】VR与AR技术正以前所未有的速度发展,并在市场规模、技术创新、应用场景以及竞争格局等方面展现出强劲的增长潜力。随着技术的不断进步和应用场景的不断拓展,VR/AR/MR技术将为人们带来更加丰富的虚拟体验和更加便捷的生活方式。未来,我们有理由相信,VR与AR技术将在多个领域实现更广泛的应用和更深入的融合,成为推动社会进步的重要力量。