2017-06-01 3196 views
1

我正在嘗試使用解碼視頻NVIDIA cuvid硬件加速與ffmpeg與ffmpeg一起使用h264_cuvid解碼器時出錯

我使用了NVIDIA GeForce GT 745M顯卡(GPU:GK107),由NVIDIA here

我編譯如下標誌的ffmpeg作爲一種高精度至極與兼容cuvid

./configure --enable-cuda --enable-nvenc --enable-cuvid 

然後,我用FFMPEG使用下面的命令行:

ffmpeg.exe -hwaccel cuvid -c:v h264_cuvid -i video.mkv video.mkv 

FFMPEG飾面和似乎無法打開cuvid功能:

Cannot load cuvidGetDecoderCaps 
[h264_cuvid @ 07047b80] Failed loading nvcuvid. 
Stream mapping: 
    Stream #0:0 -> #0:0 (h264 (h264_cuvid) -> h264 (libx264)) 
    Stream #0:1 -> #0:1 (ac3 (native) -> vorbis (libvorbis)) 
    Stream #0:3 -> #0:2 (subrip (srt) -> ass (ssa)) 
Error while opening decoder for input stream #0:0 : Unknown error occurred 

的ffmpeg源代碼,可以發現,該錯誤消息是由下面的宏印刷:

#define LOAD_SYMBOL(fun, tp, symbol)        \ 
    do {               \ 
     if (!((f->fun) = (tp*)dlsym(f->lib, symbol))) {    \ 
      av_log(NULL, AV_LOG_ERROR, "Cannot load %s\n", symbol); \ 
      ret = AVERROR_UNKNOWN;         \ 
      goto error;            \ 
     }               \ 
     av_log(NULL, AV_LOG_TRACE, "Loaded sym: %s\n", symbol);  \ 
    } while (0) 

static inline int cuvid_load_functions(CuvidFunctions **functions) 
{ 
    GENERIC_LOAD_FUNC_PREAMBLE(CuvidFunctions, cuvid, NVCUVID_LIBNAME); 

    LOAD_SYMBOL(cuvidGetDecoderCaps, tcuvidGetDecoderCaps, "cuvidGetDecoderCaps"); 
    LOAD_SYMBOL(cuvidCreateDecoder, tcuvidCreateDecoder, "cuvidCreateDecoder"); 
    LOAD_SYMBOL(cuvidDestroyDecoder, tcuvidDestroyDecoder, "cuvidDestroyDecoder"); 
    LOAD_SYMBOL(cuvidDecodePicture, tcuvidDecodePicture, "cuvidDecodePicture"); 
#ifdef __CUVID_DEVPTR64 
    LOAD_SYMBOL(cuvidMapVideoFrame, tcuvidMapVideoFrame, "cuvidMapVideoFrame64"); 
    LOAD_SYMBOL(cuvidUnmapVideoFrame, tcuvidUnmapVideoFrame, "cuvidUnmapVideoFrame64"); 
#else 
    LOAD_SYMBOL(cuvidMapVideoFrame, tcuvidMapVideoFrame, "cuvidMapVideoFrame"); 
    LOAD_SYMBOL(cuvidUnmapVideoFrame, tcuvidUnmapVideoFrame, "cuvidUnmapVideoFrame"); 
#endif 
    LOAD_SYMBOL(cuvidCtxLockCreate, tcuvidCtxLockCreate, "cuvidCtxLockCreate"); 
    LOAD_SYMBOL(cuvidCtxLockDestroy, tcuvidCtxLockDestroy, "cuvidCtxLockDestroy"); 
    LOAD_SYMBOL(cuvidCtxLock, tcuvidCtxLock, "cuvidCtxLock"); 
    LOAD_SYMBOL(cuvidCtxUnlock, tcuvidCtxUnlock, "cuvidCtxUnlock"); 

    LOAD_SYMBOL(cuvidCreateVideoSource, tcuvidCreateVideoSource, "cuvidCreateVideoSource"); 
    LOAD_SYMBOL(cuvidCreateVideoSourceW, tcuvidCreateVideoSourceW, "cuvidCreateVideoSourceW"); 
    LOAD_SYMBOL(cuvidDestroyVideoSource, tcuvidDestroyVideoSource, "cuvidDestroyVideoSource"); 
    LOAD_SYMBOL(cuvidSetVideoSourceState, tcuvidSetVideoSourceState, "cuvidSetVideoSourceState"); 
    LOAD_SYMBOL(cuvidGetVideoSourceState, tcuvidGetVideoSourceState, "cuvidGetVideoSourceState"); 
    LOAD_SYMBOL(cuvidGetSourceVideoFormat, tcuvidGetSourceVideoFormat, "cuvidGetSourceVideoFormat"); 
    LOAD_SYMBOL(cuvidGetSourceAudioFormat, tcuvidGetSourceAudioFormat, "cuvidGetSourceAudioFormat"); 
    LOAD_SYMBOL(cuvidCreateVideoParser, tcuvidCreateVideoParser, "cuvidCreateVideoParser"); 
    LOAD_SYMBOL(cuvidParseVideoData, tcuvidParseVideoData, "cuvidParseVideoData"); 
    LOAD_SYMBOL(cuvidDestroyVideoParser, tcuvidDestroyVideoParser, "cuvidDestroyVideoParser"); 

    GENERIC_LOAD_FUNC_FINALE(cuvid); 
} 

是否有人硝酸鉀:

至極被稱爲w如果cuvid需要特定文件來加載其功能? 這裏有什麼不對的線索?

預先感謝您。

回答

0

我再也沒有這個問題了。

我忘了使用libnpp期間ffmpeg彙編。

我現在的配置是:

./configure --enable-cuda --enable-nvenc --enable-cuvid --enable-libnpp --extra-cflags=-I<path_to_libnpp_headers> --extra-ldflags=-L<path_to_libnpp_libraries> 
相關問題