# 多媒体示例程序
## 概述
墨芯一代 Antoum 芯片集成了先进的多媒体硬件加速器套件,包括 4 个高效视频解码器引擎、1 个视频编码器引擎、4 个 JPEG 编解码器引擎和 4 个灵活的图像处理引擎。视频解码器引擎能够支持包括 H.264、H.265 在内的多种视频格式,实现多达 32 路 1080p 视频的同时解码,且解码可高达 60 帧每秒(FPS);JPEG 编解码器引擎则擅长处理多路 JPEG 图像的编解码任务,能够以 435 FPS 速度解码 4 路 1080p 的图片;此外,图像处理引擎还具备出色的多路图片裁剪与缩放功能,满足多样化的图像处理需求。
## 前提条件
* 服务器已安装墨芯 AI 计算卡(例如 S30), 且能被系统正确识别。
* 已安装 SOLA。安装 SOLA 的步骤,请参见 [SOLA Toolkit 安装指南](https://docs.moffettai.com/moffett_docs/macs-1.7/installation/sola-toolkit-installation-guide.html)。
* 安装 FFmpeg,FFmpeg 安装步骤如下:
```bash
$ wget https://moffett-oss-bucket.tos-cn-shanghai.volces.com/sola-demo/sola-demo-3.11.0.tar.gz
$ tar -zxvf sola-demo-3.11.0.tar.gz
$ cd sola-demo-3.11.0/multimedia/third_party/ffmpeg-4.4.5
$ ./configure --enable-shared --disable-static --disable-doc --disable-x86asm
$ make -j
# 默认安装到 /usr/local
$ sudo make install
$ cd ../../
```
检查当前 ld 搜索路径是否包含 /usr/local/lib:
```bash
$ ldconfig -v 2>/dev/null | grep ':'
```
如果没有包含,则参考以下方式添加:
```bash
$ echo /usr/local/lib | sudo tee -a /etc/ld.so.conf.d/x86_64-linux-gnu.conf
```
最后执行以下命令刷新系统动态库搜索路径的缓存:
```bash
$ sudo ldconfig
```
## 编译示例程序
在 multimedia 目录下,执行以下命令,编译 multimedia 目录下的所有示例程序:
```bash
$./build.sh
```
编译完成后,会在当前目录下生成 build/[project] 目录,其中包含了编译好的示例程序。
### 使用墨芯 AI 计算卡实现视频解码
视频解码是将压缩编码的视频数据还原为原始图像和声音的过程,它是视频播放、监控、传输等系统中的关键环节。
### 输入输出信息说明
| **信息** | **说明** |
|-------------------|--------------------------------------------------------------------------|
| **输入形式** | - 视频文件:如 MP4、H.264、H.265 文件
- RTMP 在线视频流
**注意**:
- 输入视频分辨率 ≤ 1920×1080
- 最多支持 32 路并行解码 |
| **输入编码格式** | H.264 / H.265(HEVC) |
| **输出格式** | JPEG 格式图片 |
### 使用示例
在multimedia 目录下编译后,二进制程序会生成在 build/AppDecode 目录下,测试文件位于 data/input/vpu 目录下,执行以下命令,实现视频解码:
```bash
$ ./build/AppDecode/AppDec --device_id=0 --core_id=0 --input_file=data/input/vpu/cip_B_NEC_3.265 --chan_num=1
```
**说明**:运行以上命令后,会在当前目录下生成解码后的 JPEG 图片,图片格式为 devX.coreY.output_vZ_f{n}.jpg,其中 X 代表 device_id,Y 代表 core_id,Z 代表 channel_id,{n} 代表帧序号(例如dev0.core0.output_v1_f1.jpg)。您可以将这些生成的图片与位于data/golden/vpu 目录下的对应图片进行对比,若两者完全一致,则表明解码过程成功。
参数说明如下:
| **参数** | **是否必须** | **说明** |
|---------------|-------------|--------------------------------------------------------------------------|
| `device_id` | 否 | 指定运行应用程序的 Antoum 芯片:
- 可单独指定(如 `1`)或连续指定(如 `0-2`)
- **取值范围**:`0` ~ `{device_count - 1}`
- **默认值**:`0` |
| `core_id` | 否 | 指定 Antoum 芯片的运行核:
- 可单独指定(如 `1`)或连续指定(如 `0-3`)
- **取值范围**:`0` ~ `3`
- **默认值**:`0` |
| `input_file` | 是 | 输入视频文件/在线视频流的路径(需完整路径) |
| `chan_num` | 是 | 核上视频处理的总路数:
- **取值范围**:`1` ~ `8`
- **默认值**:`1` |
| `save_file` | 是 | 是否保存处理结果为 JPG 图片:
- `0`:不保存
- `1`:保存(默认) |
| `output_dir` | 是 | 输出 JPG 图片的存放目录(默认当前目录) |
## 使用墨芯 AI 计算卡实现图片裁剪缩放
图像处理技术是指对数字图像进行各种操作和处理的技术。它可以用于图像增强、图像复原、图像压缩、图像分割、图像识别等领域。
### 输入输出信息说明
| 信息 | 说明 |
|-------------|----------------------------------------------------------------------|
| **输入信息** | |
| 格式 | NV12 格式图片 |
| 尺寸要求 | 必须 ≥ 8x8 且 ≤ 4096x4096 |
| 并行处理 | 最多支持 32 路并行 |
| **输出信息** | |
| 格式 | JPEG 格式图片 |
| 尺寸要求 | 必须 ≥ 32x32 且 ≤ 4096x4096,且宽度为 16 的倍数 |
| **裁剪窗** | 必须 ≥ 8x8 且 ≤ 输入图像尺寸 |
## 使用示例
在multimedia 目录下编译后,二进制程序会生成在 build/AppPPB 目录下,测试文件位于 data/input/pp 目录下,在 multimedia 目录下执行以下命令,实现图片的裁剪缩放:
```bash
$ ./build/AppPPB/AppPpb --device_id=0 --core_id=0 --input_img=data/input/pp/640x480.yuv --input_width=640 --input_height=480 --output_width=640 --output_height=480 --crop_top=0 --crop_left=0 --crop_bottom=480 --crop_right=640 --chan_num=1
```
**说明**:运行后会在当前目录下生成裁剪缩放后的 JPEG 图片,图片格式为 devX.coreY.outputZ.jpg,其中 X 代表 device_id,Y 代表 core_id,Z 代表 channel_id(例如 dev0.core0.output1.jpg)。
您可将生成的图片与 data/golden/pp 目录下的对应的图片进行对比,查看是否符合预期。
参数说明如下:
| 参数 | 是否必须 | 说明 | 取值范围与默认值 |
|---------------|----------|----------------------------------------------------------------------|------------------------------------------|
| **device_id** | 否 | 指定运行的 Antoum 芯片(可单独或连续指定,如 `1`、`0-2`) | `0` ~ `{device_count-1}`
默认值:`0` |
| **core_id** | 否 | 指定芯片运行的核(可单独或连续指定,如 `1`、`0-3`) | `0` ~ `3`
默认值:`0` |
| **input_img** | 是 | 输入 YUV 图片路径 | - |
| **input_width** | 是 | 输入图片宽度 | `8` ~ `4096` |
| **input_height** | 是 | 输入图片高度 | `8` ~ `4096` |
| **output_width** | 是 | 输出 JPEG 图片宽度(需为 16 的倍数) | `32` ~ `4096` |
| **output_height** | 是 | 输出 JPEG 图片高度 | `32` ~ `4096` |
| **crop_top** | 否 | 裁剪框左上角纵坐标 | `0` ~ `input_height`
默认值:`0` |
| **crop_left** | 否 | 裁剪框左上角横坐标 | `0` ~ `input_width`
默认值:`0` |
| **crop_bottom** | 否 | 裁剪框右下角纵坐标 | `crop_top` ~ `input_height`
默认值:`input_height` |
| **crop_right** | 否 | 裁剪框右下角横坐标 | `crop_left` ~ `input_width`
默认值:`input_width` |
| **chan_num** | 否 | 核上图像处理总路数 | `1` ~ `8`
默认值:`1` |
| **save_file** | 否 | 是否保存结果:
`0`=不保存
`1`=保存为 JPG | 默认值:`1` |
| **output_dir** | 否 | 输出 JPG 目录(默认当前目录) | - |