亚洲精品中文免费|亚洲日韩中文字幕制服|久久精品亚洲免费|一本之道久久免费

      
      

            <dl id="hur0q"><div id="hur0q"></div></dl>

                ffmpeg + cuda(cuvid) 硬解碼+像素格式轉換(cpu主導)實戰(zhàn)

                ffmpeg + cuda(cuvid) 硬解碼+像素格式轉換(cpu主導)實戰(zhàn)

                注意:

                VAAPI 是inter gpu 提供的硬編解碼接口VDPAU 是 video decode present api for unixnvdec / ncvid 都是nivida產出的硬解接口,區(qū)別在于解碼方式,和數據傳輸方式不同nvenc nivida 硬編接口

                編譯 & 運行

                linux: gcc -g video_decode_gpu.c `pkg-config –libs libavformat libavcodec libswresample libswscale libavutil` -o video_decode_gpurun cmd: ./video_decode_gpu data/left.mp4 ./bmp

                gpu解碼原理

                問題1? gpu 解碼 是把內存中AVPacket 拷貝到gp顯存中進行處理的嗎? 看來是的,代碼中通過 av_read_frame(input_ctx, &packet) 讀取數據包,其數據操作流向應該是 video file -> memory問題2? gpu 解碼 的 數據流向? videofile-> avpacket ->decoding frame’s in gpu-> transfer rame in gpu into host memory問題3? gpu 解碼數據 cuvid 解碼器,也是api,對應的數據操作流向? videofile-> avpacket ->decoding frame’s in gpu-> transfer rame in gpu into host memory

                VDPAU 簡介

                Developed by NVIDIA for Unix/Linux systems. To enable this you typically need the libvdpau development package in your distribution, and a compatible graphics card. Note that VDPAU cannot be used to decode frames in memory, the compressed frames are sent by libavcodec to the GPU device supported by VDPAU and then the decoded image can be accessed using the VDPAU API. This is not done automatically by FFmpeg, but must be done at the application level (check for example the ffmpeg_vdpau.c file used by ffmpeg.c). Also, note that with this API it is not possible to move the decoded frame back to RAM, for example in case you need to encode again the decoded frame (e.g. when doing transcoding on a server). Several decoders are currently supported through VDPAU in libavcodec, in particular H.264, MPEG-1/2/4, and VC-1. 翻譯: 由NVIDIA開發(fā)的Unix / Linux系統(tǒng)。 要啟用此功能,您通常需要分發(fā)中的libvdpau開發(fā)包和兼容的圖形卡。 注意,VDPAU不能用于解碼內存中的幀,壓縮幀由libavcodec發(fā)送到VDPAU支持的GPU設備,然后可以使用VDPAU API訪問解碼圖像。 這不是由FFmpeg自動完成的,但必須在應用程序級別完成(例如檢查ffmpeg.c使用的ffmpeg_vdpau.c文件)。此外,請注意,使用此API時,無法將解碼后的幀移回RAM,例如,如果您需要再次對解碼幀進行編碼(例如,在服務器上進行轉碼時)。 目前通過libavcodec中的VDPAU支持幾個解碼器,特別是H.264,MPEG-1/2/4和VC-1。

                VDPAU 學習:

                VdpDecoder -> 解碼 壓縮包數據VdpVideoSurface -> 解碼完數據放置的空間VdpVideoMixer -> 對解碼完的數據做后置處理VdpOutputSurface -> 處理完數據放置的位置

                cuvid 與 VDPAU 是平級的東西,不能拿來直接使用,使用成本太大

                cuvid 學習

                cuvid nvidia 提供的gpu 視頻硬解碼庫,底層依賴cuda并行計算框架 將cpu 解碼轉化到gpu 解碼上,減少cpu壓力,提升解碼速度

                CUVID 硬解碼

                note:

                cuvid nvdec 兩者都是解碼api,不同點在于解碼方式 & 數據傳輸nvenc vaapi cdpau 都是硬件編解碼api

                CUVID解碼rtsp視頻流

                note

                OpenCV中VideoReader_GPU可以方便地利用GPU讀取視頻文件,加速解碼過程,但OpenCV中VideoReader_GPU無法讀取rtsp視頻流數據。

                這是因為CUVID中CuvideoSource不支持rtsp視頻流數據,不能由rtsp地址創(chuàng)建VideoSource。

                但是videoSource 支持 視頻文件

                查看nvidia 驅動 & nvcc 版本

                cat /proc/driver/nvidia/version nvcc編譯器的版本nvcc -V

                Note: For Video Codec SDK 7.0 and later, NVCUVID has been renamed to NVDECODE API.

                編譯 & 運行

                領取C++音視頻開發(fā)學習資料:點擊 音視頻開發(fā)(資料文檔+視頻教程+面試題)(FFmpeg+WebRTC+RTMP+RTSP+HLS+RTP)

                編譯

                linux: gcc -g hw_decode_cuvid.c `pkg-config –libs libavformat libavcodec libswresample libswscale libavutil` -o hw_decode_cuvid

                運行

                ./hw_decode_cuvid cuda input_data/left.mp4 ./output_data/raw.out

                運行結果

                raw.out 文件生成

                raw.out 文件生成

                cpu 軟解碼 cpu 占用率

                cpu 軟解碼 cpu使用率g

                gpu cuvid 硬解碼 cpu 占用率

                gpu 硬解碼 cpu使用率

                gpu 硬解碼 gpu 使用情況

                gpu 硬解碼 gpu 使用情況

                問題:

                1、為什么 gpu 硬解碼顯卡使用率那么低?需要排查下問題。

                2、將 gpu 中frame 直接做 AV_PIX_FMT_CUDA-> AV_PIX_FMT_BGR24 轉化 不能直接用 sws_getContext ,如何才能實現

                3、ffmpeg 將 gpu解碼 數據的像素格式進行 yuv-rgb 格式轉換 ,是否直接支持,是否需要自己寫函數

                4、將 gpu 中數據直接存儲在磁盤上? 如果不可以的話 ,則進行 device data ->host memory data ->file

                5、數據拷貝方式 transfer_data_from 源碼

                gpu decoded frame pix format AV_PIX_FMT_CUDA 直接在顯存中 轉化為 AV_PIX_FMT_BGR24

                可行路徑,試了三種:

                兩種cpu層面轉換像素格式 的方法(1種失敗,1種成功);直接使用ffmpeg api 在gpu層面進行像素格式轉換(失敗)

                CPU 主導像素轉換

                1. 使用 sws_scale 實現 AV_PIX_FMT_CUDA-> AV_PIX_FMT_BGR24 的直接轉換(cpu 層面)

                這是我第一次使用的方式,模仿 cpu 上軟解碼(獲取視頻幀,并存儲為bmp格式,經驗原則,這種方式最容易想到)運行結果:失敗,bad src img pointers運行結果如下圖所示:

                問題原因:

                如代碼 hw_decode_cuvid_origin.c 中所示, 直接通過transfer_data 將gpu 中解碼后的frame download到系統(tǒng)內存,則系統(tǒng)內存中的frames piex->format 仍為 AV_PIX_FMT_CUDA ,而 AV_PIX_FMT_CUDA 是gpu 顯存中存儲的解碼后的幀像素格式所以通過 sws_scale 是不能直接change的

                GPU 主導像素轉換

                gpu 不支持 sws_scale + AV_PIX_FMT_CUDA-> AV_PIX_FMT_BGR24 的直接像素轉換方式,那么 能否直接在gpu中直接轉化 AV_PIX_FMT_CUDA 為 AV_PIX_FMT_BGR24呢?如果可以直接實現,性能會有很大提升,因為減少了device->host 的數據傳輸,且gpu多核心并行處理,肯定比cpu處理性能要強悍。

                av_hwframe_transfer_data() 執(zhí)行操作前 設置 內存中目標frame的像素格式為 AV_PIX_FMT_BGR24,gpu 黑盒操作實現在gpu上直接將像素格式轉化為目標bgr24格式

                運行結果:失敗,像素沒對齊,只有亮度運行結果如下圖所示:![預先設置內存中frame目標像素格式為 AV_PIX_FMT_BGR24]

                問題原因:如下圖所示:

                問題原因-transfer_data_pix_format_limit

                紅框表示的意思為:src->frame->format 轉換為 dst->frame->format 是受限制的,主要是受av_hwframe_transfer_get_formats() 函數返回的formats 列表限制

                所以gdb了下源碼,發(fā)現src->frame->format 轉換為 dst->frame->format 的受限范圍很小,然后找出了 av_hwframe_transfer_get_formats 支持的formats,調試過程如下所示:gdb -tui hw_decode_cuvid (-tui 支持查看源碼)

                gdb_tui.png

                在調用 av_hwframe_transfer_data() 函數處打上斷點,且設置程序運行所需參數

                enter_break_point.png

                run 程序,step 進入函數調用棧

                run & step-run_enter_func_call_stack

                n 單步運行,函數調用至 transfer_data_alloc()

                enter_transfer_data_alloc.png

                領取C++音視頻開發(fā)學習資料:點擊 音視頻開發(fā)(資料文檔+視頻教程+面試題)(FFmpeg+WebRTC+RTMP+RTSP+HLS+RTP)

                發(fā)現 av_hwframe_transfer_get_formats()函數

                find_func_call_av_hwframe_transfer_get_formats.png

                更改 dst->format 的值為<0的值,并打印支持的像素轉換列表

                get_can_changed_pix_formats.png

                可以看到只支持 gpu 硬件像素編碼格式->AV_PIX_FMT_NV12 的轉換

                CPU 主導像素轉換

                經過前兩次的試驗,可以明確當前最新版本的ffmpeg還不支持硬解完成之后直接將像素格式轉換為目標rgb24數據,還是回歸到 cpu + sws_scale 上,經過第二步,可以知道AV_PIX_FMT_CUDA->AV_PIX_FMT_NV12這條路行的通,AV_PIX_FMT_NV12 其實是 YUV 格式的數據,yuv 數據到 rgb 的像素轉換是完全支持的,所以就自然編寫了 AV_PIX_FMT_CUDA->AV_PIX_FMT_NV12->AV_PIX_FMT_BGR24 的代碼,經測試沒問題。當然,不可否認:實現 AV_PIX_FMT_CUDA-> AV_PIX_FMT_NV12->AV_PIX_FMT_BGR24 格式轉換 (cpu 實現 pix format 轉換,這種cpu層面上的像素格式轉換方式比較弱)

                運行結果:成功,如下圖所示:

                鄭重聲明:本文內容及圖片均整理自互聯網,不代表本站立場,版權歸原作者所有,如有侵權請聯系管理員(admin#wlmqw.com)刪除。
                用戶投稿
                上一篇 2022年6月23日 06:13
                下一篇 2022年6月23日 06:13

                相關推薦

                • 筆記本最好配置(目前筆記本最好的配置)

                  本文主要講的是筆記本最好配置,以及和目前筆記本最好的配置相關的知識,如果覺得本文對您有所幫助,不要忘了將本文分享給朋友。 筆記本電腦什么配置好? 01 CPU:這個主要取決于頻率和…

                  2022年11月26日
                • 存儲過程語法(sql server存儲過程語法)

                  今天小編給各位分享存儲過程語法的知識,其中也會對sql server存儲過程語法進行解釋,如果能碰巧解決你現在面臨的問題,別忘了關注本站,現在開始吧! oracle存儲過程基本語法…

                  2022年11月26日
                • 拍照比較好的手機(不打游戲拍照比較好的手機)

                  本文主要講的是拍照比較好的手機,以及和不打游戲拍照比較好的手機相關的知識,如果覺得本文對您有所幫助,不要忘了將本文分享給朋友。 拍照效果最好的手機排行 拍照效果最好的手機排行: 1…

                  2022年11月25日
                • 什么是推廣cpa一篇文章帶你看懂CPA推廣渠道

                  CPA渠道 CPA指的是按照指定的行為結算,可以是搜索,可以是注冊,可以是激活,可以是搜索下載激活,可以是綁卡,實名認證,可以是付費,可以是瀏覽等等。甲乙雙方可以根據自己的情況來定…

                  2022年11月25日
                • 抖音直播帶貨有哪些方法技巧(抖音直播帶貨有哪些痛點)

                  如今抖音這個短視頻的變現能力越來越突顯了,尤其是在平臺上開通直播,更具有超強的帶貨屬性,已經有越來越多的普通人加入到其中了。不過直播帶貨雖然很火,但是也不是每個人都能做好的,那么在…

                  2022年11月24日
                • OPPO Reno9 Pro+硬件規(guī)格強 搭載驍龍8+旗艦處理器

                  OPPO Reno9系列正式發(fā)布,Reno9 Pro+作為三款新機中定位最高的超大杯機型,整體配置較上一代有著大幅度的升級,如果單看硬件配置的話,Reno9 Pro+甚至是目前OP…

                  2022年11月24日
                • 中興Axon40 Ultra航天版將于11月29日正式發(fā)布

                  據中興手機官微爆料,中興Axon40 Ultra航天版將于11月29日正式發(fā)布,新機不僅會采用驍龍?zhí)幚砥?,還將為大家?guī)硪幻丢毩踩酒?,獲得國密認證,擁有安全專利布局,不僅可以大…

                  2022年11月24日
                • 三星tabs8+配置參數 三星tabs8+屏幕尺寸處理器介紹

                  三星Galaxy Tab S8+是2022年3月份上市的一款平板,有很多用戶想了解一下這款平板的配置參數,下面我就給大家提供一下這款平板的參數配置。 三星Galaxy Tab S8…

                  2022年11月24日
                • 兩寸照片大小(兩寸照片大小怎么改到20kb)

                  今天小編給各位分享兩寸照片大小的知識,其中也會對兩寸照片大小怎么改到20kb進行解釋,如果能碰巧解決你現在面臨的問題,別忘了關注本站,現在開始吧! 兩寸照片是多大 2寸照片尺寸大小…

                  2022年11月24日
                • 淘寶直播平臺抽成多少(淘寶直播平臺抽成比例)

                  隨著時代的發(fā)展,現在直播帶貨已經成為主要帶貨方式,其中淘寶是主流帶貨平臺,不少人在上面直播帶貨賺錢,一些小伙伴也想加入,那么淘寶直播平臺抽成多少?下面小編為大家?guī)硖詫氈辈テ脚_抽成…

                  2022年11月24日

                聯系我們

                聯系郵箱:admin#wlmqw.com
                工作時間:周一至周五,10:30-18:30,節(jié)假日休息