video_render

Example of the component espressif/esp_video_render v0.8.0
# 视频渲染示例

- [English](./README.md)
- 例程难度:⭐⭐

## 示例简介

- 本示例展示 `esp_video_render` 的核心使用方式,输入源为存放在 SD 卡上的 MJPEG 文件。
- 示例覆盖单流播放、双流并排播放、cached 与同步渲染方式,以及轻量进度条 overlay。
- 同时也展示了相同渲染流程在 LCD backend 和 LVGL backend 下的使用方式。

### 典型场景

- LCD 上的视频播放
- 双路 MJPEG 分屏预览
- 在视频上叠加轻量 UI
- 对比同步渲染与异步渲染行为

### 运行流程

启动后,示例会初始化 LCD 和 SD 卡,然后按顺序执行以下演示:

1. 单视频正常播放
2. 单视频同步渲染播放
3. 带进度条 overlay 的单视频播放
4. 双视频并排播放
5. 带进度条 overlay 的双视频并排播放

如果启用了 LVGL 支持,以上流程会再用 LVGL backend 重复执行一轮。

```mermaid
sequenceDiagram
    participant App
    participant Render

    App->>Render: esp_video_render_create()
    App->>Render: esp_video_render_set_display()
    App->>Render: esp_video_render_stream_open()
    App->>Render: esp_video_render_stream_set_disp_rect()
    loop 每一帧 MJPEG
        App->>Render: esp_video_render_stream_write()
        alt 启用 overlay
            App->>Render: 更新进度条 overlay
        end
    end
    App->>Render: esp_video_render_stream_close()
```

### 文件结构

```text
examples/video_render
├── main
│   ├── main.c
│   ├── progress.c
│   ├── settings.h
│   ├── video_render.c
│   └── video_render_sys.c
├── CMakeLists.txt
├── idf_ext.py
├── partitions.csv
├── README.md
└── README_CN.md
```

## 环境准备

### 硬件要求

- 一块支持 LCD 的 ESP 开发板,例如:
  - [ESP32-S3-Korvo2](https://docs.espressif.com/projects/esp-adf/en/latest/design-guide/dev-boards/user-guide-esp32-s3-korvo-2.html)
  - [ESP32-P4-Function-EV-Board](https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32p4/esp32-p4-function-ev-board/user_guide.html)
- 一块受支持的显示屏
- 一张存放 MJPEG 测试文件的 SD 卡

### 默认 IDF 分支

本示例支持 IDF release/v5.5(>= v5.5.2)。

### 软件要求

- SD 卡中准备好 MJPEG 文件
- 默认文件路径在 `main/settings.h` 中定义:
  - `LEFT_FILE`
  - `RIGHT_FILE`

## 构建与烧录

### 构建准备

开始构建前,请确保已经完成 ESP-IDF 环境安装并执行过导出。

```bash
cd /path/to/esp-gmf/packages/esp_video_render/examples/video_render
```

在构建前先为目标开发板生成 board-manager 代码,例如:

```bash
idf.py gen-bmgr-config -b esp32_p4_function_ev
```

如果你使用的是其他受支持的开发板,请将 `esp32_p4_function_ev` 替换为对应的板型名称。可通过以下命令列出支持的开发板:

```bash
idf.py gen-bmgr-config -l
```

生成 board 代码后,再构建并烧录示例:

```bash
idf.py build
idf.py -p /dev/XXXX flash monitor
```

### 工程配置

请根据测试资源更新 `main/settings.h`:

- `VIDEO_WIDTH`
- `VIDEO_HEIGHT`
- `MAX_FRAME_SIZE`
- `LEFT_FILE`
- `RIGHT_FILE`

可使用以下命令生成 MJPEG 文件:

```bash
ffmpeg -i input.mp4 -q:v 1 -c:v mjpeg -pix_fmt yuvj420p -vtag MJPG left.mjpeg
```

可使用以下命令估算最大 MJPEG 帧大小:

```bash
ffprobe -v error -select_streams v:0 -show_entries packet=size -of csv=p=0 left.mjpeg | sort -n | tail -1
```

如果需要测试 LVGL backend,请在 `menuconfig` 中启用相应配置。

## 如何使用本示例

### 功能与用法

- 将 `left.mjpeg` 和 `right.mjpeg` 复制到 SD 卡,或在 `main/settings.h` 中修改为你自己的文件路径。
- 烧录程序并复位开发板。
- 示例会自动依次执行所有播放场景,无需手动输入命令。
- 可在屏幕上观察以下差异:
  - 单流与双流布局
  - 普通播放与带进度条 overlay 的播放
  - 启用 LVGL 时 LCD backend 与 LVGL backend 的表现差异

### 结果

当文件存在且显示配置正确时,你应当能看到:

- 居中的单视频播放
- 并排的双视频播放
- 视频上的进度条 overlay
- 如启用 LVGL,则同一轮测试会以 LVGL backend 再执行一次

## 故障排查

### 找不到 MJPEG 文件

如果播放未开始,请检查 SD 卡路径是否与 `main/settings.h` 中的定义一致。

### 帧缓冲大小不足

如果 MJPEG 解析失败或播放中途停止,请增大 `MAX_FRAME_SIZE`,确保其覆盖文件中最大的编码帧。

### 显示区域过小

示例会在条件允许时自动缩小双流显示,但某些过小的显示器仍可能不足以容纳配置的视频尺寸。

## 技术支持

- 技术支持论坛:[esp32.com](https://esp32.com/viewforum.php?f=20)
- 问题反馈和功能建议:[GitHub issue](https://github.com/espressif/esp-gmf/issues)

To create a project from this example, run:

idf.py create-project-from-example "espressif/esp_video_render=0.8.0:video_render"

or download archive (~22.50 KB)