国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Unity3D下如何采集camera場景數(shù)據(jù)并推送RTMP服務(wù)?

這篇具有很好參考價值的文章主要介紹了Unity3D下如何采集camera場景數(shù)據(jù)并推送RTMP服務(wù)?。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Unity3D使用場景

Unity3D是非常流行的游戲開發(fā)引擎,可以創(chuàng)建各種類型的3D和2D游戲或其他互動應(yīng)用程序。常見使用場景如下:

  1. 游戲開發(fā):Unity3D是一個廣泛用于游戲開發(fā)的環(huán)境,適用于創(chuàng)建各種類型的游戲,包括動作游戲、角色扮演游戲、策略游戲、冒險游戲等。
  2. 虛擬現(xiàn)實:Unity3D也常用于虛擬現(xiàn)實(VR)開發(fā),它提供了對VR設(shè)備的支持,如Oculus Rift和HTC Vive。
  3. 交互式演示:Unity3D可以用于創(chuàng)建各種類型的交互式演示,如產(chǎn)品原型、建筑和設(shè)計模擬器、教育應(yīng)用程序等。
  4. 實時渲染:Unity3D的實時渲染功能可以用于創(chuàng)建電影級的特效和動畫,以及用于視覺預(yù)覽和產(chǎn)品渲染。
  5. 跨平臺開發(fā):Unity3D支持多個平臺,包括PC、Mac、Linux、Android、iOS、Windows等,這使得開發(fā)者可以更容易地將他們的應(yīng)用程序和游戲移植到不同的平臺。

無論你是在哪個領(lǐng)域使用Unity3D,都需要了解其基本的工具和功能,包括場景編輯器、游戲?qū)ο?、組件、腳本等。同時,還需要掌握一些基本的編程語言,如C#,以編寫游戲邏輯和控制流程。

如何獲取Camera場景數(shù)據(jù)

Unity3D獲取攝像機(jī)數(shù)據(jù)通常用RenderTexture和RenderTexture.GetPixel方法來獲取數(shù)據(jù),把捕獲屏幕的圖像,存儲在一個Texture2D實例中,用這個實例獲取RGB數(shù)據(jù)。需要注意的是,需要為輸出紋理創(chuàng)建一個新的紋理對象,否則可能會在屏幕上看到一片空白。示例代碼如下:

using UnityEngine;  
  
public class GetCameraData : MonoBehaviour  
{  
    public Texture2D outputTexture; // 輸出紋理,用于存儲RGB數(shù)據(jù)  
    public RenderTexture renderTexture; // RenderTexture實例,用于捕獲屏幕圖像  
  
    void Start()  
    {  
        // 創(chuàng)建一個RenderTexture實例  
        renderTexture = new RenderTexture(Screen.width, Screen.height, 24);  
        // 獲取當(dāng)前攝像機(jī)  
        Camera camera = GetComponent<Camera>();  
        // 將當(dāng)前攝像機(jī)的屏幕輸出設(shè)置為剛剛創(chuàng)建的RenderTexture實例  
        camera.targetTexture = renderTexture;  
        // 創(chuàng)建一個空的Texture2D實例,用于存儲從RenderTexture讀取的RGB數(shù)據(jù)  
        outputTexture = new Texture2D(Screen.width, Screen.height);  
    }  
  
    void Update()  
    {  
        // 從RenderTexture中讀取RGB數(shù)據(jù),并存儲到outputTexture中  
        RenderTexture.active = renderTexture;  
        outputTexture.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);  
        outputTexture.Apply();  
    }  
}

如何實現(xiàn)RTMP推送服務(wù)

本文以大牛直播SDK開發(fā)的Unity3D下Android平臺的RTMP推送camera場景的demo為例,結(jié)合Unity和原生模塊交互,大概介紹下核心實現(xiàn)邏輯。

Unity3D下如何采集camera場景數(shù)據(jù)并推送RTMP服務(wù)?,Unity?RTMP直播推送播放,VR RTMP推送,VR頭顯 RTMP,AR RTMP,XR RTMP,大牛直播SDK

