RK3568评估板应用:视频编码、解码、播放
一、解码器 demo:mpi_dec_test
解 码 器 demo 为 mpi_dec_test 系 列 程 序 , 包 括 使 用 decode_put_packet 和decode_get_frame 接口的单线程 mpi_dec_test,多线程的 mpi_dec_mt_test 以及多实例的 mpi_dec_multi_test。
以 下 以 Buildroot 平 台 上 的 mpi_dec_test 为 例 进 行 使 用 说 明 。 首 先 直 接 运 行mpi_dec_test,输入输出如下:
[root@RK356X:~]# mpi_dec_test
mpp[1043]: mpi_dec_utils: usage: mpi_dec_test [options]
mpp[1043]: utils: -i input_file input bitstream file
mpp[1043]: utils: -o output_file output bitstream file,
mpp[1043]: utils: -c ops_file input operation config file
mpp[1043]: utils: -w width the width of input bitstream
mpp[1043]: utils: -h height the height of input bitstream
mpp[1043]: utils: -t type input stream coding type
mpp[1043]: utils: -f format output frame format type
mpp[1043]: utils: -d debug debug flag
mpp[1043]: utils: -x timeout output timeout interval
mpp[1043]: utils: -n frame_number max output frame number
mpp[1043]: utils: -s instance_nb number of instances
mpp[1043]: mpi: mpp coding type support list:
mpp[1043]: mpi: type: dec id 0 coding: mpeg2 id 2
mpp[1043]: mpi: type: dec id 0 coding: mpeg4 id 4
mpp[1043]: mpi: type: dec id 0 coding: h.263 id 3
mpp[1043]: mpi: type: dec id 0 coding: h.264/AVC id 7
mpp[1043]: mpi: type: dec id 0 coding: h.265/HEVC id 16777220
mpp[1043]: mpi: type: dec id 0 coding: vp8 id 9
mpp[1043]: mpi: type: dec id 0 coding: VP9 id 10
mpp[1043]: mpi: type: dec id 0 coding: avs+ id 16777221
mpp[1043]: mpi: type: dec id 0 coding: jpeg id 8
mpp[1043]: mpi: type: enc id 1 coding: h.264/AVC id 7
mpp[1043]: mpi: type: enc id 1 coding: jpeg id 8
mpp[1043]: mpi: type: enc id 1 coding: h265 id 16777220
mpp[1043]: mpi: type: enc id 1 coding: vp8 id 9
[root@RK356X:~]#
mpi_dec_test 的命令参数中,输入文件(i),码流类型(t)为强制要求的参数,其他参数如输出文件(o),图像宽度(w)图像高度(h),解码帧数(n)等为可选参数,影响不大。
后面的打印显示了 MPP 库支持的 coding 格式,支持 MPEG2/4,H.263/4/5,VP8/9 的解码,id 后的数字为格式对应的-t 项后的参数值。参数值来源于 OMX 的定义,HEVC 和 AVS 的格式参数值与其他的格式参数值区别较大,需要留意。
以/mnt/sdcard/下的 200frames_count.h264 文件解码 10 帧为例,对 demo 和输出进行说明。运行的命令为:
mpi_dec_test -t 7 -i /mnt/sdcard/200frames_count.h264 -n 10
-t 7 表示是 H.264 码流,-i 表示输入文件,-n 10 表示解码 10 帧,如果一切正常,会得到如下的结果:
[root@RK356X:~]# mpi_dec_test -t 7 -i /mnt/sdcard/200frames_count.h264 -n 10
mpp[1051]: mpi_dec_utils: cmd parse result:
mpp[1051]: mpi_dec_utils: input file name: /mnt/sdcard/200frames_count.h264
mpp[1051]: mpi_dec_utils: output file name:
mpp[1051]: mpi_dec_utils: config file name:
mpp[1051]: mpi_dec_utils: width : 0
mpp[1051]: mpi_dec_utils: height : 0
mpp[1051]: mpi_dec_utils: type : 7
mpp[1051]: mpi_dec_utils: debug flag : 0
mpp[1051]: mpi_dec_utils: max frames : 10
mpp[1051]: mpi_dec_test: mpi_dec_test start
mpp[1051]: mpi_dec_test: input file size 87402
mpp[1051]: mpp_info: mpp version: 31814aea author: Herman Chen 2021-09-30 [vepu]: Add offset_x offset_y support for vepu
mpp[1051]: mpi_dec_test: 0xc04b520 mpi_dec_test decoder test start w 0 h 0 type 7
mpp[1051]: mpp_rt: NOT found ion allocator
mpp[1051]: mpp_rt: found drm allocator
mpp[1051]: mpi_dec_test: 0xc04b520 decode_get_frame get info changed found
mpp[1051]: mpi_dec_test: 0xc04b520 decoder require buffer w:h [640:480] stride [640:480] buf_size 614400
mpp[1051]: mpi_dec_test: 0xc04b520 decode get frame 0
mpp[1051]: mpi_dec_test: 0xc04b520 decode get frame 1
mpp[1051]: mpi_dec_test: 0xc04b520 decode get frame 2
mpp[1051]: mpi_dec_test: 0xc04b520 decode get frame 3
mpp[1051]: mpi_dec_test: 0xc04b520 decode get frame 4
mpp[1051]: mpi_dec_test: 0xc04b520 decode get frame 5
mpp[1051]: mpi_dec_test: 0xc04b520 decode get frame 6
mpp[1051]: mpi_dec_test: 0xc04b520 decode get frame 7
mpp[1051]: mpi_dec_test: 0xc04b520 decode get frame 8
mpp[1051]: mpi_dec_test: 0xc04b520 decode get frame 9
mpp[1051]: mpi_dec_test: 0xc04b520 reach max frame number 10
mpp[1051]: mpi_dec_test: 0xc04b520 input 2 pkt output 11 frm decode 11 frames
mpp[1051]: mpi_dec_test: test success max memory 3.52 MB
[root@RK356X:~]#
打印的信息里包含了 MPP 库的版本信息:
mpp version: 70d330b2 author: Ding Wei 2021-09-23
mpp_rt 的内核分配器检测信息:
mpp[1051]: mpp_rt: NOT found ion allocator
mpp[1051]: mpp_rt: found drm allocator
表示没找到 ion 分配器,找到了 drm 分配器。
mpp[1051]: mpi_dec_test: 0x5583b309e0 decode_get_frame get info changed found
为mpi_dec_test 本身的打印,表示发现 MPP 解码器上报了 info change 事件。
mpp[1051]: mpi_dec_test: 0x5583b309e0 decoder require buffer w:h [640:480] stride [640:480] buf_size 614400
为 mpi_dec_test 本身的打印,表示 MPP 解码器请求的图像内存情况。
mpp[11051]: mpi_dec_test: 0x5583b309e0 decode get frame 0
为 mpi_dec_test 本身打印,表示解码器在正常解码和输出图像。
mpp[1051]: mpi_dec_test: test success max memory 3.52 MB
为 mpi_dec_test 本身打印,表示解码器完成了解码 10 帧的功能。
解码器的 demo 代码具体参见 test/mpi_dec_test.c。
二、编码器 demo:mpi_enc_test
编码器 demo 为 mpi_enc_test 系列程序,包括单线程的 mpi_enc_test,及多实例的mpi_enc_multi_test。
以 下 以 Buildroot 平 台 上 的 mpi_enc_test 为 例 进 行 使 用 说 明 。 首 先 直 接 运 行mpi_enc_test,输出如下:
[root@RK356X:~]# mpi_enc_test
mpp[1055]: mpi_enc_utils: usage: mpi_enc_test [options]
mpp[1055]: utils: -i input_file input bitstream file
mpp[1055]: utils: -o output_file output bitstream file,
mpp[1055]: utils: -w width the width of input picture
mpp[1055]: utils: -h height the height of input picture
mpp[1055]: utils: -f format the format of input picture
mpp[1055]: utils: -t type output stream coding type
mpp[1055]: utils: -n max frame number max encoding frame number
mpp[1055]: utils: -g gop_mode gop reference mode
mpp[1055]: utils: -d debug debug flag
mpp[1055]: utils: -b bps target:min:max set tareget bps
mpp[1055]: utils: -r in/output fps set input and output frame rate
mpp[1055]: utils: -l loop count loop encoding times for each frame
mpp[1055]: mpi: mpp coding type support list:
mpp[1055]: mpi: type: dec id 0 coding: mpeg2 id 2
mpp[1055]: mpi: type: dec id 0 coding: mpeg4 id 4
mpp[1055]: mpi: type: dec id 0 coding: h.263 id 3
mpp[1055]: mpi: type: dec id 0 coding: h.264/AVC id 7
mpp[1055]: mpi: type: dec id 0 coding: h.265/HEVC id 16777220
mpp[1055]: mpi: type: dec id 0 coding: vp8 id 9
mpp[1055]: mpi: type: dec id 0 coding: VP9 id 10
mpp[1055]: mpi: type: dec id 0 coding: avs+ id 16777221
mpp[1055]: mpi: type: dec id 0 coding: jpeg id 8
mpp[1055]: mpi: type: enc id 1 coding: h.264/AVC id 7
mpp[1055]: mpi: type: enc id 1 coding: jpeg id 8
mpp[1055]: mpi: type: enc id 1 coding: h265 id 16777220
mpp[1055]: mpi: type: enc id 1 coding: vp8 id 9
mpp[1055]: mpi: mpp color support list:
mpp[1055]: mpi: color: id 0 0x00000 YUV420SP, NV12
mpp[1055]: mpi: color: id 1 0x00001 YUV420SP-10bit
mpp[1055]: mpi: color: id 2 0x00002 YUV422SP, NV24
mpp[1055]: mpi: color: id 3 0x00003 YUV422SP-10bit
mpp[1055]: mpi: color: id 4 0x00004 YUV420P, I420
mpp[1055]: mpi: color: id 5 0x00005 YUV420SP, NV21
mpp[1055]: mpi: color: id 6 0x00006 YUV422P, 422P
mpp[1055]: mpi: color: id 7 0x00007 YUV422SP, NV42
mpp[1055]: mpi: color: id 8 0x00008 YUV422-YUYV, YUY2
mpp[1055]: mpi: color: id 10 0x0000a YUV422-UYVY, UYVY
mpp[1055]: mpi: color: id 12 0x0000c YUV400-Y8, Y800
mpp[1055]: mpi: color: id 65536 0x10000 RGB565
mpp[1055]: mpi: color: id 65537 0x10001 BGR565
mpp[1055]: mpi: color: id 65538 0x10002 RGB555
mpp[1055]: mpi: color: id 65539 0x10003 BGR555
mpp[1055]: mpi: color: id 65542 0x10006 RGB888
mpp[1055]: mpi: color: id 65543 0x10007 BGR888
mpp[1055]: mpi: color: id 65546 0x1000a ARGB8888
mpp[1055]: mpi: color: id 65547 0x1000b ABGR8888
mpp[1055]: mpi: color: id 65548 0x1000c BGRA8888
mpp[1055]: mpi: color: id 65549 0x1000d RGBA8888
[root@RK356X:~]#
mpi_enc_test 的命令参数中,图像宽度(w)图像高度(h),码流类型(t)为强制要求参数,其他参数如输入文件(i),输出文件(o),编码帧数(n)等为可选参数。如果没有指定输入文件,mpi_enc_test 会生成默认彩条图像进行编码。
以编码/mnt/sdcard 下的 soccer_720x480_30fps.yuv 文件 10 帧为例,对 demo 和输出进行说明。运行的命 令为:
mpi_enc_test -w 640 -h 480 -t 7 \
-i /mnt/sdcard/ir.yuv \
-o /mnt/sdcard/out.h264 -n 10
然后使用 ls –l 查看输出的码流文件:
[root@RK356X:~]# mpi_enc_test -w 640 -h 480 -t 7 -i /mnt/sdcard/ir.yuv -o /mnt/sdcard/out.h264
-n 10
mpp[1079]: mpi_enc_utils: cmd parse result:
mpp[1079]: mpi_enc_utils: input file name: /mnt/sdcard/ir.yuv
mpp[1079]: mpi_enc_utils: output file name: /mnt/sdcard/out.h264
mpp[1079]: mpi_enc_utils: width : 640
mpp[1079]: mpi_enc_utils: height : 480
mpp[1079]: mpi_enc_utils: format : 0
mpp[1079]: mpi_enc_utils: type : 7
mpp[1079]: mpi_enc_test: mpi_enc_test start
mpp[1079]: mpp_rt: NOT found ion allocator
mpp[1079]: mpp_rt: found drm allocator
mpp[1079]: mpp_info: mpp version: 31814aea author: Herman Chen 2021-09-30 [vepu]: Add offset_x
offset_y support for vepu
mpp[1079]: mpi_enc_test: 0x19509440 mpi_enc_test encoder test start w 640 h 480 type 7
mpp[1079]: mpp_enc: MPP_ENC_SET_RC_CFG bps 1152000 [72000 : 1224000] fps [30:30] gop 60
mpp[1079]: h264e_api_v2: MPP_ENC_SET_PREP_CFG w:h [640:480] stride [640:480]
mpp[1079]: mpp_enc: send header for set cfg change input/format
mpp[1079]: mpp_enc: mode vbr bps [72000:1152000:1224000] fps fix [30/1] -> fix [30/1] gop i [60]
v [0]
mpp[1079]: mpi_enc_test: 0x19509440 encoded frame 0 size 65497 qp 29
mpp[1079]: mpi_enc_test: 0x19509440 encoded frame 1 size 22195 qp 41
mpp[1079]: mpi_enc_test: 0x19509440 encoded frame 2 size 122 qp 31
mpp[1079]: mpi_enc_test: 0x19509440 loop times 1
mpp[1079]: mpi_enc_test: 0x19509440 encoded frame 3 size 25087 qp 42
mpp[1079]: mpi_enc_test: 0x19509440 encoded frame 4 size 6970 qp 50
mpp[1079]: mpi_enc_test: 0x19509440 encoded frame 5 size 122 qp 37
mpp[1079]: mpi_enc_test: 0x19509440 loop times 2
mpp[1079]: mpi_enc_test: 0x19509440 encoded frame 6 size 18336 qp 47
mpp[1079]: mpi_enc_test: 0x19509440 encoded frame 7 size 6485 qp 50
mpp[1079]: mpi_enc_test: 0x19509440 encoded frame 8 size 123 qp 41
mpp[1079]: mpi_enc_test: 0x19509440 loop times 3
mpp[1079]: mpi_enc_test: 0x19509440 encoded frame 9 size 16033 qp 49
mpp[1079]: mpi_enc_test: 0x19509440 encode max 10 frames
mpp[1079]: mpi_enc_test: 0x19509440 mpi_enc_test success total frame 10 bps 3863280
[root@RK356X:~]#
库以及环境相关的 log 同 mpi_dec_test。
mpp[1079]: mpp_enc: MPP_ENC_SET_RC_CFG bps 1152000 [72000 : 1224000] fps [30:30] gop 60
编码器的码率控制参数配置,目标比特率为 1.2Mbps。
mpp[1079]: mpi_enc_test: 0x55a4f128c0 encoded frame 0 size 65498 qp 29
编码器运行编码一帧,以及输出的一帧码流大小情况。
mpp[1079]: mpi_enc_test: 0x55a4f128c0 mpi_enc_test success total frame 10 bps 3863304
编码器完成了 10 帧的编码,这 10 帧的码率为 3.9Mbps。注,这里编码不足 30帧,码率有偏差,如果编码 30 帧,实际码率为 1.3Mbps。
编码器的 demo 具体代码参见 test/mpi_enc_test.c 。目前编码器 demo 使用的是 enqueue/dequeue 接口模式,后续会进行修改。
三、MPP 实用工具
MPP 提供了一些单元测试用的工具程序,这种程序可以对软硬件平台以及 MPP 库本身进行测试:
mpp_info_test
用于读取和打印 MPP 库的版本信息,在反馈问题时,可以把打印出来信息附上。
[root@RK356X:~]# mpp_info_test
mpp[1082]: mpp_info_test: normal version log:
mpp[1082]: mpp_info: mpp version: 31814aea author: Herman Chen 2021-09-30 [vepu]:
Add offset_x offset_y support for vepu
mpp[1082]: mpp_info_test: history version log:
mpp[1082]: mpp_info: mpp version history 10:
mpp[1082]: mpp_info: 31814aea author: Herman Chen 2021-09-30 [vepu]: Add
offset_x offset_y support for vepu (HEAD, m/linux)
mpp[1082]: mpp_info: 70d330b2 author: Ding Wei 2021-09-23 [vproc]: missing
set mode, when 2 in 1 out case
mpp[1082]: mpp_info: 6cc2ef5f author: Herman Chen 2021-09-17 [mpp_list]: Add
list_mode and list_move_tail
mpp[1082]: mpp_info: c5cd650f author: Herman Chen 2021-09-17 [mpi]: Add start
/ stop / pause / resume ctrl cmd
mpp[1082]: mpp_info: db487e5d author: Herman Chen 2021-09-17 [mpp_dec]: Add
MPP_DEC_GET_CFG cmd implement
mpp[1082]: mpp_info: 8aa7415f author: Yandong Lin 2021-09-17 [hal_h264d]: Add
h264d hw_type config implement
mpp[1082]: mpp_info: 3364f770 author: Johnson Ding 2021-09-17 [vepu541]: Fix
hfill and wfill config
mpp[1082]: mpp_info: 43620922 author: Herman Chen 2021-09-15 [mpp]: Add jpeg
hw_type config implement
mpp[1082]: mpp_info: 6eac8bf4 author: Herman Chen 2021-09-15 [mpp_dec_cfg]: Add
type, coding and hw_type config
mpp[1082]: mpp_info: baf1efa9 author: Yandong Lin 2021-09-14 [mpp_dec_vproc]:
fix err frame output issue
[root@RK356X:~]#
四、gst-play 视频播放
单窗口视频播放:
gst-play-1.0 /mnt/sdcard/SampleVideo_1280x720_5mb.mp4
多窗口视频播放: 先找到多窗口的脚本再执行:
cd rockchip_test/video/
sh test_gst_multivideo.sh test #pro,有可能名称不是这个,可能是 test_multivideo.sh
killall videowidget
etc/init.d/S50launcher stop
etc/init.d/S50launcher start
五、qplayer 编译
编译之前执行命令:
~/rk3568/rk356x_linux_release$ source envsetup.sh
...
Which would you like? [0]: 69
编译 qplayer:
~/rk3568/rk356x_linux_release$ make qplayer
umask 0022 && make -C /home/rk3568/rk356x_linux_release/buildroot
O=/home/rk3568/rk356x_linux_release/buildroot/output/rockchip_rk3568 qplayer
/usr/bin/make -j1 O=/home/rk3568/rk356x_linux_release/buildroot/output/rockchip_rk3568
HOSTCC="/usr/bin/gcc" HOSTCXX="/usr/bin/g++" silentoldconfig
GEN /home/rk3568/rk356x_linux_release/buildroot/output/rockchip_rk3568/Makefile
重新编译 qplayer:
~/rk3568/rk356x_linux_release$ make qplayer-rebuild
umask 0022 && make -C /home/rk3568/rk356x_linux_release/buildroot
O=/home/rk3568/rk356x_linux_release/buildroot/output/rockchip_rk3568 qplayer-rebuild
rm -f
/home/rk3568/rk356x_linux_release/buildroot/output/rockchip_rk3568/build/qplayer-1.0/.stamp_
rsynced
rm -f
/home/rk3568/rk356x_linux_release/buildroot/output/rockchip_rk3568/build/qplayer-1.0/.stamp_
staging_installed
rm -f
/home/rk3568/rk356x_linux_release/buildroot/output/rockchip_rk3568/build/qplayer-1.0/.stamp_
target_installed
rm -f
/home/rk3568/rk356x_linux_release/buildroot/output/rockchip_rk3568/build/qplayer-1.0/.stamp_
images_installed
rm -f
/home/rk3568/rk356x_linux_release/buildroot/output/rockchip_rk3568/build/qplayer-1.0/.stamp_
host_installed
touch
/home/rk3568/rk356x_linux_release/buildroot/output/rockchip_rk3568/build/qplayer-1.0/.stamp_
built || true
rm -f
/home/rk3568/rk356x_linux_release/buildroot/output/rockchip_rk3568/build/qplayer-1.0/.stamp_
built
>>> qplayer 1.0 Syncing from source dir
/home/rk3568/rk356x_linux_release/buildroot/../app/qplayer
rsync -au --chmod=u=rwX,go=rX --exclude .svn --exclude .git --exclude .hg --exclude .bzr
--exclude CVS /home/rk3568/rk356x_linux_release/buildroot/../app/qplayer/
/home/rk3568/rk356x_linux_release/buildroot/output/rockchip_rk3568/build/qplayer-1.0
M qplayer.cpp
WARN: /home/rk3568/rk356x_linux_release/buildroot/../app/qplayer is dirty!
>>> qplayer 1.0 Building
PATH="/home/rk3568/rk356x_linux_release/buildroot/output/rockchip_rk3568/host/bin:/home/rk35
68/rk356x_linux_release/buildroot/output/rockchip_rk3568/host/sbin:/home/.local/bin:/usr/loc
al/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin"
/usr/bin/make -j9 -C
/home/rk3568/rk356x_linux_release/buildroot/output/rockchip_rk3568/build/qplayer-1.0
make[2]: Nothing to be done for 'first'.
>>> qplayer 1.0 Installing to target
mkdir -p
/home/rk3568/rk356x_linux_release/buildroot/output/rockchip_rk3568/target/usr/share/applicat
ions
/home/rk3568/rk356x_linux_release/buildroot/output/rockchip_rk3568/target/usr/share/icon
/usr/bin/install -D -m 0644
/home/rk3568/rk356x_linux_release/buildroot/output/rockchip_rk3568/build/qplayer-1.0/icon_pl
ayer.png
/home/rk3568/rk356x_linux_release/buildroot/output/rockchip_rk3568/target/usr/share/icon/
/usr/bin/install -D -m 0755
/home/rk3568/rk356x_linux_release/buildroot/output/rockchip_rk3568/build/qplayer-1.0/qplayer
/home/rk3568/rk356x_linux_release/buildroot/output/rockchip_rk3568/target/usr/bin/
/usr/bin/install -D -m 0755
/home/rk3568/rk356x_linux_release/buildroot/output/rockchip_rk3568/build/qplayer-1.0/qplayer.
desktop
/home/rk3568/rk356x_linux_release/buildroot/output/rockchip_rk3568/target/usr/share/applicat
ions/
删除 qplayer:
~/rk3568/rk356x_linux_release$ make qplayer-dirclean
umask 0022 && make -C /home/rk3568/rk356x_linux_release/buildroot
O=/home/rk3568/rk356x_linux_release/buildroot/output/rockchip_rk3568 qplayer-dirclean
rm -Rf /home/rk3568/rk356x_linux_release/buildroot/output/rockchip_rk3568/build/qplayer-1.0
Buildroot 固 件 已 经 默 认 安 装 了 qplayer , 播 放 器 默 认 播 放/oem/SampleVideo_1280x720_5mb.mp4 文件,可以从/mnt/sdcard 里面拷贝到/oem 目录下:
cp /mnt/sdcard/SampleVideo_1280x720_5mb.mp4 /oem/
在桌面上点击 qplayer 图标即可运行,在桌面上也可点击 multivideoplayer 图标运行。
- 分享
- 举报
-
浏览量:5188次2022-09-26 11:51:17
-
浏览量:9904次2022-09-27 10:22:54
-
浏览量:13446次2022-09-28 13:51:28
-
浏览量:3117次2021-06-12 17:32:52
-
浏览量:5292次2022-07-13 15:47:15
-
浏览量:375次2024-11-25 17:43:50
-
浏览量:6747次2021-04-20 17:50:47
-
浏览量:3099次2021-06-15 09:44:15
-
浏览量:4093次2021-04-02 09:47:41
-
浏览量:8996次2022-06-11 10:47:27
-
浏览量:9717次2022-10-12 09:28:15
-
浏览量:18457次2022-09-30 16:51:48
-
浏览量:33222次2022-06-11 11:06:24
-
浏览量:4091次2021-12-10 19:58:10
-
浏览量:5721次2021-05-11 17:35:27
-
浏览量:4205次2022-10-11 10:48:08
-
浏览量:6746次2022-10-08 14:00:42
-
浏览量:2733次2022-09-30 16:48:25
-
浏览量:5059次2022-09-30 16:40:59
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
一休摸鱼
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明