基于寒武纪® MLU硬件平台,寒武纪 FFmpeg-MLU使用纯C接口实现硬件加速的视频编解码。
- 支持的操作系统如下:
- Ubuntu
- Centos
- Debian
- 寒武纪MLU驱动:
- neuware-mlu270-driver-4.9.x
- 寒武纪MLU SDK:
- cntookit-mlu270-1.7.x或更高版本
- cncv-0.4.602版本
-
获取FFmpeg源代码并通过下面Git*命令打patch:
git clone https://gitee.com/mirrors/ffmpeg.git -b release/4.2 --depth=1 cd ffmpeg git apply ../ffmpeg4.2_mlu.patch
-
运行下面命令,通过
LD_LIBRARY_PATH
设置指定路径:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${NEUWARE_HOME}/lib64
-
运行下面命令配置并创建 FFmpeg-MLU:
./configure --enable-gpl \ --extra-cflags="-I${NEUWARE_HOME}/include" \ --extra-ldflags="-L${NEUWARE_HOME}/lib64" \ --extra-libs="-lcncodec -lcnrt -ldl -lcndrv" \ --enable-ffplay \ --enable-ffmpeg \ --enable-mlumpp \ --enable-gpl \ --enable-version3 \ --enable-nonfree \ --disable-shared \ --enable-static \ --disable-debug \ --enable-stripping \ --enable-optimizations \ --enable-hwaccel=mlu make -j
-
(可选) 如果想要运行MLU支持多线程的转码示例,运行下面命令:
make -j examples
-
(可选) 如果想要通过MLU加速实现视频缩放及颜色空间转换等功能,需先安装MLU-CNCV硬件加速库(参考具体版本要求), 然后编译
mlu_op
并拷贝libeasyOP.so
到${NEUWARE_HOME}/lib64
目录下。#1: 安装完成cncv库 ... #2: 编译mlu_op算子 cd mlu_op & mkdir build cd build & cmake .. & make -j #3: 拷贝libeasyOP.so 到NEUWARE_HOME路径下 mv ../lib/libeasyOP.so ${NEUWARE_HOME}/lib64
FFmpeg-MLU支持的视频解码格式如下:
- H.264/AVC
- Codec名称:
h264_mludec
- Codec名称:
- HEVC
- Codec名称:
hevc_mludec
- Codec名称:
- VP8
- Codec名称:
vp8_mludec
- Codec名称:
- VP9
- Codec名称:
vp9_mludec
- Codec名称:
- JPEG
- Codec名称:
mjpeg_mludec
- Codec名称:
运行示例
ffmpeg -y -c:v h264_mludec -i input_file output_file.yuv
ffmpeg -y -hwaccel mlu -hwaccel_output_format mlu -c:v h264_mludec -i input_file -vf hwdownload_mlu output_file.yuv
FFmpeg-MLU支持的视频编码格式如下:
- H.264/AVC
- Codec名称:
h264_mluenc
- Codec名称:
- HEVC
- Codec名称:
hevc_mluenc
- Codec名称:
- JPEG
- Codec名称:
mjpeg_mluenc
- Codec名称:
运行示例
ffmpeg -i input_file -c:v h264_mluenc <output.h264>
ffmpeg -benchmark -re -i input.mkv -c:v h264_mluenc -f null -
ffmpeg -y -vsync 0 -c:v h264_mludec -i input_1920x1080.mkv -vf scale=320:240 output_320x240.mp4
ffmpeg -y -vsync 0 -c:v h264_mludec -i input_1920x1080.mkv -vf scale_yuv2yuv_mlu=320:240:0 output_320x240.mp4
ffmpeg -y -hwaccel mlu -hwaccel_output_format mlu -c:v h264_mludec -i input_file -vf scale_yuv2yuv_mlu=320:240:0,hwdownload_mlu output_file.yuv
ffmpeg -y -vsync 0 -c:v h264_mludec -i fhd_input.mkv -c:a copy -c:v h264_mluenc -b:v 5M output.mp4
ffmpeg -y -hwaccel mlu -hwaccel_output_format mlu -c:v h264_mludec -i input_file -c:v h264_mluenc output_file.h264
ffmpeg -y -vsync 0 -c:v h264_mludec -i fhd_input.mkv -vf scale=1280:720 -c:a copy -c:v h264_mluenc -b:v 2M output1.mp4 -vf scale=640:360 -c:a copy -c:v h264_mluenc -b:v 512K output2.mp4
ffmpeg -y -vsync 0 -c:v h264_mludec -i input_1920x1080.mkv -vf scale_yuv2yuv_mlu=320:240:0 -c:v h264_mluenc output_320x240.h264
ffmpeg -y -vsync 0 -c:v h264_mludec -i input_1920x1080.mkv -vf cvt_yuv2rgbx_mlu=rgb24:0,cvt_rgbx2yuv_mlu=nv12:0 output.h264
ffmpeg -y -hwaccel mlu -hwaccel_output_format mlu -c:v h264_mludec -i input_file -vf scale_yuv2yuv_mlu=320:240:0 -c:v h264_mluenc output_file.h264
本节介绍了如何通过PSNR和SSTM方法测试视频质量:
ffmpeg -i src.h264 -i dst.h264 -lavfi psnr="stats_file=psnr.log" -f null -
ffmpeg -i src.h264 -i dst.h264 -lavfi ssim="stats_file=ssim.log" -f null -
本节介绍了如何调试改进视频编解码的性能。
选项 | 类型 | 描述 |
---|---|---|
device_id | int | 选择使用的加速卡。 支持设置的值的范围为:0 - INT_MAX。其中 INT_MAX 为加速卡总数减1。 默认值为 0。 |
instance_id | int | 选择使用的VPU实例。 支持设置的值为: - 取为 -1 - 6 范围: 表示VPU/JPU实例编号。 -1: 表示自动选择。 默认值为 -1。 |
input_buf_num | int | 用于解码器输入缓冲器的数量。 支持设置的值的范围为:1 - 18。 默认值为 4。 |
output_buf_num | int | 用于解码器输出缓冲器的数量。 支持设置的值的范围为:1 - 18。 默认值为 4。 |
stride_align | int | 解码器输出对齐的步长。 支持设置的值的范围为:1 - 128,可以是 2^(0 - 7)。 默认值为 1。 |
output_pixfmt | int | 输出像素的格式。 支持设置的值为: - nv12/nv21/p010/yuv420p。 默认值为 nv12。 |
resize | string | 调整视频大小(宽)x(高)。 可以设置为 1/2 或 1/4 缩放视频。 默认为 null。 |
trace | int | FFmpeg-MLU调试开关。 支持设置的值为: - 0: 表示关闭。 - 1: 表示开启。 默认值为 0。 |
选项 | 类型 | 描述 |
---|---|---|
device_id | int | 选择使用的加速卡。 支持设置的值的范围:0 - INT_MAX。INT_MAX 为加速卡总数减1。 默认值为 0。 |
instance_id | int | 选择使用的VPU实例。 支持设置的值为: 值为 -1 - 6 范围:表示VPU实例编号。 -1:表示自动选择。 默认值为 -1。 |
input_buf_num | int | 用于编码器输入缓冲的数量。 支持设置的值的范围为:1 - 18。 默认值为 4。 |
output_buf_num | int | 用于编码器输出缓冲的数量。 支持设置的值的范围为:1 - 18。 默认值为 4。 |
trace | int | FFmpeg-MLU调试信息开关。 支持的设置的值为: 0 表示关闭调试打印信息。 2:表示打开调试打印信息。 默认值为 0。 |
init_qpP | int | 设置P帧初始值为QP。 支持设置的值的范围为:-1 - 51。 默认值为 -1。 |
init_qpI | int | 设置I帧初始值为QP。 支持设置的值的范围为:-1 - 51。 默认值为 -1。 |
init_qpB | int | 设置B帧初始值为QP。 支持设置的值的范围为:-1 - 51。 默认值为 -1。 |
qp | int | 恒定QP控制方法,同FFmpeg cqp。 支持设置的值的范围为:-1 - 51。 默认值为 -1。 |
vbr_minqp | int | 可变比特率模式,并提供MinQP,同FFmepg qmin。 支持设置的值的范围为:0 - 51。 默认值为 0。 |
vbr_maxqp | int | 可变比特率模式,并提供MaxQP,同FFmpeg qmax。 支持设置的值的范围为:0 - 51。 默认值为 51。 |
sar | string | 设置编码器sar (宽):(高)。 可以设置为: 16:11 或直接读取视频流的值。 默认为 0:0。 |
rc | string | 编码码率控制模式参数。 可以设置为: vbr/cbr/cqp。 默认为 vbr。 |
stride_align | int | 视频编码器输出对齐的步长, 目前图像编码器不适用。 支持设置的值的范围为:1 - 128,可以是 2^(0 - 7)。 默认值为 1。 |
(通用) 支持常规ffmpeg的设置:-b
, -bf
, -g
, -qmin
, -qmax
, 具体意义及值范围请参考ffmpeg官方文档。
选项 | 类型 | 描述 |
---|---|---|
profile | const | 设置编码档次。 支持设置的值为:baseline、main、high和 high444p。 默认值为 high。 |
level | const | 设置编码级别。 支持设置的值为:值为 1 - 5.1 范围、auto 。 默认值为 4.2。 |
coder | const | 设置编码熵(entropy)模式。 支持设置的值为:cabac 和 cavlc。 默认值为 cavlc。 |
选项 | 类型 | 描述 |
---|---|---|
profile | const | 设置编码档次。 支持设置的值为: main、main_still、main_intra和 main10。 默认值为 main。 |
level | const | 设置编码级别。 支持设置的值为:值为 1 - 6.2 范围、auto 。 默认值为 1。 |
选项 | 类型 | 描述 |
---|---|---|
device_id | int | 选择使用的加速卡。 支持设置的值的范围为:0 - INT_MAX。其中 INT_MAX 为加速卡总数减1。 默认值为 0。 |
instance_id | int | 选择使用的VPU实例。 支持设置的值为: 值为 0 - 6 范围:表示VPU实例编号。 6:表示自动选择。 默认值为 6。 |
quality | int | 选择编码jpg图像的质量。 支持设置的值的范围为:0 - 100。其中,0代表质量最差,100代表质量最好。 默认值为 100。 |
filter名 | 功能描述 | 调用示例 |
---|---|---|
scale_yuv2yuv_mlu | - 接收 YUV 格式图像(NV12/NV21) - scale到指定大小后输出, - 输出的宽度和高度必须为偶数 - 支持图像像素深度为 8u |
-vf filter=<out_w>:<out_h>:<dev_id> - <out_w>:输出图像宽度 - <ou_h>:输出图像高度 - <dev_id>:设备号 |
scale_rgbx2rgbx_mlu | - 接收RGBX格式图像,scale到指定大小后输出 - 要求输入图像的宽高均不超过8192像素 - 支持图像像素深度为 8u |
-vf filter=<out_w>:<out_h>:<dev_id> - <out_w>:输出图像宽度 - <out_h>:输出图像高度 - <dev_id>:设备号 |
cvt_yuv2rgbx_mlu | - 接收YUV图像(NV12/NV21) - 将图像颜色空间转换为指定RGBX后输出, - 输入图像的宽高均不超过 8192 像素 - 输入图像的宽高必须为偶数 - 支持图像像素深度为 8u |
-vf filter=<out_fmt>:<dev_id> - <out_fmt>:输出像素格式 - <dev_id>:设备号 |
cvt_rgbx2yuv_mlu | - 接收RGBX图像, - 将图像色彩空间转换为指定的YUV(NV12/NV21), - 输入图像的宽高不小于 2 - 输入图像像素格式支持 RGB24、BGR24、RGBA、BGRA、ARGB、ABGR - 输出图像像素格式支持NV12和NV21 - 支持图像像素深度为 8U |
-vf filter=<out_fmt>:<dev_id> - <out_fmt>:输出像素格式 - <dev_id>:设备号 |