開始推送RTMP服務(wù):

    public bool StartRtmpPusher()
    {
        if (is_pushing_rtmp_)
        {
            Debug.Log("已推送..");   
            return false;
        }


        if(!is_rtsp_publisher_running_)
        {
            InitAndSetConfig();
        }

        if (pusher_handle_ == 0) {
             Debug.LogError("StartRtmpPusher, publisherHandle is null..");
            return false;
        }

        NT_PB_U3D_SetPushUrl(pusher_handle_, rtmp_push_url_);

        int is_suc = NT_PB_U3D_StartPublisher(pusher_handle_);

        if (is_suc  == DANIULIVE_RETURN_OK)
        {
            Debug.Log("StartPublisher success..");          
            is_pushing_rtmp_ = true;
        }
        else
        {
            Debug.LogError("StartPublisher failed..");
            return false;
        }

        return true;
    }

InitAndSetConfig()完成常規(guī)參數(shù)設(shè)置,比如軟硬編碼、幀率、碼率等參數(shù)設(shè)置,如果需要采集audio,還可以把麥克風(fēng)采集到的audio和audioclip獲取到的audio數(shù)據(jù)mix后輸出:

    private void InitAndSetConfig()
    {
        if ( java_obj_cur_activity_ == null )
        {
            Debug.LogError("getApplicationContext is null");
            return;
        }

        int audio_opt = 1;
        int video_opt = 3;

        video_width_ = camera_.pixelWidth;
        video_height_ = camera_.pixelHeight;

        pusher_handle_ = NT_PB_U3D_Open(audio_opt, video_opt, video_width_, video_height_);

        if (pusher_handle_ != 0){
            Debug.Log("NT_PB_U3D_Open success");
            NT_PB_U3D_Set_Game_Object(pusher_handle_, game_object_);
        }
        else
        {
            Debug.LogError("NT_PB_U3D_Open failed!");
            return;
        }

        int fps = 30;
        int gop = fps * 2;

        if(video_encoder_type_ == (int)PB_VIDEO_ENCODER_TYPE.VIDEO_ENCODER_HARDWARE_AVC)
        {
            int h264HWKbps = setHardwareEncoderKbps(true, video_width_, video_height_);
            h264HWKbps = h264HWKbps * fps / 25;

            Debug.Log("h264HWKbps: " + h264HWKbps);

            int isSupportH264HWEncoder = NT_PB_U3D_SetVideoHWEncoder(pusher_handle_, h264HWKbps);

            if (isSupportH264HWEncoder == 0) {
                NT_PB_U3D_SetNativeMediaNDK(pusher_handle_, 0);
                NT_PB_U3D_SetVideoHWEncoderBitrateMode(pusher_handle_, 1); // 0:CQ, 1:VBR, 2:CBR
                NT_PB_U3D_SetVideoHWEncoderQuality(pusher_handle_, 39);
                NT_PB_U3D_SetAVCHWEncoderProfile(pusher_handle_, 0x08); // 0x01: Baseline, 0x02: Main, 0x08: High

                // NT_PB_U3D_SetAVCHWEncoderLevel(pusher_handle_, 0x200); // Level 3.1
                // NT_PB_U3D_SetAVCHWEncoderLevel(pusher_handle_, 0x400); // Level 3.2
                // NT_PB_U3D_SetAVCHWEncoderLevel(pusher_handle_, 0x800); // Level 4
                NT_PB_U3D_SetAVCHWEncoderLevel(pusher_handle_, 0x1000); // Level 4.1 多數(shù)情況下,這個夠用了
                //NT_PB_U3D_SetAVCHWEncoderLevel(pusher_handle_, 0x2000); // Level 4.2

                // NT_PB_U3D_SetVideoHWEncoderMaxBitrate(pusher_handle_, ((long)h264HWKbps)*1300);

                Debug.Log("Great, it supports h.264 hardware encoder!");
            }
        }
        else if(video_encoder_type_ == (int)PB_VIDEO_ENCODER_TYPE.VIDEO_ENCODER_HARDWARE_HEVC)
        {
            int hevcHWKbps = setHardwareEncoderKbps(false, video_width_, video_height_);
            hevcHWKbps = hevcHWKbps*fps/25;

            Debug.Log("hevcHWKbps: " + hevcHWKbps);

            int isSupportHevcHWEncoder = NT_PB_U3D_SetVideoHevcHWEncoder(pusher_handle_, hevcHWKbps);

            if (isSupportHevcHWEncoder == 0) {
                NT_PB_U3D_SetNativeMediaNDK(pusher_handle_, 0);
                NT_PB_U3D_SetVideoHWEncoderBitrateMode(pusher_handle_, 0); // 0:CQ, 1:VBR, 2:CBR
                NT_PB_U3D_SetVideoHWEncoderQuality(pusher_handle_, 39);

                // NT_PB_U3D_SetVideoHWEncoderMaxBitrate(pusher_handle_, ((long)hevcHWKbps)*1200);

                Debug.Log("Great, it supports hevc hardware encoder!");
            }
        }
        else 
        {
            if (is_sw_vbr_mode_) //H.264 software encoder
            {
                int is_enable_vbr = 1;
                int video_quality = CalVideoQuality(video_width_, video_height_, true);
                int vbr_max_bitrate = CalVbrMaxKBitRate(video_width_, video_height_);
                vbr_max_bitrate = vbr_max_bitrate * fps / 25;

                NT_PB_U3D_SetSwVBRMode(pusher_handle_, is_enable_vbr, video_quality, vbr_max_bitrate);
                //NT_PB_U3D_SetSWVideoEncoderSpeed(pusher_handle_, 2);
            }
        }

        NT_PB_U3D_SetAudioCodecType(pusher_handle_, 1);

        NT_PB_U3D_SetFPS(pusher_handle_, fps);

        NT_PB_U3D_SetGopInterval(pusher_handle_, gop);

        if (audio_push_type_ == (int)PB_AUDIO_OPTION.AUDIO_OPTION_MIC_EXTERNAL_PCM_MIXER
            || audio_push_type_ == (int)PB_AUDIO_OPTION.AUDIO_OPTION_TWO_EXTERNAL_PCM_MIXER)
        {
            NT_PB_U3D_SetAudioMix(pusher_handle_, 1);
        }
        else
        {
            NT_PB_U3D_SetAudioMix(pusher_handle_, 0);
        }
    }

