NVIDIA CUVID硬件解碼 - cuvidCreateVideoSource() 捕捉rtsp流

        寫這篇文章是應爲之前的網上很多文章分析:

        cuvidCreateVideoSource( )這個函數不支持一些視頻流:rtsp類型過來的視頻信號。

        在NVIDIA的Decode實例中使用的是本地的視頻文件:1080.246,720.mp4等視頻文件。創建視頻源用的是本地文件。        調試開發環境:

        1,Jetson TX1 上安裝live555作爲視頻服務器。                                

        2,臺式機帶有GT1050 ti的顯卡。ubunut 16.04。點播視頻流H264格式。        

        開始調試嘗試了ffmpeg + cuvid的方案(ffmpeg代碼沒時間仔細研究),沒有成功。後來找了幾篇文章在網上可以使用opencv中的使用。opencv可以直接通過VideoCapture這個類來完成rtsp數據協議解析:          

        cv::Ptr<cv::cudacodec::VideoReader> d_reader = cv::cudacodec::createVideoReader(fname);      

         隨後跟蹤代碼:

Ptr<VideoReader> cv::cudacodec::createVideoReader(const String& filename)

{    

    CV_Assert( !filename.empty() );  

    Ptr<VideoSource> videoSource;  

    try    {      

        videoSource.reset(new CuvidVideoSource(filename));  

   }    catch (...)  

   {        

       Ptr<RawVideoSource> source(new FFmpegVideoSource(filename));        

       videoSource.reset(new RawVideoSourceWrapper(source));   

    }    

    return makePtr<VideoReaderImpl>(videoSource);

}        

        這個函數在cudacodec::命名空間下,調用了兩個函數,一個是try語句,還有一個catch。CuvidVideoSource不成功,然後捕捉執行FFmpegVideoSource。      

        看下CuvidVideoSource函數,最後執行:CUresult cuRes = cuvidCreateVideoSource(&videoSource_, fname.c_str(), &params);        

        這個cuvidCreateVideoSource函數在NIVIDA的cuda安裝包中的一個動態庫,沒有給源碼,給了文檔和demo。這裏沒有看明白可以仔細看一下傳入的參數,字符串描述了不同的視頻源。可以是本地文件比如:/media/test/1080.264文件,也可以是rtsp://xxx.xxx.xxx.xxx/test/1080.264。這樣分析下來這個cuda安裝包中的函數實現了簡單的rtsp協議,並且可以解析網絡視頻流。       不用使用額外任何第三方庫,只用opencv就可以做解碼數據流的功能。最後不得不感嘆一下opencv確實一款不折不扣的好軟件,關鍵還是開源的。通過nivida-smi查看GPU在編解碼時候使用資源的情況。

      貼上demo效果,可以通過nivida-smi查看GPU消耗的資源。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章