Κοινή χρήση τεχνολογίας

Πώς τα ακουστικά VR αναπαράγουν ροή 8K RTSP|RTMP με χαμηλή καθυστέρηση;

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

τεχνικό υπόβαθρο

Όταν φτιάχναμε συσκευές αναπαραγωγής RTSP και RTMP για την πλατφόρμα Unity, ορισμένες εταιρείες πρότειναν τέτοιες τεχνικές απαιτήσεις, ελπίζοντας να παίξουν πανοραμικές ροές 8K RTSP|RTMP και δεδομένα 8K στα ακουστικά, τα οποία πρότειναν νέες ιδέες για τα ακουστικά και τη συσκευή αναπαραγωγής τις απαιτήσεις, θα συζητήσουμε τον τρόπο με τον οποίο οι συσκευές που τοποθετούνται στο κεφάλι VR παίζουν δεδομένα ροής 8K RTSP|RTMP από διάφορες πτυχές:

1. Υποστήριξη παίκτη

  1. συμβατότητα : Πρώτον, το πρόγραμμα αναπαραγωγής RTSP|RTMP πρέπει να υποστηρίζει ροή βίντεο ανάλυσης 8K. Αυτό σημαίνει ότι η συσκευή αναπαραγωγής πρέπει να μπορεί να αποκωδικοποιήσει βίντεο 8K και να το παίξει σε μια συσκευή προβολής που υποστηρίζει ανάλυση 8Κ Περιττό να πούμε ότι το υποστηρίζουμε ήδη.
  2. ικανότητα αποκωδικοποίησης : Η συσκευή αναπαραγωγής πρέπει να έχει ισχυρές δυνατότητες αποκωδικοποίησης για να χειρίζεται τον μεγάλο όγκο δεδομένων στη ροή βίντεο 8K. Αυτό συνήθως απαιτεί από τη συσκευή αναπαραγωγής να χρησιμοποιεί αποτελεσματικούς αλγόριθμους αποκωδικοποίησης και να κάνει πλήρη χρήση των λειτουργιών επιτάχυνσης υλικού (όπως η επιτάχυνση GPU), η οποία απαιτεί από το σετ μικροφώνου-ακουστικού να υποστηρίζει σκληρή αποκωδικοποίηση 8K.

2. Απαιτήσεις δικτύου

  1. εύρος ζώνης : Η ροή βίντεο 8K απαιτεί εξαιρετικά υψηλό εύρος ζώνης δικτύου για υποστήριξη μετάδοσης σε πραγματικό χρόνο. Βεβαιωθείτε ότι το εύρος ζώνης του δικτύου είναι αρκετά μεγάλο για να αποφύγετε προβλήματα όπως καθυστέρηση, καθυστέρηση ή αποθήκευση στην προσωρινή μνήμη κατά την αναπαραγωγή.
  2. σταθερότητα : Η σταθερότητα της σύνδεσης δικτύου είναι επίσης πολύ σημαντική. Μια ασταθής σύνδεση δικτύου μπορεί να προκαλέσει τη διακοπή της ροής βίντεο ή την υποβάθμιση της ποιότητας.

3. Απαιτήσεις υλικού

  1. Επεξεργαστής και μνήμη: Τα ακουστικά VR αναπαράγουν ροές βίντεο 8K, οι οποίες θέτουν πολύ υψηλές απαιτήσεις στην απόδοση των ακουστικών VR. Για παράδειγμα, το quest3 είναι μια καλή επιλογή.

4. Βήματα αναπαραγωγής

  1. Επιλέξτε RTSP player: Η προσέγγισή μας είναι να χρησιμοποιήσουμε το εγγενές πρόγραμμα αναπαραγωγής RTSP|RTMP του Daniu Live SDK σε λειτουργία σκληρής αποκωδικοποίησης για να ανακαλέσουμε τα αποκωδικοποιημένα δεδομένα YUV ή RGB σε ενότητα Θα πρέπει να σημειωθεί ότι λόγω της ροής 8K RTSP|RTMP Πολύ μεγάλα, ειδικά αποκωδικοποιημένα δεδομένα, είναι απαραίτητο να μειωθούν τα αντίγραφα όσο το δυνατόν λιγότερο, εάν το επιτρέπουν οι συνθήκες.

