日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

实现FFMPEG 使用CUDA解码播放

發(fā)布時間:2023/12/13 综合教程 29 生活家
生活随笔 收集整理的這篇文章主要介紹了 实现FFMPEG 使用CUDA解码播放 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

播放器使用ffmpeg讀取視頻文件,packet發(fā)給cuda解碼,解碼后OpenGL直接映射給pbo,pbo綁定texture,然后顯示出來

流程讀取文件,判斷packet,丟到CUDA那

if (av_read_frame(m_pFormatContext, &packet) >= 0)
        {
            if (packet.stream_index == m_VideoStreamIndex)
            {

                if (m_UseGPUDecode)
                {
                    //MiniConsole::getInstance().Output("ThreadDecodeVideoGPU begin  
");
                    ThreadDecodeVideoGPU(packet);

                    //MiniConsole::getInstance().Output("ThreadDecodeVideoGPU  end 
");
                }
                else
                {
                    ThreadDecodeVideoCPU(packet);
                }
                
            }
            else if (packet.stream_index == m_AudioStreamIndex)
            {

                ThreadDecodeAudio(packet);
            }
            else
            {
                av_free_packet(&packet);
            }
        }

數(shù)據(jù)丟給cuvidParseVideoData

CUVIDSOURCEDATAPACKET cudaPkt;
    CUresult oResult;
    if (pData == NULL)
    {
        cudaPkt.flags = CUVID_PKT_ENDOFSTREAM; //end of stream
    }
    else
    {
        cudaPkt.flags = CUVID_PKT_TIMESTAMP;
    }
    cudaPkt.payload_size = (unsigned long)nSize;
    cudaPkt.payload = (const unsigned char*)pData;

    cudaPkt.timestamp = packpts;

    cuCtxPushCurrent(m_cudaResPtr->m_CuContext);

    
    oResult = cuvidParseVideoData(m_CuVideoParser, &cudaPkt);
    

    if ((cudaPkt.flags & CUVID_PKT_ENDOFSTREAM) || (oResult != CUDA_SUCCESS))
    {
        checkCudaErrors(cuCtxPopCurrent(NULL));
        return false;
    }
    
    //printf("Succeed to read avpkt %d !
", iPkt);
    checkCudaErrors(cuCtxPopCurrent(NULL));

然后數(shù)據(jù)到

HandlePictureDecode(CUVIDPICPARAMS *pPicParams) 發(fā)送解碼

HandlePictureDisplay(CUVIDPARSERDISPINFO *pDispInfo) GPU解碼結束發(fā)送到這里,存起來

然后映射pbo ,map texture就到紋理上了,就可以繪制了

這個4k x60fps的,如果CPU解碼cpu使用率100%都會卡頓

這個8k的視頻,CPU解碼無法播放

總結

以上是生活随笔為你收集整理的实现FFMPEG 使用CUDA解码播放的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。