video_player

Example of the component espressif/esp_player v1.0.0
# ESP Player Audio/Video Playback

- [中文版](./README_CN.md)
- Basic Example: ⭐

## Example Brief

This example shows how to play video url with **ESP Player** combine with the highlevel module provided by `esp-gmf`:

- **esp_board_manager** initializes the LCD, audio DAC, and microSD card.
- **esp_player** handles demux, decode, A/V sync, and playback control.
- **esp_audio_render** outputs decoded audio PCM to the speaker.
- **esp_video_render** handles decoded video frames and displays them on the LCD.

### Typical Scenarios

- Local MP4 playback on embedded devices with a display and speaker
- Validating the ESP Player A/V path (Extractor → Audio/Video Decoder → Render with sync)

### Supported Media Formats

**Enabled by default in this example**

| Format | Example | Notes |
|--------|---------|--------|
| MP4 (H.264 + AAC, typical) | `.mp4` | Default in `video_player_setup.h`: `/sdcard/test.mp4` |

`sdkconfig.defaults` enables the **MP4 extractor**, **H.264 video decoder**, **AAC audio decoder**, and **M4A simple decoder** for in-container audio. For other audio codecs inside MP4 (for example PCM), enable the matching decoder in menuconfig.

**To play other formats**

1. Run `idf.py menuconfig`.
2. Under **Component config**:
   - **ESP Extractor** — enable the matching container (for example `AVI EXTRACTOR SUPPORT`).
   - **ESP Video Codec** — enable the decoder you need (for example `VIDEO DECODER SW MJPEG SUPPORT`).
3. Edit `VIDEO_PLAYER_PLAY_URL` in `video_player_setup.h` if needed. Save and rebuild.

## Environment Setup

### Hardware Required