Τεχνική υλοποίηση

Αυτό το άρθρο λαμβάνει ως παράδειγμα την ενότητα αναπαραγωγής Unity3D RTSP|RTMP της πλατφόρμας Android του Daniu Live SDK:

Ξεκινήστε να παίζετε:

  1. /*
  2. * SmartPlayerAndroidMono.cs
  3. * Author: daniusdk.com
  4. * QQ:89030985
  5. */
  6. public void Play()
  7. {
  8. if (is_running)
  9. {
  10. Debug.Log("已经在播放。。");
  11. return;
  12. }
  13. //获取输入框的url
  14. string url = input_url_.text.Trim();
  15. if (!url.StartsWith("rtmp://") && !url.StartsWith("rtsp://"))
  16. {
  17. videoUrl = "rtsp://admin:[email protected]:554/h264/ch1/main/av_stream";
  18. }
  19. else
  20. {
  21. videoUrl = url;
  22. }
  23. OpenPlayer();
  24. if ( player_handle_ == 0 )
  25. return;
  26. NT_U3D_Set_Game_Object(player_handle_, game_object_);
  27. /* ++ 播放前参数配置可加在此处 ++ */
  28. int is_using_tcp = 0; //TCP/UDP模式设置
  29. NT_U3D_SetRTSPTcpMode(player_handle_, is_using_tcp);
  30. int is_report = 0;
  31. int report_interval = 1;
  32. NT_U3D_SetReportDownloadSpeed(player_handle_, is_report, report_interval); //下载速度回调
  33. NT_U3D_SetBuffer(player_handle_, play_buffer_time_); //设置buffer time
  34. NT_U3D_SetPlayerLowLatencyMode(player_handle_, is_low_latency_ ? 1 : 0); //设置是否启用低延迟模式
  35. NT_U3D_SetMute(player_handle_, is_mute_ ? 1 : 0); //是否启动播放的时候静音
  36. NT_U3D_SetAudioVolume(player_handle_, cur_audio_volume_); //设置播放音量
  37. NT_U3D_SetVideoDecoderMode(player_handle_, is_hw_decode_ ? 1 : 0); //设置H.264软硬解模式
  38. NT_U3D_SetVideoHevcDecoderMode(player_handle_, is_hw_decode_ ? 1 : 0); //设置H.265软硬解模式
  39. int is_output = 1;
  40. int disable_use_image_planes = 0;
  41. bool is_supports_texture_format = SystemInfo.SupportsTextureFormat(TextureFormat.RG16);
  42. Debug.Log("is_supports_texture_format: " + is_supports_texture_format);
  43. int is_supported_multiple_format = is_supports_texture_format? 1:0;
  44. int max_images = 3;
  45. int buffer_pool_max_size = 0;
  46. NT_U3D_SetImageReaderOutput(player_handle_, is_output, disable_use_image_planes, is_supported_multiple_format, max_images, buffer_pool_max_size); //硬解码image reader
  47. int is_fast_startup = 1;
  48. NT_U3D_SetFastStartup(player_handle_, is_fast_startup); //设置快速启动模式
  49. int rtsp_timeout = 10;
  50. NT_U3D_SetRTSPTimeout(player_handle_, rtsp_timeout); //设置RTSP超时时间
  51. int is_auto_switch_tcp_udp = 1;
  52. NT_U3D_SetRTSPAutoSwitchTcpUdp(player_handle_, is_auto_switch_tcp_udp); //设置TCP/UDP模式自动切换
  53. int is_audiotrack = 1;
  54. NT_U3D_SetAudioOutputType(player_handle_, is_audiotrack); //设置音频输出模式: if 0: 自动选择; if with 1: audiotrack模式
  55. NT_U3D_SetUrl(player_handle_, videoUrl);
  56. /* -- 播放前参数配置可加在此处 -- */
  57. int flag = NT_U3D_StartPlay(player_handle_);
  58. if (flag == DANIULIVE_RETURN_OK)
  59. {
  60. is_need_get_frame_ = true;
  61. Debug.Log("播放成功");
  62. }
  63. else
  64. {
  65. is_need_get_frame_ = false;
  66. Debug.LogError("播放失败");
  67. }
  68. is_running = true;
  69. }

