Question in NVDEC Accelerated Decode with ffmpeg

您好!

    我下载、编译、安装好了NVIDIA的ffmpeg,然后运行基于 NVDEC的硬件加速解码的ffmpeg命令,输出信息如下:

ffmpeg-4.2.7-nvidia/bin# ./ffmpeg -c:v h264_nvv4l2dec -i /home/working-video/700818_023723.h264 -r 30 -y /home/working-video/video-harddec-test/video-dec%03d.jpg
ffmpeg version 4.2.7 Copyright (c) 2000-2022 the FFmpeg developers
built with gcc 7 (Ubuntu/Linaro 7.5.0-3ubuntu1~18.04)
configuration: --enable-nvv4l2dec --enable-libv4l2 --enable-shared --optflags=-O3 --extra-libs=‘-L/usr/lib/aarch64-linux-gnu/tegra -lnvbuf_utils’ --extra-cflags=‘-I /usr/src/jetson_multimedia_api/include/’ --enable-rpath --prefix=/opt/nvidia/ffmpeg-4.2.7-nvidia

Stream #0:0: Video: h264 (Constrained Baseline), yuv420p(progressive), 1920x1080, 25 fps, 25 tbr, 1200k tbn, 50 tbc

Opening in BLOCKING MODE
NvMMLiteOpen : Block : BlockType = 261
NVMEDIA: Reading vendor.tegra.display-size : status: 6
NvMMLiteBlockCreate : Block : BlockType = 261
Stream mapping:
Stream #0:0#0:0 (h264 (h264_nvv4l2dec) → mjpeg (native))
Output #0, image2, to ‘/home/working-video/working-video-dec/video-harddec-test/video-dec%03d.jpg’:
Metadata:
encoder : Lavf58.29.100
Stream #0:0: Video: mjpeg, yuvj420p(pc), 1920x1080, q=2-31, 200 kb/s, 30 fps, 30 tbn, 30 tbc
Metadata:
encoder : Lavc58.54.100 mjpeg
Side data:
cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: -1
frame= 3879 fps= 18 q=24.8 Lsize=N/A time=00:02:09.30 bitrate=N/A dup=658 drop=11 speed=0.609x

硬件解码速度:speed=0.609x

我运行sudo tegrastats,显示信息中出现了 NVDEC 665 NVDEC1 665 。说明NVDEC已经在运行了。
该命令显示信息如下:
nvidia-desktop:/home/nvidia# sudo tegrastats
RAM 11128/15822MB (lfb 800x4MB) SWAP 0/7911MB (cached 0MB) CPU [55%:1420,0%:1420,45%:1420,0%:1420,5%:1420,0%:1420] EMC_FREQ 2%:1866 GR3D_FREQ 0%:114 NVDEC 665 NVDEC1 665 VIC_FREQ 0%:115 APE 150 MTS fg 0% bg 1% AO:43.5C GPU:43C PMIC:50C AUX:43C CPU:44.5C

但是我接着运行ffmpeg的软解码命令,命令如下:
nvidia-desktop:/usr/local/bin# ffmpeg -i /home/working-video/700818_023723.h264 -r 30 -y /home/working-video/video-softdec-test/video-dec%03d.jpg
ffmpeg version 4.2.7 Copyright (c) 2000-2022 the FFmpeg developers
built with gcc 7 (Ubuntu/Linaro 7.5.0-3ubuntu1~18.04)
configuration: --enable-nvv4l2dec --enable-libv4l2 --extra-libs=‘-L/usr/lib/aarch64-linux-gnu/tegra -lnvbuf_utils’ --extra-cflags=‘-I /usr/src/jetson_multimedia_api/include/’

Stream #0:0: Video: h264 (Constrained Baseline), yuv420p(progressive), 1920x1080, 25 fps, 25 tbr, 1200k tbn, 50 tbc

Stream mapping:
Stream #0:0#0:0 (h264 (native) → mjpeg (native))
Output #0, image2, to ‘/home/working-video/working-video-dec/video-softdec-test/video-dec%03d.jpg’:
Metadata:
encoder : Lavf58.29.100
Stream #0:0: Video: mjpeg, yuvj420p(pc), 1920x1080, q=2-31, 200 kb/s, 30 fps, 30 tbn, 30 tbc
Metadata:
encoder : Lavc58.54.100 mjpeg
Side data:
cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: -1
frame= 3879 fps= 18 q=24.8 Lsize=N/A time=00:02:09.30 bitrate=N/A dup=646 drop=0 speed=0.615x

