1. 项目概述
这个基于FFmpeg和SDL3的视频播放器项目,是我在学习多媒体开发过程中的一个实践案例。它源自雷霄骅老师经典的100行代码播放器示例,但针对现代FFmpeg(4.0+)和SDL3进行了全面适配和优化。整个项目虽然只有200多行代码,却完整实现了视频文件的解码和播放流程,是理解音视频处理的绝佳入门案例。
提示:在实际开发中,建议使用CMake或Meson等构建工具管理项目,而不是直接使用gcc命令行编译。这样可以更好地处理FFmpeg和SDL3的依赖关系。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与编译
2.1 依赖库安装
在开始之前,需要确保系统已安装以下开发库:
- FFmpeg 4.0+ (包含libavcodec, libavformat, libswscale, libavutil)
- SDL3开发库
Ubuntu/Debian系统安装命令:
bash复制sudo apt install libavcodec-dev libavformat-dev libswscale-dev libavutil-dev libsdl3-dev
2.2 编译命令
使用gcc编译时,需要链接相关库:
bash复制g++ SimpleFFmpegPlayer.cpp -o player \
$(pkg-config --cflags --libs libavcodec libavformat libswscale libavutil) \
$(pkg-config --cflags --libs sdl3) \
-std=c++11
2.3 项目结构
项目仅包含一个主源文件,但为了更好的工程实践,建议按以下结构组织:
code复制SimpleFFmpegPlayer/
├── include/ # 头文件
├── src/ # 源文件
│ └── main.cpp # 主程序
├── CMakeLists.txt # 构建配置
└── assets/ # 测试视频
3. 核心代码解析
3.1 初始化流程
播放器的初始化分为三个关键阶段:
- FFmpeg初始化:
cpp复制avformat_network_init(); // 初始化网络模块(用于在线视频)
AVFormatContext* pFormatCtx = nullptr;
avformat_open_input(&pFormatCtx, filename, nullptr, nullptr);
avformat_find_stream_info(pFormatCtx, nullptr);
- 解码器初始化:
cpp复制AVCodecParameters* codecpar = pFormatCtx->streams[videoindex]->codecpar;
const AVCodec* pCodec = avcodec_find_decoder(codecpar->codec_id);
AVCodecContext* pCodecCtx = avcodec_alloc_context3(pCodec);
avcodec_parameters_to_context(pCodecCtx, codecpar);
avcodec_open2(pCodecCtx, pCodec, nullptr);
- SDL初始化:
cpp复制SDL_Init(SDL_INIT_VIDEO);
SDL_Window* window = SDL_CreateWindow("Player", width, height, 0);
SDL_Renderer* renderer = SDL_CreateRenderer(window);
SDL_Texture* texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_IYUV,
SDL_TEXTUREACCESS_STREAMING, width, height);
3.2 解码与显示循环
主循环处理流程如下:
- 读取视频包
- 发送到解码器
- 接收解码后的帧
- 转换为YUV420P格式
- 更新SDL纹理并显示
cpp复制while (running) {
av_read_frame(pFormatCtx, packet); // 读取数据包