投遞video數(shù)據(jù)的邏輯實現(xiàn)如下:

    void PostVideoData() {
        if(pusher_handle_ == 0)
            return;

        if(!is_pushing_rtmp_ && !is_rtsp_publisher_running_)
            return;

        if (textures_poll_ == null)
           return;

        int w = camera_.pixelWidth;
        int h = camera_.pixelHeight;

       if (w != video_width_ || h != video_height_) {

           Debug.Log("PostVideoData resolution changed++ width: " + w + " height: " + h);
           if(render_texture_ != null) {
               render_texture_.Release();
               render_texture_ = null;
           }

           video_width_  = w;
           video_height_ = h;
       }

       if (null == render_texture_ ) {
           render_texture_ = new RenderTexture(video_width_, video_height_, 16);
           render_texture_.Create();
       }

       Texture2D image_texture = textures_poll_.get(video_width_, video_height_);
        if (null == image_texture)
           return;

         ...

        image_texture.ReadPixels(new Rect(0, 0, video_width_, video_height_), 0, 0, false);

         ...

        post_image_worker_.post(image_texture, is_vertical_flip_, is_horizontal_flip_, scale_width_, scale_height_);
    }

如果需要停止RTMP推送:

    private void StopRtmpPusher()
    {
        if(!is_pushing_rtmp_)
            return;

        NT_PB_U3D_StopPublisher(pusher_handle_);

        if(!is_rtsp_publisher_running_)
        {
            NT_PB_U3D_Close(pusher_handle_);
            pusher_handle_ = 0;

            NT_PB_U3D_UnInit();
        }

        is_pushing_rtmp_ = false;
    }

