4. 使用sophon-sample

sophon-sample在不同的Linux发行版上提供不同类型的安装方式。请根据您的系统选择对应的方式,不要在一台机器上混用多种安装方式。 以下描述中“0.10.0”仅为示例,视当前实际安装版本会有变化。

下文中$arch $system根据实际架构进行配置:
  • 主机为x86 处理器的,$arch为amd64, $system为x86_64

  • 主机为arm64或飞腾处理器的,$arch为arm64, $system为aarch64

  • 主机为sg2042处理器的, $arch为riscv64, $system为riscv_64

如果使用Debian/Ubuntu系统:

sophon-sample安装包由以下文件构成:
  • sophon-mw-sophon-sample_0.10.0_$arch.deb

如果使用Fedora/CentOS系统:

sophon-sample安装包由以下文件构成:
  • sophon-mw-sophon-sample_0.10.0_$arch.rpm

其中:

  • sophon-mw-sophon-sample包含了数个用于测试sophon-ffmpeg/sophon-opencv的应用程序;

  • sophon-mw-sophon-sample依赖上一章节的sophon-ffmpeg/sophon-opencv包。

安装步骤如下:

安装libsophon依赖库(参考《LIBSOPHON使用手册》)
安装sophon-mw(参考上一章节)
安装sophon-sample

如果使用Debian/Ubuntu系统:

  • sudo dpkg -i sophon-mw-sophon-sample_0.10.0_$arch.deb

如果使用Fedora/CentOS系统,请在安装之前卸载已安装的包:

已安装包目录可以通过此命令列举:
  • dnf list installed | grep sophon-ffmpeg

然后卸载:
  • sudo rpm ‑e sophon-mw-sophon-sample_0.10.0_$arch.rpm

再安装:
  • sudo rpm -ivh sophon-mw-sophon-sample_0.10.0_$arch.rpm

安装位置为:

/opt/sophon/
├── libsophon- 0.10.0├── libsophon-current -> /opt/sophon/libsophon 0.10.0├── sophon-ffmpeg 0.10.0├── sophon-ffmpeg-latest -> /opt/sophon/sophon-ffmpeg 0.10.0├── sophon-opencv 0.10.0├── sophon-opencv-latest -> /opt/sophon/sophon-opencv 0.10.0├── sophon-sample_ 0.10.0│   ├── bin
│   │   ├── test_bm_restart
│   │   ├── test_ff_bmcv_transcode
│   │   ├── test_ff_scale_transcode
│   │   ├── test_ff_video_encode
│   │   ├── test_ff_video_xcode
│   │   ├── test_ocv_jpubasic
│   │   ├── test_ocv_jpumulti
│   │   ├── test_ocv_vidbasic
│   │   ├── test_ocv_video_xcode
│   │   ├── test_ocv_vidmulti
│   │   └── water.bin
│   ├── data
│   └── sample
└── sophon-sample-latest -> /opt/sophon/sophon-sample_ 0.10.0

deb包安装方式并不允许您安装同一个包的多个不同版本,但您可能用其它方式在/opt/sophon下放置了若干不同版本。 在使用deb包安装时/opt/sophon/sophon-sample-latest会指向最后安装的那个版本。在卸载后,它会指向余下的最新版本(如果有的话)。

注意:soc模式下,deb安装包为

sophon-mw-soc-sophon-sample_0.10.0_arm64.deb

安装位置同上

卸载方式:

如果使用Debian/Ubuntu系统:

  • sudo apt remove sophon-mw-sophon-sample 或者:

  • sudo dpkg -r sophon-mw-sophon-sample_0.10.0_$arch.deb

如果使用Fedora/CentOS系统:

  • sudo rpm ‑e sophon-mw-sophon-sample_0.10.0_$arch.rpm

用例介绍:

test_bm_restart

此用例主要用于测试ffmpeg模块下的视频解码功能和性能,支持多路解码和断线重连功能。用户可以通过用例监测视频、码流的解码情况。

test_bm_restart [api_version] [yuv_format] [pre_allocation_frame] [codec_name] [sophon_idx] [zero_copy] [input_file/url] [input_file/url]

参数:

-api_version

指定解码过程使用的ffmpegAPI版本

0: 使用老版本的解码avcodec_decode_video2接口

1: 使用新版解码avcodec_send_packet接口

2: 使用av_parser_parse2的API用于抓包

-yuv_format

是否压缩数据,

0表示不压缩

1表示压缩

-pre_allocation_frame

允许的缓存帧数,最多为64

-codec_name

指定解码器,可选择 h264_bm/hevc_bm,no为不指定

-sophon_idx

若处于SOC模式,该选项可以随意设置(不可为空),其值将会被忽略

-zero_copy

若处于SOC模式,0表示启用Host memory, 1表示不启用若处于 PCIE模式,该选项可以随意设置(不可为空),其值将会被忽略

-input_file_or_url

输入的文件路径或码流地址

e.g

test_bm_restart 1 0 1 no 0 1 ./example0.mp4 ./example1.mp4 ./example2.mp4

