来源:AI开发日志公众号专辑「Build Your Own X With AI」
原文链接:https://mp.weixin.qq.com/s?__biz=MzUxMjg3MjE2OA==&mid=2247486168&idx=1&sn=f10e66ca4003454da7ffc475217f7da6&chksm=f95c915fce2b1849e27305364b0539f27ee3f3b7b3dd13ebbb7eb1d059674284196019c910b1#rd

FFmpeg Player

一个基于 FFmpeg 和 SDL2 的简单视频播放器,使用 C 语言开发。

,时长

00:05

功能特性

支持多种视频格式(MP4, MKV, AVI 等)

支持多种视频编码(H.264, H.265, VP9, AV1)

支持音频播放和音视频同步

基本播放控制(播放、暂停、退出)

IPB 帧类型显示

(实时显示 I/P/B 帧信息)

逐帧播放

(支持暂停后单步前进)

帧信息可视化

(显示帧编号、类型、时间戳等)

依赖项

FFmpeg 8.0+ (libavformat, libavcodec, libavutil, libswscale, libswresample)

SDL2

CMake 3.10+

C 编译器(支持 C99 标准)

安装依赖

macOS

FFmpeg 已安装在 /usr/local/bin/ffmpeg

安装 SDL2

brew install sdl2

Linux (Ubuntu/Debian)

sudo apt-get install libavformat-dev libavcodec-dev libavutil-dev libswscale-dev libswresample-dev

sudo apt-get install libsdl2-dev

sudo apt-get install cmake build-essential

构建步骤

创建构建目录

mkdir build

cd build

配置项目

cmake ..

编译

make

编译成功后,可执行文件位于 build/ 目录

使用方法

播放视频文件

./ffmpeg-player

示例

./ffmpeg-player ~/Videos/sample.mp4

播放控制

空格键

播放/暂停

右箭头键

下一帧(暂停时逐帧播放)

左箭头键

上一帧(需要 seek 支持,暂未实现)

ESC 键

退出播放器

帧信息显示

播放器会实时显示以下帧信息:

帧编号

当前解码的帧序号

帧类型

I帧(关键帧)、P帧(预测帧)、B帧(双向预测帧)

关键帧标记

显示 [KEY] 标记

PTS

显示时间戳

帧延迟

显示帧间延迟时间

帧信息会显示在:

终端输出(实时日志)

播放器窗口标题栏

项目结构

ffmpeg-player/

├── CMakeLists.txt          # CMake 构建配置

├── README.md               # 项目说明文档

├── .gitignore             # Git 忽略文件配置

├── src/                   # 源代码目录

│   ├── main.c            # 主程序入口

│   ├── demuxer.c/h       # 媒体文件解封装

│   ├── video_decoder.c/h # 视频解码

│   ├── audio_decoder.c/h # 音频解码

│   ├── video_renderer.c/h # 视频渲染

│   ├── audio_player.c/h  # 音频播放

│   └── playback_controller.c/h # 播放控制

└── tests/                 # 测试程序目录

├── test_demuxer.c

├── test_video_decoder.c

└── test_audio_decoder.c

架构设计

播放器采用模块化设计,主要组件包括:

Demuxer

负责打开媒体文件并分离音视频流

Video Decoder

负责解码视频数据包并转换像素格式

Audio Decoder

负责解码音频数据包并重采样

Video Renderer

使用 SDL2 创建窗口并渲染视频帧

Audio Player

使用 SDL2 播放音频

Playback Controller

协调各组件,管理播放状态,实现音视频同步

技术特点

音视频同步

采用音频时钟为主时钟的同步策略

错误处理

统一的错误码系统和错误处理机制

日志系统

分级日志输出(ERROR, WARNING, INFO, DEBUG)

内存管理

及时释放资源,避免内存泄漏

已知限制

当前版本为单线程实现

不支持 seek 操作(快进/快退/上一帧)

不支持硬件加速解码

不支持字幕显示

逐帧播放仅支持前进,不支持后退(需要 seek 功能)

开发状态

项目已完成核心功能开发:

[x] 项目结构初始化

[x] Demuxer 组件(媒体文件解封装)

[x] Video Decoder 组件(视频解码)

[x] Video Renderer 组件(SDL2 视频渲染)

[x] 基础播放功能(视频播放主循环)

[x] Audio Decoder 组件(音频解码)

[x] Audio Player 组件(SDL2 音频播放)

[x] 音视频同步功能

[x] 错误处理和日志系统

[x] 集成测试和文档完善

测试

项目包含以下测试程序:

测试 Demuxer 组件

./test_demuxer

测试 Video Decoder 组件

./test_video_decoder

测试 Audio Decoder 组件

./test_audio_decoder

故障排除

编译错误

如果遇到 FFmpeg 库找不到的错误:

检查 FFmpeg 安装

which ffmpeg

pkg-config –modversion libavformat

如果需要,设置 PKG_CONFIG_PATH

export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH

SDL2 错误

如果遇到 SDL2 相关错误:

macOS

brew reinstall sdl2

Linux

sudo apt-get install –reinstall libsdl2-dev

播放问题

如果视频无法播放,检查视频文件是否损坏

如果只有视频没有音频,检查视频文件是否包含音频流

如果音视频不同步,可能是视频编码格式不常见,尝试其他视频文件

许可证

MIT License

作者

FFmpeg Player Development Team

image-1

image-2

image-3