目录
- 参考
- NVENC/NVDEC介绍
- 编译步骤
- 问题记录
1. 参考
- [1] trac.ffmpeg.org/HWAccelIntro
- [2] developer.nvidia.com/ffmpeg
- [3] leochen1983/Nvidia硬件加速总结
- [4] stackoverflow/ffmpeg ERROR: libnpp not found in windows
- [5] hlwfirst/NVIDIA NPP
2. NVENC/NVDEC介绍
NVENC和NVDEC是NVIDIA的硬件加速编码和解码API,以前叫CUVID。在Windows和Linux平台支持。
使用NVENC和NVDEC的前提[1]:
- GPU的支持。
- 显卡驱动的支持。
- 安装NIVIDA Codec SDK。
- 如何需要支持npp则还需要安装CUDA toolkit[4]。
3. 编译步骤
说明:
- 使用的FFmpeg的版本4.1.
3.1 下载nv-codec-headers
FFmpeg为NVIDIA的CUDA/NVENC/NVDEC相关库使用它自己稍微修改过的运行时加载器。需要安装nv-codec-headers,否则编译时会报错提示缺少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
- 工程中一个Makefile: make install PREFIX=/usr。FFmpeg将查找它的pkg-config文件,名为ffnvcodec.pc。确保它位于PKG_CONFIG_PATH中。
我在msys下执行make遇到问题make : cygpath command not found
,具体参见“4.问题记录#问题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 运行
1. 使用NVENC进行h264编码:
ffmpeg -s 1280*720 -i input_yuv -c:v h264_nvenc -pixel_format yuv420p -preset default output.mp4
2. NVEDC进行h264解码
ffmpeg -hwaccel nvdec -i input.mp4 output_yuv
更多示例可以参考[2]中“How to use FFmpeg/libav with NVIDIA GPU-acceleration”部分。
4. 问题记录
问题1:npp.h: No such file or directory
ffbuild/config.log
中的错误信息:
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
中的确没有npp.h文件。 - 需要支持npp则还需要安装CUDA toolkit[4]。
- 安装CUDA-toolkit遇到visual studio环境的问题,目前还用不到npp,我就先把
--enable-libnpp
去掉了。
问题2:make : cygpath command not found
- 使用
pkg-config --cflags ffnvcodec
,发现ffnvcodec.pc没有被找到。 - 生成的
ffnvcodec.pc
有些问题。
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执行了生成ffnvcodec.pc然后把ffnvcodec.pc和
include/ffnvcodec
拷贝到了/usr/local/lib/pkgconfig
目录和usr/local/inlucde
目录的工作。 - 但是msys中执行pkg-config命令并没有去识别/usr/local/lib/pkgconfig目录,没有找到msys中安装
cygpath
的方案,就自己来配置这个ffnvcodec.pc。
配置步骤
- 修改ffnvcodec.pc。文件内容如下所示。
- 把ffnvcodec.pc放到msys的lib\pkgconfig目录,本机为
D:\programfiles\MinGW\msys\1.0\lib\pkgconfig
目录。 - 把ffnvcodec头文件目录拷贝到msys的include目录,本机为
D:\programfiles\MinGW\msys\1.0\include
。
ffnvcodec.pc的内容:
prefix=/usr/local/
includedir=${prefix}/include
Name: ffnvcodec
Description: FFmpeg version of Nvidia Codec SDK headers
Version: 9.0.18.2
Cflags: -I${includedir}
网友评论