- **Development board**: [ESP32-S3-Korvo-2](https://docs.espressif.com/projects/esp-adf/en/latest/design-guide/dev-boards/user-guide-esp32-s3-korvo-2.html) is the default reference; [ESP32-P4-Function-EV-Board](https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32p4/esp32-p4-function-ev-board/user_guide.html) and other boards with LCD and Audio DAC are also supported.
- **Resources**: microSD card (FAT), LCD module, Audio DAC, speaker.
- PSRAM is recommended for stable decode and display.

### Default IDF Branch

This example supports IDF release/v5.4 (>= v5.4.3) and release/v5.5 (>= v5.5.2).

### Software Requirements

- Place an MP4 test file on the microSD card that matches `VIDEO_PLAYER_PLAY_URL` in `video_player_setup.h` (default `/sdcard/test.mp4`; H.264 + AAC recommended).

## Build and Flash

### Build Preparation

Before building this example, ensure the ESP-IDF environment is set up. If it is already set up, skip this paragraph and go to the project directory. If not, run the following in the ESP-IDF root directory to complete the environment setup. For full steps, see the [ESP-IDF Programming Guide](https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/index.html).

```
./install.sh
. ./export.sh
```

Brief steps:

- Go to this example's project directory:

```
cd $YOUR_GMF_PATH/packages/esp_player/examples/video_player
```

This example uses [ESP Board Manager](https://github.com/espressif/esp-board-manager) to manage board-level resources. The [`esp-bmgr-assist`](https://pypi.org/project/esp-bmgr-assist/) helper tool is recommended as the default entry point.

- Install once in your activated ESP-IDF Python environment:

```bash
pip install esp-bmgr-assist
pip install --upgrade esp-bmgr-assist
```

- List supported boards:

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

  Example output:

```text
ℹ️  Main Boards:
  [1] dual_eyes_board_v1_0
  [2] esp32_c3_lyra
  [3] esp32_c5_spot
  [4] esp32_p4_function_ev
  [5] esp32_s3_korvo2_v3
  [6] esp32_s3_korvo2l
  [7] esp_box_3
  [8] esp_box_lite
  [9] esp_hi
```

- Select a board:

```bash
idf.py bmgr -b <board_index|board_name>
```

  For example, to select `esp32_s3_korvo2_v3`:

```bash
idf.py bmgr -b 5
# or
idf.py bmgr -b esp32_s3_korvo2_v3
```

  On first invocation, the component is downloaded automatically based on the `espressif/esp_board_manager` dependency declared in `main/idf_component.yml`.

> [!NOTE]
> To switch to a different board supported by `esp_board_manager`, repeat the same steps with the new board name or index.
> For a custom board, see [How to customize board](https://github.com/espressif/esp-board-manager/blob/main/esp_board_manager/docs/how_to_customize_board.md).
> For more information about `esp_board_manager`, see the [ESP Board Manager Getting Started Guide](https://github.com/espressif/esp-board-manager/blob/main/esp_board_manager/README.md).

### Project Configuration

Edit `video_player_setup.h`:

- `VIDEO_PLAYER_PLAY_URL` — media URL (default `/sdcard/test.mp4`)
- `VIDEO_PLAYER_OUTPUT_VOLUME` — codec output volume (`0`–`100`, default `60`)

To enable other media formats, use `idf.py menuconfig` under **Component config** (see **Supported Media Formats** above).

### Build and Flash

- Build the example

```
idf.py build
```

- Flash and open the serial monitor (replace PORT with your port name):

```
idf.py -p PORT flash monitor
```

- Exit the monitor with `Ctrl-]`

## How to Use the Example

### Features and Usage

- After reset, the example mounts the microSD card, initializes the LCD, codec, and ESP Player, plays the MP4 from `VIDEO_PLAYER_PLAY_URL` (audio and video together), waits until playback finishes, then releases resources.
- The default demo uses a local SD file (`/sdcard/test.mp4`). For HTTP/HTTPS or HLS, enable the matching options under **ESP Player → Input IO sources** in menuconfig, then edit `VIDEO_PLAYER_PLAY_URL` and see [ESP Player README](../../README.md).

### Log Output

- A successful run prints SD mount, media stack setup, playback start, wait for completion, and teardown. Key steps are marked `[ 1 ]`–`[ 4 ]`, followed by `Playback started`, `Playback finished`, and `video_player example finished`.

```c
I (853) main_task: Calling app_main()
I (864) VIDEO_PLAYER: [ 1 ] Mount SD card
I (1089) VIDEO_PLAYER: [ 2 ] Set up media stack, audio/video render, and ESP Player
I (1118) VIDEO_PLAYER: [ 3 ] Play /sdcard/test.mp4
I (1123) VIDEO_PLAYER: Playback started
I (1181) VIDEO_PLAYER: [ 4 ] Wait until playback finishes
I (45292) VIDEO_PLAYER: Playback finished
I (45416) VIDEO_PLAYER: video_player example finished
I (45420) main_task: Returned from app_main()
```

## Troubleshooting

### Cannot open file

- Check that files on the SD card match `VIDEO_PLAYER_PLAY_URL` in `video_player_setup.h` and that the card is mounted (FAT).

### video_player_setup failed / No display_lcd

- Ensure the selected board YAML includes a **display_lcd** device and that you ran `idf.py bmgr -b <board>` with an LCD-capable board.

### Playback error soon after start (`ESP_PLAYER_EVENT_ERROR`)

**Symptom**: You see `Playback started`, then the event callback logs an ERROR shortly afterward, followed by `Video playback failed`.

**Sample log**:

```text
I (xxxx) VIDEO_PLAYER: Playback started
E (xxxx) ESP_PLAYER_PIPE_EVT: Extractor error
E (xxxx) ESP_PLAYER_EXTRACTOR: Parse stream error, ret: -1
E (xxxx) VIDEO_PLAYER: Playback error (error_source=1)
E (xxxx) VIDEO_PLAYER: Video playback failed
```

`error_source` comes from `esp_player_error_source_t` in `esp_player_types.h` and is delivered with `ESP_PLAYER_EVENT_ERROR`. This example uses A/V sync playback (`ESP_PLAYER_MASK_AV`). Common values:

| `error_source` | Enum | Meaning | Common TAG / keywords | What to do |
|----------------|------|---------|----------------------|------------|
| `1` | `ESP_PLAYER_ERROR_SOURCE_EXTRACTOR` | Demux / read failure | `ESP_PLAYER_PIPE_EVT: Extractor error`; `ESP_PLAYER_EXTRACTOR: Open extractor error` / `Parse stream error` / `Read frame error`; `ESP_PLAYER: Invalid media URI` / `Unsupported format:` | Verify SD path matches `VIDEO_PLAYER_PLAY_URL` and the MP4 is not corrupt; for non-MP4 containers see [Supported Media Formats](#supported-media-formats) and enable the matching **ESP Extractor** in menuconfig |
| `2` | `ESP_PLAYER_ERROR_SOURCE_AUDIO_DECODER` | Audio track decode failure | `ESP_PLAYER_PIPE_EVT: Audio decoder error`; `ESP_PLAYER_PIPELINE: Cannot create audio decoder` | Container opens but the audio track cannot be decoded: enable the codec under **ESP Audio Codec** in menuconfig (AAC by default; PCM etc. need extra options); see [Video but no audio](#video-but-no-audio) |
| `3` | `ESP_PLAYER_ERROR_SOURCE_AUDIO_RENDER` | Audio render / output failure | `ESP_PLAYER_PIPE_EVT: Audio render error`; `ESP_PLAYER_AUDIO_RENDER: Open audio render stream error` / `Write audio render stream error`; `ESP_PLAYER_STATE: Failed to start audio renderer` | Run `idf.py bmgr -b <board>`, check board Audio DAC and `VIDEO_PLAYER_OUTPUT_VOLUME` (see [Video but no audio](#video-but-no-audio)) |
| `4` | `ESP_PLAYER_ERROR_SOURCE_VIDEO_DECODER` | Video track decode failure | `ESP_PLAYER_PIPE_EVT: Video decoder error`; `ESP_PLAYER_PIPELINE: video_decoder: esp_gmf_pipeline_report_info(VIDEO) failed` | Enable the decoder matching the MP4 video codec under **ESP Video Codec** in menuconfig (H.264 SW decode by default); see [Supported Media Formats](#supported-media-formats) |
| `5` | `ESP_PLAYER_ERROR_SOURCE_VIDEO_RENDER` | Video display / render failure | `ESP_PLAYER_PIPE_EVT: Video render error`; `ESP_PLAYER_VIDEO_RENDER: Failed to open video render stream` / `Invalid configuration or render handle`; `VIDEO_PLAYER_SETUP: Failed to set LCD display backend` | Ensure the board YAML includes display_lcd and `idf.py bmgr -b <board>` was run (see [video_player_setup failed / No display_lcd](#video_player_setup-failed--no-display_lcd)); enable PSRAM on RGB/DSI boards (see [Choppy video](#choppy-video) and target `sdkconfig.defaults.*`) |

**Suggested steps**:

1. Search the monitor for `Playback error (error_source=` and note the value.
2. Scroll up to the matching `E (...)` lines from the TAGs in the table above.
3. Apply the fix; if format support is involved, enable the required extractor/decoder `CONFIG_*` options and rebuild (see [Supported Media Formats](#supported-media-formats)).

> **Note**: If you never see `Playback started` and get `Playback start failed` instead, `esp_player_set_data_src()` / `esp_player_run()` failed synchronously—check URL and SD mount ([Cannot open file](#cannot-open-file)), not the runtime `error_source` table above. If `video_player_setup failed` appears at step `[ 2 ]`, LCD/render init failed—see [video_player_setup failed / No display_lcd](#video_player_setup-failed--no-display_lcd).

### Video but no audio

- Check that the board has an Audio DAC, `VIDEO_PLAYER_OUTPUT_VOLUME` in `video_player_setup.h` is reasonable, and the MP4 audio track uses an enabled codec (AAC by default).

### Choppy video

- Enable PSRAM or use a lower-resolution / lower-bitrate MP4 file.

### board_manager build or board selection failure

- Install `esp-bmgr-assist` in the activated IDF Python environment, run `idf.py bmgr -b <board>`, then rebuild. Please refer to [esp-bmgr-assist](https://docs.espressif.com/projects/esp-board-manager/zh_CN/latest/tools/esp-bmgr-assist.html#).

### Related References

- Component API, URLs, and advanced usage: [ESP Player README](../../README.md)

## Technical Support

For technical support, please use the following channels:

- ESP32 forum: [esp32.com](https://esp32.com/viewforum.php?f=20)
- GitHub issues: [esp-gmf issues](https://github.com/espressif/esp-gmf/issues)

We will get back to you as soon as possible.

To create a project from this example, run:

idf.py create-project-from-example "espressif/esp_player=1.0.0:video_player"

or download archive (~18.24 KB)