来源: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