最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

wpf實(shí)現(xiàn)超低延遲的RTMP或RTSP播放

 更新時(shí)間:2024年04月11日 08:24:17   作者:音視頻牛哥  
這篇文章主要為大家詳細(xì)介紹了wpf如何實(shí)現(xiàn)超低延遲的RTMP或RTSP播放,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

?技術(shù)背景

我們?cè)谧鯳indows平臺(tái)RTMP和RTSP播放模塊對(duì)接的時(shí)候,有開發(fā)者需要在wpf下調(diào)用,如果要在wpf下使用,只需要參考C#的對(duì)接demo即可,唯一不同的是,視頻流數(shù)據(jù)顯示的話,要么通過控件模式,要么可以讓RTMP、RTSP播放模塊回調(diào)rgb數(shù)據(jù)上來,在wpf直接繪制即可。

技術(shù)實(shí)現(xiàn)

本文以大牛直播SDK的Windows平臺(tái)SmartPlayer為例,回調(diào)數(shù)據(jù)的模式,其他不再說明,只要處理好上來的數(shù)據(jù)就好:

播放之前,設(shè)置回調(diào),選擇NT_SP_E_VIDEO_FRAME_FORMAT_RGB32:

video_frame_call_back_ = new SP_SDKVideoFrameCallBack(SetVideoFrameCallBack);

NTSmartPlayerSDK.NT_SP_SetVideoFrameCallBack(player_handle_, (Int32)NT.NTSmartPlayerDefine.NT_SP_E_VIDEO_FRAME_FORMAT.NT_SP_E_VIDEO_FRAME_FORMAT_RGB32, IntPtr.Zero, video_frame_call_back_);

處理rgb數(shù)據(jù)回調(diào):

       /*
        * nt_player_wrapper.cs
        * Author: daniusdk.com
        */
        public void SetVideoFrameCallBack(IntPtr handle, IntPtr userData, UInt32 status, IntPtr frame)
        {
            if (frame == IntPtr.Zero)
            {
                return;
            }

            //如需直接處理RGB數(shù)據(jù),請(qǐng)參考以下流程
            NT_SP_VideoFrame video_frame = (NT_SP_VideoFrame)Marshal.PtrToStructure(frame, typeof(NT_SP_VideoFrame));

            if (video_frame.format_ != (Int32)NT.NTSmartPlayerDefine.NT_SP_E_VIDEO_FRAME_FORMAT.NT_SP_E_VIDEO_FRAME_FORMAT_RGB32)
                return;

            NT_SP_VideoFrame pVideoFrame = new NT_SP_VideoFrame();

            pVideoFrame.format_ = video_frame.format_;
            pVideoFrame.width_ = video_frame.width_;
            pVideoFrame.height_ = video_frame.height_;

            pVideoFrame.timestamp_ = video_frame.timestamp_;
            pVideoFrame.stride0_ = video_frame.stride0_;
            pVideoFrame.stride1_ = video_frame.stride1_;
            pVideoFrame.stride2_ = video_frame.stride2_;
            pVideoFrame.stride3_ = video_frame.stride3_;


            Int32 argb_size = video_frame.stride0_ * video_frame.height_;

            pVideoFrame.plane0_ = Marshal.AllocHGlobal(argb_size);
            CopyMemory(pVideoFrame.plane0_, video_frame.plane0_, (UInt32)argb_size);
        }

另外一種,可以用picturebox,在MainWindow.xaml 做以下設(shè)置:

        <WindowsFormsHost HorizontalAlignment="Left" Height="338" Margin="10,10,0,0" VerticalAlignment="Top" Width="480" Background="Black">
            <wf:PictureBox x:Name="RealPlayWnd"></wf:PictureBox>
        </WindowsFormsHost>

為了便于多實(shí)例集成參考,以播放2路為例(一路2560*1440,一路1920*1080):