软件解码速度:speed=0.615x 大于 硬件解码速度:speed=0.609x
请问 这个问题是怎么解析???

Hi,
The decoded frame data is in hardware DMA buffer and then copies to CPU buffer in ffmpeg stack. This impacts overall performance. For optimal throughput, we would suggest use jetson_multimedia_api. You can take a look at this sample and give it a try:

/usr/src/jetson_multimedia_api/samples/00_video_decode

您好!
请给我们提供一个使用/usr/src/jetson_multimedia_api/samples/00_video_decode的例子。

谢谢!

Hi,
Please try

nvidia@tegra-ubuntu:/usr/src/jetson_multimedia_api/samples/00_video_decode$ export DISPLAY=:0
nvidia@tegra-ubuntu:/usr/src/jetson_multimedia_api/samples/00_video_decode$ ./video_decode H264 ../../data/Video/sample_outdoor_car_1080p_10fps.h264

The input file has to be h264 stream. If your input files are mkv or mp4, please extract the h264 stream out first.

您好!
我按照你提供的例子,运行后有错误,请指导一下,如何解决这个问题?

/usr/src/jetson_multimedia_api/samples/00_video_decode# export DISPLAY=:0
/usr/src/jetson_multimedia_api/samples/00_video_decode#
/usr/src/jetson_multimedia_api/samples/00_video_decode#
/usr/src/jetson_multimedia_api/samples/00_video_decode# ./video_decode H264 /home/working-video/working-video-dec/700818_023723.h264
No protocol specified
nvbuf_utils: Could not get EGL display connection
Set governor to performance before enabling profiler
Creating decoder in blocking mode
Opening in BLOCKING MODE
NvMMLiteOpen : Block : BlockType = 261
NVMEDIA: Reading vendor.tegra.display-size : status: 6
NvMMLiteBlockCreate : Block : BlockType = 261
Setting frame input mode to 1
Starting decoder capture loop thread
Video Resolution: 1920x1080
Video SAR width: 0 SAR height: 0
No protocol specified
[ERROR] (NvEglRenderer.cpp:98) Error in opening display
[ERROR] (NvEglRenderer.cpp:154) Got ERROR closing display
Error in setting up renderer. Check if X is running or run with --disable-rendering
Error in query_and_set_capture
Exiting decoder capture loop thread
[ERROR] (NvV4l2ElementPlane.cpp:178) Output Plane:Error while DQing buffer: Broken pipe
Error DQing buffer at output plane
Decoder is in error
App run failed

Hi,
You may try export DISPLAY=:1 and execute xrandr to check if you can see information about display device.

您好!
我按照你的建议,运行如下的命令:
export DISPLAY=:1
./video_decode H264 /home/working-video/working-video-dec/700818_023723.h264

可以成功实现了把H264文件解码显示出图像出来了。

由于我们的项目使用的硬件设备是NVIDIA Jetson Xavier NX,而且软件原来用的是ffmpeg软件解码,所以我们就想用NVIDIA的ffmpeg硬件加速功能,这样原来的软件代码基本上不用修改的,或者修改很少。如果用jetson_multimedia_api/samples/00_video_decode/video_decode, 修改的接口太多了,完全就是重新编写了视频解码部分的代码。

请问 硬件设备NVIDIA Jetson Xavier NX 支持./configure --enable-nvdec --enable-nvenc --enable-cuda --enable-cuvid吗???

Hi,
The option --enable-nvdec --enable-nvenc --enable-cuda --enable-cuvid is supported on desktop GPU. Not supported on Jetson platforms. The ffmpeg package for Jetson platforms enables hardware decoding and it is executed on NVDEC engine.

您好!

    我正在走读分析/usr/src/jetson_multimedia_api/samples/00_video_decode中的代码,但是感觉该源代码注释太少,不好理解。

请问NVIDIA官网中有jetson_multimedia_api的关键结构体,关键接口函数的介绍吗?

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.