test_ff_bmcv_transcode

此用例主要用于测试ffmpeg模块下的视频转码功能和性能,通过调用ff_video_decode,ff_video_encode用例中的数据类型和函数,来实现先解码后编码的转码过程,以此保证解码和编码功能的正确性。同时此用例也可测试ffmpeg下的转码性能,运行时程序会输出即时转码帧率供参考。

test_ff_bmcv_transcode [platform] [src_filename] [output_filename] [encode_pixel_format] [codecer_name] [width] [height] [frame_rate] [bitrate] [thread_num] [zero_copy] [sophon_idx] <optional: enable_mosaic> <optional: enable_watermark>

参数:

-platform

平台: soc 或者 pcie

-src_filename

输入文件名 如x.mp4 x.ts 等

-output_filename

转码输出文件名 如x.mp4,x.ts 等

-encode_pixel_format

编码格式 如 I420.

-encoder_name

编码 h264_bm,h265_bm.

-width

编码宽度 (32,4096]

-height

编码高度 (32,4096]

-frame_rate

编码帧率

-bitrate

编码比特率encode bitrate 500 < bitrate < 10000

-thread_num

线程数量

-zero_copy

PCie模式: 0: 开启主从内存复制, 1: 关闭. SoC模式: 任何数字均可以,但是无效

-sophon_idx

PCie模式: sophon设备id SoC模式: 任何数字均可以,但是无效

-enable_mosaic

可选, 在左上角添加马赛克, 目前仅支持bm1686且-encode_pixel_format] 为I420

-enable_watermark

可选,给视频添加水印,目前仅支持bm1686且-encode_pixel_format] 为I420

e.g

pcie mode example:

test_ff_bmcv_transcode pcie example.mp4 test.ts I420 h264_bm 800 400 25 3000 3 0 0

soc mode example:

test_ff_bmcv_transcode soc example.mp4 test.ts I420 h264_bm 800 400 25 3000 3 0 0

test_ff_scale_transcode

此用例主要用于测试 ffmpeg 下视频转码的功能和性能。此功能通过先解码再编码的过程实现,主要调用了 ff_video_decode,ff_video_encode 中的数据类型和函数。

test_ff_scale_transcode [src_filename] [output_filename] [encode_pixel_format] [codecer_name] [height] [width] [frame_rate] [bitrate] [thread_num] [zero_copy] [sophon_idx]

参数:

-src_filename

输入文件名 如 x.mp4 x.ts…

-output_filename

输出文件名 如 x.mp4,x.ts…

-encode_pixel_format

编码格式 如 I420

-codecer_name

编码名 如 h264_bm,hevc_bm,h265_bm

-height

编码高度

-width

编码宽度

-frame_rate

编码帧率

-bitrate

编码比特率

-thread_num

使用线程数

-zero_copy

0: copy host mem,1: nocopy.

-sophon_idx

设备索引

e.g

test_ff_scale_transcode example.mp4 test.ts I420 h264_bm 800 400 25 3000 3 0 0

test_ff_video_encode

此用例主要用于测试ffmpeg模块下视频的编码功能。输入的视频限制为I420和NV12格式。通过调用此用例用户可以得到封装好的视频文件,ffmpeg支持的视频格式均可。

test_ff_video_encode <input file> <output file> <encoder> <width> <height> <roi_enable> <input pixel format> <bitrate(kbps)> <frame rate> <sophon device index>

-input_file

输入视频路径

-output_file

输出视频文件名

-encoder

H264或者H265,默认为H264

-width

视频宽度,输出与输入需一致,256 <= width <= 8192

-height

视频高度,输出与输入需一致,128 <= height <= 8192

-roi_enable

是否开启roi,0表示不开启,1表示开启

-input_pixel_format

I420(YUV, 默认), NV12.

-bitrate

输出比特率,10 < bitrate <= 100000,默认为帧率x宽x高/8

-framerate

输出帧率,10 < framerate <= 60,默认为30

-sophon_device_index

pcie模式可用,指定运行的设备号,最小为0

e.g

  • test_ff_video_encode <input file> <output file> H264 width height 0 I420 3000 30 2

  • test_ff_video_encode <input file> <output file> H264 width height 0 I420 3000 30

  • test_ff_video_encode <input file> <output file> H265 width height 0 I420

  • test_ff_video_encode <input file> <output file> H265 width height 0 NV12

  • test_ff_video_encode <input file> <output file> H265 width height 0

test_ff_video_xcode

此用例主要用于测试ffmpeg下视频转码的功能和性能。此功能通过先解码再编码的过程实现,主要调用了ff_video_decode,ff_video_encode中的数据类型和函数。 转码后的视频分辨率与原视频一致,比特率不能超过10000kbps 或小于 500kbps,否则会被置为默认值3000kbps。 转码后的视频如比特率与原视频一致,那么时长也应一致。有一些丢帧属于正常现象。

test_ff_video_xcode <input file> <output file> encoder framerate bitrate(kbps) isdmabuffer pcie_no_copyback sophon_idx

-input_file

输入文件

-output_file

输出文件

