Windows Unity3D直播采集rtmp推送

      Windows实现Unity3D采集可以直接调用现有的C#直播库实现,调用现有的C#直播库开发工作量小,难度低,下面就以调用大牛直播SDK(Github)做一个基本的直播采集端:

      这里给出核心的调用代码:

     1. Unity初始化SDK:

    bool InitSDK()
        {
            if (!is_pusher_sdk_init_)
            {
                // 设置日志路径(请确保目录存在)
                String log_path = "D:\\pulisherlog";
                NTSmartLog.NT_SL_SetPath(log_path);
 
                UInt32 isInited = NTSmartPublisherSDK.NT_PB_Init(0, IntPtr.Zero);
 
                if (isInited != 0)
                {
                    Debug.Log("调用NT_PB_Init失败..");
                    return false;
                }
 
                is_pusher_sdk_init_ = true;
            }
 
            return true;
        }

     2. Unity下创建一个推送实例,并配置基本的推送参数:

bool OpenPublisherHandle(uint video_option, uint audio_option)
        {
            if (publisher_handle_ != IntPtr.Zero)
            {
                return true;
            }
 
            publisher_handle_count_ = 0;
 
            if (NTBaseCodeDefine.NT_ERC_OK != NTSmartPublisherSDK.NT_PB_Open(out publisher_handle_,
                video_option, audio_option, 0, IntPtr.Zero))
            {
                return false;
            }
 
            if (publisher_handle_ != IntPtr.Zero)
            {
                pb_event_call_back_ = new NT_PB_SDKEventCallBack(PbEventCallBack);
 
                NTSmartPublisherSDK.NT_PB_SetEventCallBack(publisher_handle_, IntPtr.Zero, pb_event_call_back_);
 
                return true;
            }
            else
            {
                return false;
            }
        }

        void SetCommonOptionToPublisherSDK()
        {
            if (!IsPublisherHandleAvailable())
            {
                Debug.Log("SetCommonOptionToPublisherSDK, publisher handle with null..");
                return;
            }
 
            CameraInfo camera = cameras_[cur_sel_camera_index_];
            NT_PB_VideoCaptureCapability cap = camera.capabilities_[cur_sel_camera_resolutions_index_];
 
            SetVideoCaptureDeviceBaseParameter(camera.id_.ToString(), (UInt32)cap.width_, (UInt32)cap.height_);
 
            SetFrameRate((UInt32)CalBitRate(edit_key_frame_, cap.width_, cap.height_));
 
            SetVideoEncoderType(is_h264_encoder ? 1 : 2);
 
            SetVideoQualityV2(CalVideoQuality(cap.width_, cap.height_, is_h264_encoder));
 
            SetVideoMaxBitRate((CalMaxKBitRate(edit_key_frame_, cap.width_, cap.height_, false)));
 
            SetVideoKeyFrameInterval((edit_key_frame_));
 
            if (is_h264_encoder)
            {
                SetVideoEncoderProfile(1);
 
            }
 
            SetVideoEncoderSpeed(CalVideoEncoderSpeed(cap.width_, cap.height_, is_h264_encoder));
 
            // 音频相关设置
 
            SetAuidoInputDeviceId(0);
 
            SetPublisherAudioCodecType(1);
 
            SetPublisherMute(is_mute);
 
            SetInputAudioVolume(Convert.ToSingle(edit_audio_input_volume_));
        }

     3. Unity下开启直播预览:

        bool StartPreview()
        {
            if(CheckPublisherHandleAvailable() == false)
                return false;
 
            video_preview_image_callback_ = new NT_PB_SDKVideoPreviewImageCallBack(SDKVideoPreviewImageCallBack);
 
            NTSmartPublisherSDK.NT_PB_SetVideoPreviewImageCallBack(publisher_handle_, (int)NTSmartPublisherDefine.NT_PB_E_IMAGE_FORMAT.NT_PB_E_IMAGE_FORMAT_RGB32, IntPtr.Zero, video_preview_image_callback_);
 
            if (NTBaseCodeDefine.NT_ERC_OK != NTSmartPublisherSDK.NT_PB_StartPreview(publisher_handle_, 0, IntPtr.Zero))
            {
                if (0 == publisher_handle_count_)
                {
                    NTSmartPublisherSDK.NT_PB_Close(publisher_handle_);
                    publisher_handle_ = IntPtr.Zero;
                }
 
                return false;
            }
 
            publisher_handle_count_++;
 
            is_previewing_ = true;
 
            return true;
        }
 
        void StopPreview()
        {
            if (is_previewing_ == false) return;
 
            is_previewing_ = false;
 
            publisher_handle_count_--;
            NTSmartPublisherSDK.NT_PB_StopPreview(publisher_handle_);
 
            if (0 == publisher_handle_count_)
            {
                NTSmartPublisherSDK.NT_PB_Close(publisher_handle_);
                publisher_handle_ = IntPtr.Zero;
            }
        }

     4. Unity下设置rtmp推送地址,并开始推送:

        bool StartPublisher(String url)
        {
            if (CheckPublisherHandleAvailable() == false) return false;
 
            if (publisher_handle_ == IntPtr.Zero)
            {
                return false;
            }
            if (!String.IsNullOrEmpty(url))
            {
                NTSmartPublisherSDK.NT_PB_SetURL(publisher_handle_, url, IntPtr.Zero);
            }
 
            if (NTBaseCodeDefine.NT_ERC_OK != NTSmartPublisherSDK.NT_PB_StartPublisher(publisher_handle_, IntPtr.Zero))
            {
                if (0 == publisher_handle_count_)
                {
                    NTSmartPublisherSDK.NT_PB_Close(publisher_handle_);
                    publisher_handle_ = IntPtr.Zero;
                }
 
                is_publishing_ = false;
 
                return false;
            }
 
            publisher_handle_count_++;
 
            is_publishing_ = true;
 
            return true;
        }
 
        void StopPublisher()
        {
            if (is_publishing_ == false) return;
 
            publisher_handle_count_--;
            NTSmartPublisherSDK.NT_PB_StopPublisher(publisher_handle_);
 
            if (0 == publisher_handle_count_)
            {
                NTSmartPublisherSDK.NT_PB_Close(publisher_handle_);
                publisher_handle_ = IntPtr.Zero;
            }
 
            is_publishing_ = false;
        }

     上面就是最核心的代码,调用效果图如下:

    实测下来,和原生sdk推送延时一样低. 如有更多问题,欢迎一起探讨交流q2679481035

你可能感兴趣的:(unity直播推送,unity直播采集,unity,c#)