目錄
- 參考
- NVENC/NVDEC介紹
- 編譯步驟
- 問(wèn)題記錄
1. 參考
- [1] trac.ffmpeg.org/HWAccelIntro
- [2] developer.nvidia.com/ffmpeg
- [3] leochen1983/Nvidia硬件加速總結(jié)
- [4] stackoverflow/ffmpeg ERROR: libnpp not found in windows
- [5] hlwfirst/NVIDIA NPP
2. NVENC/NVDEC介紹
NVENC和NVDEC是NVIDIA的硬件加速編碼和解碼API扎阶,以前叫CUVID渠牲。在Windows和Linux平臺(tái)支持玻蝌。
使用NVENC和NVDEC的前提[1]:
- GPU的支持。
- 顯卡驅(qū)動(dòng)的支持。
- 安裝NIVIDA Codec SDK。
- 如何需要支持npp則還需要安裝CUDA toolkit[4]。
3. 編譯步驟
說(shuō)明:
- 使用的FFmpeg的版本4.1.
3.1 下載nv-codec-headers
FFmpeg為NVIDIA的CUDA/NVENC/NVDEC相關(guān)庫(kù)使用它自己稍微修改過(guò)的運(yùn)行時(shí)加載器塘辅。需要安裝nv-codec-headers,否則編譯時(shí)會(huì)報(bào)錯(cuò)提示缺少ffnvcodec:ERROR: cuda requested, but not all dependencies are satisfied: ffnvcodec
[1] 中介紹的安裝步驟如下:
git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
cd nv-codec-headers
make
sudo make install
- 工程中一個(gè)Makefile: make install PREFIX=/usr皆撩。FFmpeg將查找它的pkg-config文件扣墩,名為ffnvcodec.pc。確保它位于PKG_CONFIG_PATH中扛吞。
我在msys下執(zhí)行make遇到問(wèn)題make : cygpath command not found
呻惕,具體參見(jiàn)“4.問(wèn)題記錄#問(wèn)題2”
3.2 編譯FFmpeg
configure配置如下:
./configure --prefix=../build_out_cuda --enable-shared \
--enable-cuda --enable-cuvid --enable-nvenc --enable-nonfree --enable-libnpp \
--extra-cflags=-I/d/programfiles/Video_Codec_SDK_9.0.20/Video_Codec_SDK_9.0.20/include \
--extra-ldflags=-L/d/programfiles/Video_Codec_SDK_9.0.20/Video_Codec_SDK_9.0.20/Lib/x64
make
make install
3.3 運(yùn)行
1. 使用NVENC進(jìn)行h264編碼:
ffmpeg -s 1280*720 -i input_yuv -c:v h264_nvenc -pixel_format yuv420p -preset default output.mp4
2. NVEDC進(jìn)行h264解碼
ffmpeg -hwaccel nvdec -i input.mp4 output_yuv
更多示例可以參考[2]中“How to use FFmpeg/libav with NVIDIA GPU-acceleration”部分。
4. 問(wèn)題記錄
問(wèn)題1:npp.h: No such file or directory
ffbuild/config.log
中的錯(cuò)誤信息:
check_lib libnpp npp.h nppGetLibVersion -lnppi -lnppc -lnppidei
check_func_headers npp.h nppGetLibVersion -lnppi -lnppc -lnppidei
test_ld cc -lnppi -lnppc -lnppidei
test_cc
BEGIN /tmp/ffconf.KIurJSQG/test.c
1 #include <npp.h>
2 #include <stdint.h>
3 long check_nppGetLibVersion(void) { return (long) nppGetLibVersion; }
4 int main(void) { int ret = 0;
5 ret |= ((intptr_t)check_nppGetLibVersion) & 0xFFFF;
6 return ret; }
END /tmp/ffconf.KIurJSQG/test.c
gcc -D_ISOC99_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -U__STRICT_ANSI__ -D__USE_MINGW_ANSI_STDIO=1 -D__MSVCRT_VERSION__=0x0700 -D_WIN32_WINNT=0x0600 -D__printf__=__gnu_printf__ -I/d/programfiles/Video_Codec_SDK_9.0.20/Video_Codec_SDK_9.0.20/include -std=c11 -fomit-frame-pointer -c -o /tmp/ffconf.KIurJSQG/test.o /tmp/ffconf.KIurJSQG/test.c
C:/Users/gavinxu/AppData/Local/Temp/ffconf.KIurJSQG/test.c:1:17: fatal error: npp.h: No such file or directory
#include <npp.h>
^
compilation terminated.
ERROR: libnpp not found
-
Video_Codec_SDK_9.0.20/include
中的確沒(méi)有npp.h文件滥比。 - 需要支持npp則還需要安裝CUDA toolkit[4]亚脆。
- 安裝CUDA-toolkit遇到visual studio環(huán)境的問(wèn)題,目前還用不到npp盲泛,我就先把
--enable-libnpp
去掉了濒持。
問(wèn)題2:make : cygpath command not found
- 使用
pkg-config --cflags ffnvcodec
,發(fā)現(xiàn)ffnvcodec.pc沒(méi)有被找到。 - 生成的
ffnvcodec.pc
有些問(wèn)題寺滚。
prefix=
includedir=${prefix}/include
Name: ffnvcodec
Description: FFmpeg version of Nvidia Codec SDK headers
Version: 9.0.18.2
Cflags: -I${includedir}
查看了一下make文件
PREFIX = /usr/local
LIBDIR = lib
INSTALL = install
SED = sed
all:
ifeq ($(OS),Windows_NT)
$(SED) 's#@@PREFIX@@#$(shell cygpath -m ${PREFIX})#' ffnvcodec.pc.in > ffnvcodec.pc
else
$(SED) 's#@@PREFIX@@#$(PREFIX)#' ffnvcodec.pc.in > ffnvcodec.pc
endif
install: all
$(INSTALL) -m 0755 -d '$(DESTDIR)$(PREFIX)/include/ffnvcodec'
$(INSTALL) -m 0644 include/ffnvcodec/*.h '$(DESTDIR)$(PREFIX)/include/ffnvcodec'
$(INSTALL) -m 0755 -d '$(DESTDIR)$(PREFIX)/$(LIBDIR)/pkgconfig'
$(INSTALL) -m 0644 ffnvcodec.pc '$(DESTDIR)$(PREFIX)/$(LIBDIR)/pkgconfig'
uninstall:
rm -rf '$(DESTDIR)$(PREFIX)/include/ffnvcodec' '$(DESTDIR)$(PREFIX)/$(LIBDIR)/pkgconfig/ffnvcodec.pc'
.PHONY: all install uninstall
- make執(zhí)行了生成ffnvcodec.pc然后把ffnvcodec.pc和
include/ffnvcodec
拷貝到了/usr/local/lib/pkgconfig
目錄和usr/local/inlucde
目錄的工作柑营。 - 但是msys中執(zhí)行pkg-config命令并沒(méi)有去識(shí)別/usr/local/lib/pkgconfig目錄,沒(méi)有找到msys中安裝
cygpath
的方案村视,就自己來(lái)配置這個(gè)ffnvcodec.pc官套。
配置步驟
- 修改ffnvcodec.pc。文件內(nèi)容如下所示蚁孔。
- 把ffnvcodec.pc放到msys的lib\pkgconfig目錄奶赔,本機(jī)為
D:\programfiles\MinGW\msys\1.0\lib\pkgconfig
目錄。 - 把ffnvcodec頭文件目錄拷貝到msys的include目錄杠氢,本機(jī)為
D:\programfiles\MinGW\msys\1.0\include
站刑。
ffnvcodec.pc的內(nèi)容:
prefix=/usr/local/
includedir=${prefix}/include
Name: ffnvcodec
Description: FFmpeg version of Nvidia Codec SDK headers
Version: 9.0.18.2
Cflags: -I${includedir}