實現FFMPEG 使用CUDA解碼播放


播放器使用ffmpeg讀取視頻文件,packet發給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  \n");
                    ThreadDecodeVideoGPU(packet);

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

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

 

 數據丟給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 !\n", iPkt);
    checkCudaErrors(cuCtxPopCurrent(NULL));

然后數據到

HandlePictureDecode(CUVIDPICPARAMS *pPicParams)  發送解碼

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

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

 

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

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM