tempotian/media_player

0.5.0

Latest
uploaded 5 hours ago
Media Player

readme

# ESP Media Player Component

A comprehensive multimedia player component for ESP32 platforms, supporting audio and video playback with advanced features like seeking, speed control, and multiple data sources.

## Features

### 🎵 **Multi-Media Support**
- **Audio playback** with various codec support
- **Video playback** with hardware acceleration
- **Subtitle support** (future enhancement)
- **Configurable media types** via play masks

### 📡 **Flexible Data Sources**
- **Network streaming** (HTTP/HTTPS URLs)
- **Local storage** (SD card, flash storage)
- **Callback-based input** for custom data sources
- **FIFO buffer input** for real-time streaming
- **Push mode** for manual data feeding (planned)

### 🎮 **Playback Control**
- **Basic controls**: Play, pause, stop, resume
- **Speed control**: Variable playback speed (0.5x, 1x, 2x, etc.)
- **Seeking**: Time-based seeking with millisecond precision
- **Loop playback**: Auto-replay functionality
- **Position tracking**: Get current playback position and duration

### 🔧 **Advanced Features**
- **Event-driven architecture** with comprehensive callback system
- **Stream information** querying and management
- **Interrupt/recover** functionality for resource optimization
- **Configurable FIFO buffers** for async processing
- **Debug utilities** for performance monitoring

## Architecture

```
┌─────────────────┐    ┌──────────────┐    ┌─────────────────┐
│   Data Source   │───▶│   Extractor  │───▶│    Decoder      │
│ (Network/File)  │    │  (Demuxer)   │    │ (Audio/Video)   │
└─────────────────┘    └──────────────┘    └─────────────────┘
                                                      │
                                                      ▼
┌─────────────────┐    ┌──────────────┐    ┌─────────────────┐
│   Application   │◀───│   Events     │    │    Renderer     │
│   (Your Code)   │    │  Callbacks   │    │ (Audio/Video)   │
└─────────────────┘    └──────────────┘    └─────────────────┘
```

## Quick Start

### 1. Basic Setup

```c
#include "player.h"
#include "av_render.h"

// Initialize audio and video renderers
audio_render_handle_t audio_render = audio_render_create(...);
video_render_handle_t video_render = video_render_create(...);

// Configure player
player_cfg_t cfg = {
    .play_mask = PLAY_MASK_AUDIO | PLAY_MASK_VIDEO,
    .audio_render = audio_render,
    .video_render = video_render,
    .no_accurate_seek = false
};

// Create player instance
media_player_handle_t player = media_player_open(&cfg);
```

### 2. Set Event Callback

```c
int player_event_callback(player_event_t event, void *ctx) {
    switch (event) {
        case PLAYER_EVENT_PREPARED:
            printf("Media file prepared, ready to play\n");
            break;
        case PLAYER_EVENT_PLAYED_DONE:
            printf("Playback started successfully\n");
            break;
        case PLAYER_EVENT_EOS:
            printf("Playback finished\n");
            break;
        case PLAYER_EVENT_PLAY_ERROR:
            printf("Playback error occurred\n");
            break;
        // Handle other events...
    }
    return 0;
}

media_player_set_callback(player, player_event_callback, NULL);
```

### 3. Play Media File

```c
// Set media source (local file)
media_player_set_source(player, MEDIA_SRC_TYPE_FILE, "/sdcard/video.mp4");

// Or network stream
media_player_set_source(player, MEDIA_SRC_TYPE_HTTP, "http://example.com/stream.mp4");

// Start playback
media_player_play(player);
```

## API Reference

### Core Functions

#### `media_player_open(player_cfg_t *cfg)`
Creates a new player instance with specified configuration.

#### `media_player_set_source(player, src_type, uri)`
Sets the media source (file path or URL).

#### `media_player_play(player)`
Starts or resumes playback.

#### `media_player_stop(player)`
Stops playback (can be resumed with play).

#### `media_player_close(player)`
Destroys the player instance and frees resources.

### Playback Control

