我的音视频开发大部分内容是跟着雷霄骅大佬学习的,所以笔记也是跟雷老师的博客写的。
一、音视频相关的基础知识
首先播放一个视频文件的流程如下所示:
FFmpeg的作用就是将H.264格式的数据转换成YUV格式的数据,然后SDL将YUV显示到电脑屏幕上
SDL(Simple DirectMedia Layer)库的作用就是封装了复杂的视音频底层交互工作,简化了视音频处理的难度。
开发环境配置:如果是在Linux环境下开发,可以使用gcc编译器,并确保包含FFmpeg和SDL的头文件和库文件。在编译时,需要链接FFmpeg和SDL的库,例如使用-lavformat -lavcodec -lswscale -lavutil -lSDL2等编译选项。
二、开发相关的基础知识
1、引入FFmpeg和SDL
FFmpeg解码函数简介:
av_register_all():注册所有组件
avformat_open_input():打开输入视频文件
avformat_find_stream_info():获取视频文件信息
avcodec_find_decoder():查找解码器
av_read_frame():打开解码器
avcodec_decode_video2():从输入文件读取一帧压缩数据
avcodec_close():关闭解码器
avformat_close_input():关闭输入视频文件
FFmpeg解码的流程图如下所示:
SDL视频显示函数简介:
SDL_Init():初始化SDL系统
SDL_CreateWindow():创建窗口SDL_Window
SDL_CreateRenderer():创建渲染器SDL_Renderer
SDL_CreateTexture():创建纹理SDL_Texture
SDL_UpdateTexture():设置纹理的数据
SDL_RenderCopy():将纹理的数据拷贝给渲染器
SDL_RenderPresent():显示
SDL_Delay():工具函数,用于延时
SDL_Quit():退出SDL系统
SDL显示的流程如下所示:
2、初始化FFmpeg和SDL
初始化FFmpeg:使用av_register_all()函数(来注册所有的编解码器和格式。初始化其他FFmpeg组件,如解复用器、解码器等。
初始化SDL:使用SDL_Init()函数初始化SDL,传入相应的初始化标志,如SDL_INIT_VIDEO以初始化视频子系统。
3、打开音视频文件和初始化解码器
打开输入文件:使用avformat_open_input()函数打开音视频文件。
使用avformat_find_stream_info()函数查找音视频流的信息。
查找音视频流:获取音频流和视频流的索引,以便后续解码。
初始化解码器:使用avcodec_find_decoder()函数查找音频解码器和视频解码器。使用avcodec_open2()函数打开音频解码器和视频解码器。
4、创建SDL窗口和渲染器
创建窗口:使用SDL_CreateWindow()函数创建一个窗口,用于显示视频。
创建渲染器:使用SDL_CreateRenderer()函数在窗口中创建一个渲染器,用于绘制视频图像。
5、循环读取和解码音视频帧
循环读取帧:使用av_read_frame()函数循环读取音频帧和视频帧。
解码音频帧:使用音频解码器对音频帧进行解码。将解码后的音频数据传递给SDL的音频缓冲区,或者通过SDL的音频回调函数进行处理。
解码视频帧:使用视频解码器对视频帧进行解码。将解码后的图像数据转换为SDL可以处理的格式(如YUV转RGB)。使用SDL的渲染函数(如SDL_RenderCopy())将图像数据绘制到渲染器上。
6、更新和显示音视频
更新渲染目标:使用SDL_RenderPresent()函数更新渲染目标,将所有绘图操作呈现到屏幕上。
处理音频:SDL会自动处理音频的播放和缓冲区更新,如果使用了音频回调函数,则需要在回调函数中处理音频数据的解码和播放。
7、释放资源和退出
释放FFmpeg资源:关闭解码器、关闭输入文件等。
释放SDL资源:销毁渲染器、销毁窗口等。
退出SDL:使用SDL_Quit()函数退出SDL。
通过以上步骤,你可以将FFmpeg和SDL集成在一起,实现一个基本的音视频播放应用程序。当然,这只是一个简单的示例,实际应用中可能还需要处理更多的细节,如音视频同步、错误处理、资源管理等。