技術(shù)總結(jié)

Unity3D下采集camera場景并推送RTMP具有重要的意義,可以為實時監(jiān)控、在線直播、視頻教程制作、增強(qiáng)現(xiàn)實和虛擬現(xiàn)實應(yīng)用以及數(shù)據(jù)記錄和分析等領(lǐng)域提供有力的支持。比如,采集camera場景可以用于增強(qiáng)現(xiàn)實和虛擬現(xiàn)實應(yīng)用。在AR中,可以通過采集實際場景的畫面,將虛擬元素與現(xiàn)實場景進(jìn)行融合,增強(qiáng)沉浸感和互動性。文章來源地址http://www.zghlxwxcb.cn/news/detail-690204.html

到了這里,關(guān)于Unity3D下如何采集camera場景數(shù)據(jù)并推送RTMP服務(wù)?的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Unity3D學(xué)習(xí)記錄02——PloyBrush場景搭建

    Unity3D學(xué)習(xí)記錄02——PloyBrush場景搭建

    首先在Window-Package Manager里面搜索Poly Brush,下載后將URP的Shader樣例導(dǎo)入 ?導(dǎo)入后Asset文件夾下會有Sample的文件夾,在菜單欄 Tools-PolyBrush-PolyBrush Window 打開窗口 這個窗口最上面的五個,第一個是用來調(diào)整地形高低的,第二個是進(jìn)行柔化場景的,第三個是調(diào)整顏色的, 第四個可以

    2024年02月08日
    瀏覽(96)
  • Unity3D項目之游戲場景小地圖制作

    Unity3D項目之游戲場景小地圖制作

    創(chuàng)建一個場景資源,可在asset store資源商店下載,選擇心儀場景。 鏈接:https://assetstore.unity.com/?locale=zh-CN 添加一個對象GameObject,命名為player,子物體包括:主攝像機(jī),角色,后面步驟會添加一個plane。 添加一個地圖攝像機(jī),命名為MapCamera。修改屬性projection為OrthoGraphic;Size為

    2024年02月11日
    瀏覽(285)
  • Unity3D制作注冊登錄界面,并實現(xiàn)場景跳轉(zhuǎn)

    Unity3D制作注冊登錄界面,并實現(xiàn)場景跳轉(zhuǎn)

    效果預(yù)覽圖片: 效果預(yù)覽視頻: 一、新建項目工程 1、打開Unity3D,新建一個項目,將其命名為“Login”。我這里用的版本是Unity2018.4.2f1,不同版本制作過程中的界面可能稍有不同,但是不影響具體功能的實現(xiàn)。 2、可以將樣例場景SampleScene重命名為Login,最好做到見名知意。

    2024年02月03日
    瀏覽(141)
  • Unity3D在車載導(dǎo)航系統(tǒng)的應(yīng)用場景淺談

    Unity3D在車載導(dǎo)航系統(tǒng)的應(yīng)用場景非常廣泛,它可以為車載導(dǎo)航系統(tǒng)帶來更加逼真、直觀和準(zhǔn)確的使用體驗。以下是幾個具體的應(yīng)用場景: 3D地圖導(dǎo)航:Unity3D的實時3D渲染能力使得車載導(dǎo)航系統(tǒng)可以實現(xiàn)3D地圖導(dǎo)航功能。通過Unity3D,可以生成超寫實風(fēng)格的3D地圖,提供更加逼真

    2024年01月23日
    瀏覽(97)
  • Unity3D學(xué)習(xí)記錄01:URP渲染管線以及3D游戲場景設(shè)置

    Unity3D學(xué)習(xí)記錄01:URP渲染管線以及3D游戲場景設(shè)置

    以下內(nèi)容所使用的版本均為Unity2022.3 先在 Window-Package Manager-Unity Registry 里面搜索添加Universal RP ? Unity中,創(chuàng)建渲染管線的方式為Asset文件夾下右鍵 Create-Readering-URP Asset(with Universal Asset) 會創(chuàng)建以下兩個Pipeline: ?接著在圖中的設(shè)置里添加這兩個渲染管線(Project Setting在Edit窗口下

    2024年02月08日
    瀏覽(102)
  • Unity3D教程:觸發(fā)器實現(xiàn)簡單的場景跳轉(zhuǎn)

    Unity3D教程:觸發(fā)器實現(xiàn)簡單的場景跳轉(zhuǎn)

    首先,需確保有一個想要跳轉(zhuǎn)的目標(biāo)場景。在本案例中,目標(biāo)場景是ending。 第一步:創(chuàng)建一個碰撞體,放置在需要的觸發(fā)場景跳轉(zhuǎn)的位置。 第二步:刪除多余的腳本,并且新建自己的腳本: 第三

    2024年02月12日
    瀏覽(24)
  • 【Unity3D】資源文件 ② ( Unity 中場景文件簡介 | 查看場景文件內(nèi)容 | 場景文件相關(guān)操作 | 創(chuàng)建場景 | 打開場景 )

    【Unity3D】資源文件 ② ( Unity 中場景文件簡介 | 查看場景文件內(nèi)容 | 場景文件相關(guān)操作 | 創(chuàng)建場景 | 打開場景 )

    Unity 編輯器中的 場景文件 是以 \\\" .unity \\\" 為后綴的文件 , 該文件中會記錄所有 游戲物體 GameObject , 以及游戲物體的相關(guān)數(shù)據(jù) , 如下內(nèi)容都是存儲在 場景文件 中的 : 游戲物體 GameObject 節(jié)點 : 在 Hierarchy 層級窗口 中 場景文件 下的各個節(jié)點 都是游戲物體 , 如 主攝像機(jī) , 光源 , 立

    2024年02月09日
    瀏覽(93)
  • GameFrameWork框架(Unity3D)使用筆記(八) 實現(xiàn)場景加載進(jìn)度條

    GameFrameWork框架(Unity3D)使用筆記(八) 實現(xiàn)場景加載進(jìn)度條

    ? ? ? ? 游戲在轉(zhuǎn)換場景的時候,需要花費(fèi)時間來加載相關(guān)的資源。而這個過程往往因為游戲場景的規(guī)模和復(fù)雜度以及玩家電腦配置的原因花費(fèi)一小段時間(雖然這個項目里用不到)。 ? ? ? ? 所以,如果這一小段時間,畫面就卡在這里,啥也做不了,玩家也不知道啥時候能

    2024年02月02日
    瀏覽(25)
  • Unity3d 獲取場景中攝像頭視頻流,實現(xiàn)直播效果(無需代碼)

    Unity3d 獲取場景中攝像頭視頻流,實現(xiàn)直播效果(無需代碼)

    下面是具體操作流程: ? 1. 搭建服務(wù)器,選用github 一個開源的 node.js服務(wù)器。 下載地址GitHub - iizukanao/node-rtsp-rtmp-server: RTSP/RTMP/HTTP hybrid server,點擊克隆,選擇ZIP下載。? 2. 下載node.js( 官網(wǎng)鏈接 Node.js) ? 選擇下載最新版本,并根據(jù)提示一步步安裝即可。 3.搭建服務(wù)器。 找到

    2023年04月08日
    瀏覽(27)
  • Unity3d C#實現(xiàn)場景編輯/運(yùn)行模式下3D模型XYZ軸混合一鍵排序功能(含源碼工程)

    Unity3d C#實現(xiàn)場景編輯/運(yùn)行模式下3D模型XYZ軸混合一鍵排序功能(含源碼工程)

    在部分場景搭建中需要整齊擺放一些物品(如倉庫中的貨堆、貨架等),因為有交互的操作在單個模型上,每次總是手動拖動模型操作起來也是繁瑣和勞累。 在這背景下,我編寫了一個在運(yùn)行或者編輯狀態(tài)下都可以進(jìn)行一鍵排序模型的腳步。方便在場景搭建時,可以快速搭建

    2024年01月17日
    瀏覽(106)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包