#### `media_player_set_speed(player, speed)`
Controls playback speed:
- `0.0` - Pause
- `1.0` - Normal speed
- `0.5` - Half speed
- `2.0` - Double speed

#### `media_player_seek_time(player, time_ms)`
Seeks to specific time position in milliseconds.

#### `media_player_set_loop(player, loop)`
Enables/disables loop playback.

### Information Retrieval

#### `media_player_get_position(player, &position)`
Gets current playback position in milliseconds.

#### `media_player_get_duration(player, &duration)`
Gets total media duration in milliseconds.

#### `media_player_get_stream_info(player, stream_type, idx, &info)`
Retrieves information about specific audio/video streams.

## Advanced Usage

### Custom Data Source

```c
int my_read_callback(void *data, uint32_t size, void *ctx) {
    // Read data from custom source
    return bytes_read;
}

int my_seek_callback(uint32_t position, void *ctx) {
    // Seek in custom source
    return 0; // success
}

media_player_set_source_by_callback(player, my_read_callback,
                                   my_seek_callback, my_context);
```

### Performance Optimization

```c
player_fifo_cfg_t fifo_cfg = {
    .adec_fifo_size = 8192,    // Audio decoder buffer
    .vdec_fifo_size = 16384,   // Video decoder buffer
    .arender_fifo_size = 4096, // Audio render buffer
    .vrender_fifo_size = 8192, // Video render buffer
    .extractor_pool_size = 10  // Frame pool size
};

media_player_set_fifo_size(player, &fifo_cfg);
```

### Resource Management

```c
// Temporarily free resources while keeping playback position
media_player_interrupt(player);

// ... other operations ...

// Resume from interrupted position
media_player_recover(player);
```

## Event Types

| Event | Description |
|-------|-------------|
| `PLAYER_EVENT_SRC_CONNECTING` | Connecting to data source |
| `PLAYER_EVENT_SRC_CONNECTED` | Successfully connected |
| `PLAYER_EVENT_PREPARED` | Media file parsed and ready |
| `PLAYER_EVENT_PLAYED_DONE` | Playback started |
| `PLAYER_EVENT_EOS` | End of stream reached |
| `PLAYER_EVENT_SEEK_DONE` | Seek operation completed |
| `PLAYER_EVENT_PLAY_ERROR` | Playback error occurred |

## Error Codes

| Code | Constant | Description |
|------|----------|-------------|
| `-1` | `PLAYER_ERR_INVAID_ARG` | Invalid argument |
| `-2` | `PLAYER_ERR_NOT_ALLOW` | Operation not allowed |
| `-3` | `PLAYER_ERR_NO_MEM` | Out of memory |

## Dependencies

- **ESP-IDF** framework
- **esp_extractor** - Media parsing and demuxing
- **av_render** - Audio/video rendering
- **media_src** - Data source abstraction

## Examples

Check the `examples/` directory for complete working examples:
- `video_player/` - Basic video player implementation
- `player_cli/` - Command-line media player

## Performance Considerations

1. **Memory Usage**: Configure FIFO sizes based on available RAM
2. **Threading**: Larger FIFO buffers enable async processing but use more resources
3. **Seeking**: Disable accurate seek (`no_accurate_seek = true`) for faster seeking
4. **Network Streaming**: Ensure stable network connection for smooth playback

## Supported Formats

- **Video**: H.264, MJPEG
- **Audio**: AAC, MP3, PCM
- **Containers**: MP4, AVI, MPEG-TS, WAV, FLV, OGG etc

## License

SPDX-License-Identifier: LicenseRef-Espressif-Modified-MIT

See LICENSE file for details.

Supports all targets

License: Custom

To add this component to your project, run:

idf.py add-dependency "tempotian/media_player^0.5.0"

or download archive

Stats

  • Archive size
    Archive size ~ 4.38 MB
  • Downloaded in total
    Downloaded in total 0 times
  • Downloaded this version
    This version: 0 times

Badge

tempotian/media_player version: 0.5.0
|