Η αντίστοιχη υλοποίηση OpenPlayer() είναι η εξής:

  1. private void OpenPlayer()
  2. {
  3. if ( java_obj_cur_activity_ == null )
  4. {
  5. Debug.LogError("getApplicationContext is null");
  6. return;
  7. }
  8. player_handle_ = NT_U3D_Open();
  9. if (player_handle_ != 0)
  10. Debug.Log("open success");
  11. else
  12. Debug.LogError("open fail");
  13. }

Κλείσιμο προγράμματος αναπαραγωγής:

  1. private void ClosePlayer()
  2. {
  3. is_need_get_frame_ = false;
  4. is_need_init_texture_ = false;
  5. int flag = NT_U3D_StopPlay(player_handle_);
  6. if (flag == DANIULIVE_RETURN_OK)
  7. {
  8. Debug.Log("停止成功");
  9. }
  10. else
  11. {
  12. Debug.LogError("停止失败");
  13. }
  14. flag = NT_U3D_Close(player_handle_);
  15. if (flag == DANIULIVE_RETURN_OK)
  16. {
  17. Debug.Log("关闭成功");
  18. }
  19. else
  20. {
  21. Debug.LogError("关闭失败");
  22. }
  23. player_handle_ = 0;
  24. NT_U3D_UnInit();
  25. is_running = false;
  26. video_format_ = VideoFrame.FORMAT_UNKNOWN;
  27. video_width_ = 0;
  28. video_height_ = 0;
  29. }

Ενημέρωση δεδομένων ανανέωσης:

  1. private void Update()
  2. {
  3. if (!is_need_get_frame_)
  4. return;
  5. if (player_handle_ == 0)
  6. return;
  7. AndroidJavaObject u3d_video_frame_obj = NT_U3D_GetVideoFrame(player_handle_);
  8. if (u3d_video_frame_obj == null)
  9. {
  10. return;
  11. }
  12. VideoFrame converted_video_frame = ConvertToVideoFrame(u3d_video_frame_obj);
  13. if (converted_video_frame == null)
  14. {
  15. u3d_video_frame_obj.Call("release");
  16. u3d_video_frame_obj = null;
  17. return;
  18. }
  19. if (!is_need_init_texture_)
  20. {
  21. if (converted_video_frame.format_ != video_format_)
  22. {
  23. is_need_init_texture_ = true;
  24. }
  25. else if (converted_video_frame.width_ != video_width_
  26. || converted_video_frame.height_ != video_height_
  27. || converted_video_frame.stride0_ != y_row_bytes_
  28. || converted_video_frame.stride1_ != u_row_bytes_
  29. || converted_video_frame.stride2_ != v_row_bytes_)
  30. {
  31. is_need_init_texture_ = true;
  32. }
  33. }
  34. if (is_need_init_texture_)
  35. {
  36. if (InitYUVTexture(converted_video_frame))
  37. {
  38. is_need_init_texture_ = false;
  39. }
  40. }
  41. UpdateYUVTexture(converted_video_frame);
  42. converted_video_frame.java_frame_obj_ = null;
  43. converted_video_frame = null;
  44. u3d_video_frame_obj.Call("release");
  45. u3d_video_frame_obj = null;
  46. }

Συνοψίζω

Εάν ένα ακουστικό VR χρειάζεται να παίζει ροές 8K RTSP ή RTSP, έχει πολύ υψηλές απαιτήσεις σε υλικό και δίκτυο, επομένως μπορεί να αντιμετωπίσει ορισμένες προκλήσεις σε πρακτικές εφαρμογές. Μέσω πραγματικών δοκιμών, το σετ μικροφώνου-ακουστικού quest3, σε συνδυασμό με το πρόγραμμα αναπαραγωγής RTSP|RTMP, μπορεί να επιτύχει καθυστέρηση σε επίπεδο χιλιοστού του δευτερολέπτου αναπαραγωγής δεδομένων βίντεο 8K στο Unity για να ανταποκριθεί σε σενάρια χρήσης με πολύ υψηλές απαιτήσεις σε πραγματικό χρόνο, όπως ο έλεγχος ισορροπίας μαζί μου ξεχωριστά.