내 연락처 정보
우편메소피아@프로톤메일.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Unity 플랫폼용 RTSP 및 RTMP 플레이어를 만들 때 일부 회사에서는 파노라마 8K RTSP|RTMP 라이브 스트림과 8K 데이터를 헤드셋에서 재생할 수 있기를 희망하면서 이러한 기술 요구 사항을 제시했으며 이는 헤드셋과 플레이어에 대한 새로운 아이디어를 제안했습니다. 요구 사항에 따라 VR 헤드 장착 장치가 8K RTSP|RTMP 스트리밍 데이터를 여러 측면에서 재생하는 방법에 대해 논의하겠습니다.
이 문서에서는 Daniu Live SDK의 Android 플랫폼 Unity3D RTSP|RTMP 재생 모듈을 예로 들어 설명합니다.
재생 시작:
- /*
- * SmartPlayerAndroidMono.cs
- * Author: daniusdk.com
- * QQ:89030985
- */
- public void Play()
- {
- if (is_running)
- {
- Debug.Log("已经在播放。。");
- return;
- }
-
- //获取输入框的url
- string url = input_url_.text.Trim();
-
- if (!url.StartsWith("rtmp://") && !url.StartsWith("rtsp://"))
- {
- videoUrl = "rtsp://admin:[email protected]:554/h264/ch1/main/av_stream";
- }
- else
- {
- videoUrl = url;
- }
-
- 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;
- }
해당 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");
- }
플레이어 닫기:
- 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;
- }
새로 고침 데이터 업데이트:
- private void Update()
- {
- if (!is_need_get_frame_)
- return;
-
- if (player_handle_ == 0)
- return;
-
- AndroidJavaObject u3d_video_frame_obj = NT_U3D_GetVideoFrame(player_handle_);
-
- if (u3d_video_frame_obj == null)
- {
- return;
- }
-
- VideoFrame converted_video_frame = ConvertToVideoFrame(u3d_video_frame_obj);
-
- if (converted_video_frame == null)
- {
- u3d_video_frame_obj.Call("release");
-
- u3d_video_frame_obj = null;
- return;
- }
-
- if (!is_need_init_texture_)
- {
- if (converted_video_frame.format_ != video_format_)
- {
- is_need_init_texture_ = true;
-
- }
- else if (converted_video_frame.width_ != video_width_
- || converted_video_frame.height_ != video_height_
- || converted_video_frame.stride0_ != y_row_bytes_
- || converted_video_frame.stride1_ != u_row_bytes_
- || converted_video_frame.stride2_ != v_row_bytes_)
- {
- is_need_init_texture_ = true;
- }
- }
-
- if (is_need_init_texture_)
- {
- if (InitYUVTexture(converted_video_frame))
- {
- is_need_init_texture_ = false;
- }
- }
-
- UpdateYUVTexture(converted_video_frame);
-
- converted_video_frame.java_frame_obj_ = null;
- converted_video_frame = null;
- u3d_video_frame_obj.Call("release");
- u3d_video_frame_obj = null;
- }
VR 헤드셋이 8K RTSP 또는 RTSP 스트림을 재생해야 하는 경우 하드웨어 및 네트워크 요구 사항이 매우 높으므로 실제 애플리케이션에서 몇 가지 문제에 직면할 수 있습니다. 실제 테스트를 통해 RTSP|RTMP 플레이어와 결합된 Quest3 헤드셋은 Unity에서 8K 비디오 데이터 재생의 밀리초 수준 지연을 달성하여 밸런스 제어와 같은 매우 높은 실시간 요구 사항이 있는 사용 시나리오를 충족할 수 있습니다. 관심 있는 개발자는 이에 대해 논의할 수 있습니다. 나랑 개별적으로.