具體實(shí)現(xiàn)如下:

       /*
        * MainWindow.xaml.cs
        * Author: daniusdk.com
        */
        public MainWindow()
        {
            InitializeComponent();

            if (!InitSDK())
                return;

            UIDispatcher = Dispatcher.CurrentDispatcher;

            player1_ = new nt_player_wrapper(RealPlayWnd, UIDispatcher);
            player1_.EventGetPlayerEventMsg += new DelGetPlayerEventMsg(GetPlayerEventMsgInfo);
            player1_.EventGetVideoSize += new DelGetVideoSize(GetVideoSize);

            player2_ = new nt_player_wrapper(RealPlayWnd1, UIDispatcher);
            player2_.EventGetPlayerEventMsg += new DelGetPlayerEventMsg(GetPlayerEventMsgInfo);
            player2_.EventGetVideoSize += new DelGetVideoSize(GetVideoSize);
        }

        private void GetPlayerEventMsgInfo(IntPtr handle, String msg)
        {
            this.Dispatcher.Invoke((Action)delegate()
            {
                event_label.Content = msg;
            });
        }

        private void GetVideoSize(IntPtr handle, String size)
        {
            this.Dispatcher.Invoke((Action)delegate()
            {
                video_size.Content = size;
            });
        }

        private bool InitSDK()
        {
            if (!is_player_sdk_init_)
            {
                UInt32 isPlayerInited = NT.NTSmartPlayerSDK.NT_SP_Init(0, IntPtr.Zero);
                if (isPlayerInited != 0)
                {
                    MessageBox.Show("調(diào)用NT_SP_Init失敗..");
                    return false;
                }

                is_player_sdk_init_ = true;
            }

            return true;
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            if (!player1_.IsPlaying())
            {
                player1_.SetBuffer(0);
                bool is_mute = true;

                if (!player1_.StartPlay("rtsp://admin:daniulive12345@192.168.0.120:554/h264/ch1/main/av_stream", false, is_mute))
                    return;

                btn_playback1.Content = "停止播放";
            }
            else
            {
                player1_.StopPlay();
                btn_playback1.Content = "開始播放";
            }
        }

        private void Button_Click_2(object sender, RoutedEventArgs e)
        {
            if (!player2_.IsPlaying())
            {
                player2_.SetBuffer(0);
                bool is_mute = true;

                if (!player2_.StartPlay("rtsp://admin:admin123456@192.168.0.121:554/cam/realmonitor?channel=1&subtype=0", false, is_mute))
                    return;

                btn_playback2.Content = "停止播放";
            }
            else
            {
                player2_.StopPlay();
                btn_playback2.Content = "開始播放";
            }
        }

        protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
        {
            if (MessageBox.Show("確定要關(guān)閉窗口嗎?", "確認(rèn)", MessageBoxButton.YesNo) != MessageBoxResult.Yes)
            {
                // 如果用戶選擇“否”,取消關(guān)閉
                e.Cancel = true;
            }

            if (player1_.IsPlaying())
            {
                player1_.StopPlay();
            }

            player1_.Dispose();

            if (player2_.IsPlaying())
            {
                player2_.StopPlay();
            }

            player2_.Dispose();

            if (is_player_sdk_init_)
            {
                NTSmartPlayerSDK.NT_SP_UnInit();
                is_player_sdk_init_ = false;
            }    

            base.OnClosing(e);
        }

延遲依舊毫秒級(jí),CPU占用如下,如果用硬解碼,體驗(yàn)會(huì)更好:

SmartPlayer以跨平臺(tái)的RTSP播放器為例,我們實(shí)現(xiàn)的功能如下,如不單獨(dú)說明,系Windows、Linux、Android、iOS全平臺(tái)支持:

  • [支持播放協(xié)議]高穩(wěn)定、超低延遲、業(yè)內(nèi)首屈一指的RTSP直播播放器SDK;
  • [多實(shí)例播放]支持多實(shí)例播放;
  • [事件回調(diào)]支持網(wǎng)絡(luò)狀態(tài)、buffer狀態(tài)等回調(diào);
  • [視頻格式]支持H.265、H.264,此外,還支持RTSP MJPEG播放;
  • [音頻格式]支持AAC/PCMA/PCMU;
  • [H.264/H.265軟解碼]支持H.264/H.265軟解;
  • [H.264硬解碼]Windows/Android/iOS支持特定機(jī)型H.264硬解;
  • [H.265硬解]Windows/Android/iOS支持特定機(jī)型H.265硬解;
  • [H.264/H.265硬解碼]Android支持設(shè)置Surface模式硬解和普通模式硬解碼;
  • [RTSP模式設(shè)置]支持RTSP TCP/UDP模式設(shè)置;
  • [RTSP TCP/UDP自動(dòng)切換]支持RTSP TCP、UDP模式自動(dòng)切換;
  • [RTSP超時(shí)設(shè)置]支持RTSP超時(shí)時(shí)間設(shè)置,單位:秒;
  • [RTSP 401認(rèn)證處理]支持上報(bào)RTSP 401事件,如URL攜帶鑒權(quán)信息,會(huì)自動(dòng)處理;
  • [緩沖時(shí)間設(shè)置]支持buffer time設(shè)置;
  • [首屏秒開]支持首屏秒開模式;
  • [復(fù)雜網(wǎng)絡(luò)處理]支持?jǐn)嗑W(wǎng)重連等各種網(wǎng)絡(luò)環(huán)境自動(dòng)適配;
  • [快速切換URL]支持播放過程中,快速切換其他URL,內(nèi)容切換更快;
  • [音視頻多種render機(jī)制]Android平臺(tái),視頻:surfaceview/OpenGL ES,音頻:AudioTrack/OpenSL ES;
  • [實(shí)時(shí)靜音]支持播放過程中,實(shí)時(shí)靜音/取消靜音;
  • [實(shí)時(shí)音量調(diào)節(jié)]支持播放過程中實(shí)時(shí)調(diào)節(jié)音量;
  • [實(shí)時(shí)快照]支持播放過程中截取當(dāng)前播放畫面;
  • [只播關(guān)鍵幀]Windows平臺(tái)支持實(shí)時(shí)設(shè)置是否只播放關(guān)鍵幀;
  • [渲染角度]支持0°,90°,180°和270°四個(gè)視頻畫面渲染角度設(shè)置;
  • [渲染鏡像]支持水平反轉(zhuǎn)、垂直反轉(zhuǎn)模式設(shè)置;
  • [等比例縮放]支持圖像等比例縮放繪制(Android設(shè)置surface模式硬解模式不支持);
  • [實(shí)時(shí)下載速度更新]支持當(dāng)前下載速度實(shí)時(shí)回調(diào)(支持設(shè)置回調(diào)時(shí)間間隔);
  • [解碼前視頻數(shù)據(jù)回調(diào)]支持H.264/H.265數(shù)據(jù)回調(diào);
  • [解碼后視頻數(shù)據(jù)回調(diào)]支持解碼后YUV/RGB數(shù)據(jù)回調(diào);
  • [解碼前音頻數(shù)據(jù)回調(diào)]支持AAC/PCMA/PCMU數(shù)據(jù)回調(diào);
  • [音視頻自適應(yīng)]支持播放過程中,音視頻信息改變后自適應(yīng);
  • [擴(kuò)展錄像功能]完美支持和錄像模塊組合使用。