-encoder

编码器 H264 或者 H265.

-isdmabuffer

是否开启内存一致,1表示不开启,0表示开启

PCIE模式下可选:

-pcie_no_copyback

表示不将解码后YUV数据复制到host主机内存,0表示复制YUV数据到host主机内存

-sophon_idx

指定card编号,默认为0

e.g

  • test_ff_video_xcode ./file_example_MP4_1920_18MG.mp4 tran5.ts H264 30 3000 1 1 0

  • test_ff_video_xcode ./file_example_MP4_1920_18MG.mp4 tran5.ts H264 30 3000 0 0 0

  • test_ff_video_xcode ./file_example_MP4_1920_18MG.mp4 tran5.ts H264 30 3000 1 0 0

test_ocv_jpubasic

此用例主要用于测试图片编解码的基本功能。 此用例进行了3种测试,主要调用了opencv中的imread,imwrite,imdecode,imencode等接口用不同方式实现图片的编解码。

test_ocv_jpubasic <file> <loop> <yuv_enable> <dump_enable> [card]

-file

图片文件路径

-loop

循环次数

-yuv_enable

0表示解码后输出BGR格式,1表示解码后输出YUV格式

-dump_enable

1表示输出dump文件,0表示不输出

-card

pcie模型下可选。指定运行的card编号

e.g

test_ocv_jpubasic 1920x1080_gray.jpg 1000 1 1 0

test_ocv_jpumulti

此用例主要用于测试多路图片编解码的功能和性能。

test_ocv_jpumulti <test type> <inputfile> <loop> <num_threads> <outjpg> [card]

-test_type

测试类型,1表示只解码,2表示只编码,3表示解码编码混合

-inputfile

输入文件

-loop

循环次数

-num_thread

线程数,最小为1,最大为12

-outjpg

是否输出图片,1表示输出,0表示不输出

-card

PICE模式下可选参数。指定运行的card编号

e.g

test_ocv_jpumulti 3 1088test1_420.jpg 10 2 1 0

test_ocv_vidbasic

此用例主要用于测试视频记录为 png 或 jpg格式的功能。如果启用dump,则也可输出 BGR 或 YUV 格式的原始数据。

test_ocv_vidbasic <input_video> <output_name> <frame_num> <yuv_enable> [card] [WxH] [dump.BGR or dump.YUV]

-input_video

输入的视频文件路径

-output_name

输出文件名前缀

-frame_num

存储帧数

-yuv_enable

是否开启yuv,0表示输出BGR格式,1表示输出YUV格式

-card

PCIE模式下可选参数,指定运行的card编号

-WxH

可选参数,指定输出文件的分辨率,未指定则与原视频分辨率一致

-dumpBGR_or_dumpYUV

可选参数,是否输出 dump.BGR 或 dump.YUV 文件

e.g

test_ocv_vidbasic station.avi test_basic 10 1 0 1920x1080

test_ocv_video_xcode

此用例主要用于opencv模块下视频转码的全方位测试,对于opencv库支持的不同格式的视频输入,提供h264、h265编码,yuv格式输出,roi区域等多种功能以及多种格式输出,覆盖的格式以及功能范围非常广泛。

test_ocv_video_xcode <input> <code_type> <frame_num> <outputname> <yuv_enable> <roi_enable> [device_id] [encodeparams]

-input

输入文件名

-code_type

编码类型。H264enc 表示 H.264,H265enc 表示 H.265

-frame_num

需要处理的帧数

-outputname

指定输出文件名,可以设置为null

-yuv_enable

0 指定输出文件为 bgr色彩格式; 1 指定输出文件为 yuv420色彩模式

-roi_enable

0 表示禁用roi编码; 1 表示启用roi编码,启用roi编码时,输出文件名应指定为null 并且在编码参数中加上 roi_eanble=1

-encodeparams

可选参数,可以设置 roi_enable ,bitrate,min_qp,gop等参数

-device_id

pcie模式下可选参数,指定card编号

e.g

test_ocv_video_xcode rtsp_url H265enc 10000 encoder_test265.ts 1 0 0 bitrate=1000

test_ocv_vidmulti

此用例主要用于opencv模块下视频以及码流的编解码性能测试, 测试设备在视频多路编解码转码时的性能, 终端可以输出每一个线程的编号、输入视频分辨率、重连次数、 当前解码帧数、实时帧率、总平均帧率、丢帧数等,以及编码功能相关信息。

test_ocv_vidmulti <thread_num> <input_video> [card] [enc_enable] <input_video> [card] [enc_enable]

-thread_num

线程数,最大不超过512

-enc_enable

是否开启编码。0表示不开启,1表示开启

-card

PCIE模式下可选参数,指定运行每个文件对应的card编号

环境变量:
export VIDMULTI_DISPLAY_FRAMERATE=0

只显示帧数

export VIDMULTI_DISPLAY_FRAMERATE=1

会显示每一个channel的详细信息,可以看丢帧情况等

e.g

test_ocv_vidmulti 3 a.264 0 1 b.264 1 1 c.264 0 0