總結(jié)

Windows平臺(tái)下如果需要wpf播放,如果需要更靈活,可以采用回調(diào)rgb數(shù)據(jù)的模式,上層直接繪制,只是低延遲的播放出來畫面,采用上述控件模式亦可,除了wpf外,我們提供了C++和C#的接口和demo,感興趣的開發(fā)者,可以嘗試看看,有問題可以單獨(dú)跟我溝通。

到此這篇關(guān)于wpf實(shí)現(xiàn)超低延遲的RTMP或RTSP播放的文章就介紹到這了,更多相關(guān)wpf延遲播放內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C# Struct的內(nèi)存布局問題解答

    C# Struct的內(nèi)存布局問題解答

    這篇文章介紹了C# Struct的內(nèi)存布局問題解答,有需要的朋友可以參考一下
    2013-11-11
  • C#動(dòng)態(tài)繪制多條曲線的方法

    C#動(dòng)態(tài)繪制多條曲線的方法

    這篇文章主要為大家詳細(xì)介紹了C#動(dòng)態(tài)繪制多條曲線的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C#創(chuàng)建一個(gè)Word并打開的方法

    C#創(chuàng)建一個(gè)Word并打開的方法

    這篇文章主要介紹了C#創(chuàng)建一個(gè)Word并打開的方法,實(shí)例分析了C#操作word的常用技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04
  • C#獲取文件夾及文件的大小與占用空間的方法

    C#獲取文件夾及文件的大小與占用空間的方法

    這篇文章主要介紹了C#獲取文件夾及文件的大小與占用空間的方法,需要的朋友可以參考下
    2014-07-07
  • Unity3D動(dòng)態(tài)生成平面網(wǎng)格

    Unity3D動(dòng)態(tài)生成平面網(wǎng)格

    這篇文章主要為大家詳細(xì)介紹了Unity3D動(dòng)態(tài)生成平面網(wǎng)格,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • C#實(shí)現(xiàn)文件Move和Copy操作

    C#實(shí)現(xiàn)文件Move和Copy操作

    這篇文章介紹了C#實(shí)現(xiàn)文件Move和Copy操作的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • C#實(shí)現(xiàn)定義一個(gè)通用返回值

    C#實(shí)現(xiàn)定義一個(gè)通用返回值

    這篇文章主要介紹了C#如何實(shí)現(xiàn)自定義一個(gè)比較通用的返回值對(duì)象,然后使用泛型來傳遞需要return的數(shù)據(jù)。文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-09-09
  • 一文探索C#中實(shí)現(xiàn)雙向鏈表的方法

    一文探索C#中實(shí)現(xiàn)雙向鏈表的方法

    這篇文章主要為大家詳細(xì)介紹了C#中的雙向鏈表的實(shí)現(xiàn),揭秘雙向鏈表內(nèi)實(shí)現(xiàn)諸多方法的那些事,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • C# GC回收的方法實(shí)現(xiàn)

    C# GC回收的方法實(shí)現(xiàn)

    本文主要介紹了C# GC回收的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-11-11
  • C# winfrom 模擬ftp文件管理實(shí)現(xiàn)代碼

    C# winfrom 模擬ftp文件管理實(shí)現(xiàn)代碼

    從網(wǎng)上找到的非常好用的模擬ftp管理代碼,整理了一下,希望對(duì)需要的人有幫助
    2014-01-01

最新評(píng)論

天台县| 十堰市| 通江县| 大方县| 封开县| 日喀则市| 五台县| 梨树县| 旅游| 乳山市| 保定市| 黄陵县| 大英县| 夏河县| 饶平县| 咸阳市| 吴桥县| 夹江县| 城口县| 大化| 光泽县| 岳普湖县| 平乐县| 得荣县| 桂平市| 舞钢市| 新余市| 江源县| 丰原市| 建湖县| 襄垣县| 大兴区| 哈巴河县| 洛阳市| 尤溪县| 尉氏县| 公主岭市| 鄂托克前旗| 罗城| 德阳市| 西乌|