SDL2音视频播放的常用API库
SDL2官方API库链接:https://wiki.libsdl.org/SDL2/APIByCategory
本博客只针对SDL2关于音视频方向的一些API函数进行简单的归类;具体信息请查看官方文档
1 SDL_Init
官方API链接:https://wiki.libsdl.org/SDL2/SDL_Init(注意:**如果想查某个API的文档,只需要将SDL_Init进行替换即可**,以下API皆同理)
初始化SDL系统
c++
int SDL_Init(Uint32 flags);
//代码示例
SDL_Init(SDL_INIT_AUDIO | SDL_INIT_VIDEO | SDL_INIT_TIMER)
flags选项 | 子系统 |
---|---|
SDL_INIT_VIDEO | 视频子系统 |
SDL_INIT_EVENTS | 事件处理子系统 |
SDL_INIT_TIMER | 定时器子系统 |
SDL_INIT_AUDIO | 音频子系统 |
2 SDL_CreateWindow
创建窗口;对应的销毁:
void SDL_DestroyWindow(SDL_Window* window)
c++
SDL_Window* SDL_CreateWindow (const char* title,
int x, int y,
int w, int h,
Uint32 flags);
//示例 SDL_WINDOWPOS_UNDEFINED宏:说明窗口的位置由系统决定
//screen_w:pCodecCtx->width
SDL_CreateWindow("vPlayer_sdl",
SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
screen_w, screen_h,
SDL_WINDOW_OPENGL);
参数 | 说明 |
---|---|
title | 标题 |
x, y | 窗口起始坐标点 |
w, h | 宽和高 |
flag | 0,或者SDL_WindowFlags |
3 SDL_CreateRenderer
创建渲染器(渲染器 是 SDL 的一个核心组件,主要用于 2D 绘图,可以帮助在指定的窗口中绘制纹理、图形等内容)
c++
SDL_Renderer* SDL_CreateRenderer(SDL_Window* window,
int index, Uint32 flags);
//示例
p_sdl_renderer = SDL_CreateRenderer(p_sdl_param->p_sdl_window, -1, 0);
参数 | 说明 |
---|---|
window | 指定一个 SDL_Window ,表示将渲染器绑定到这个窗口上 |
index | 选择哪个渲染驱动器,-1指定第一个可用的驱动 |
flags | 0, or 渲染器选项组合 |
c++
//flags选项
typedef enum SDL_RendererFlags
{
SDL_RENDERER_SOFTWARE = 0x00000001, /**< 最基本软件渲染器 */
SDL_RENDERER_ACCELERATED = 0x00000002, /**< 硬件加速的渲染器 */
SDL_RENDERER_PRESENTVSYNC = 0x00000004, /**< 使用垂直同步(VSync)内容呈现与刷新率一致 */
SDL_RENDERER_TARGETTEXTURE = 0x00000008 /**< 支持渲染到纹理 */
} SDL_RendererFlags;
4 SDL_CreateTexture
创建纹理 (texture)。纹理是渲染中用于保存图像数据的一种对象,创建纹理后,可以将其渲染到窗口上。
c++
SDL_Texture* SDL_CreateTexture(SDL_Renderer* renderer, Uint32 format,
int access, int w, int h);
//示例
p_sdl_texture = SDL_CreateTexture(p_sdl_renderer, SDL_PIXELFORMAT_IYUV,
SDL_TEXTUREACCESS_STREAMING, screen_w, screen_h);
参数 | 说明 |
---|---|
renderer | 一个指向 SDL_Renderer 的指针,用于指定在哪个渲染器中使用纹理 |
format | 指定纹理的像素格式,如SDL_PIXELFORMAT_IYUV |
access | 定义纹理的访问方式,如SDL_TEXTUREACCESS_STREAMING :纹理数据可以频繁更新(适用于实时绘制或更新) |
w,h | 纹理的宽和高 |
5 SDL_CreateThread
SDL 中用于创建线程的函数。它允许你启动一个新的线程来执行任务,从而实现多线程编程。(音视频的处理、文件的读取)
注意:创建线程后,线程会立即开始执行指定的函数!S
c++
SDL_Thread* SDL_CreateThread(SDL_ThreadFunction fn, const char* name, void* data);
//示例
p_sdl_thread = SDL_CreateThread(sfp_refresh_thread, NULL, NULL);
**fn
**指向一个函数的指针,该函数将在线程中运行。函数的原型必须是:
c++
int ThreadFunction(void* data);
//该函数需要返回一个整数值,作为线程的退出代码。
**name
**为线程命名的字符串(可选),便于调试和跟踪。如果不需要特别命名,可以传入一个空字符串或 nullptr
。
**data
**一个指针,传递给线程函数 fn
,作为其参数。可以用它传递结构体、数据等需要在线程中使用的内容。
6 SDL_PushEvent
用于将用户定义的事件(或现有事件)推送到 SDL 的事件队列中。
c++
int SDL_PushEvent(SDL_Event* event);
//示例
//SDL_USEREVENT:用户自定义事件类型的起始值
#define SFM_REFRESH_EVENT (SDL_USEREVENT+1)
SDL_Event sdl_event;
sdl_event.type = SFM_REFRESH_EVENT;//SFM_REFRESH_EVENT:用户自定义的事件类型
SDL_PushEvent(&sdl_event);
7 SDL_Delay
让当前线程暂停一段时间**(控制帧率)**
c++
void SDL_Delay(Uint32 ms);
//示例(控制帧率)
g_frame_rate = pStream->avg_frame_rate.num / pStream->avg_frame_rate.den;
SDL_Delay(1000 / g_frame_rate);
8 SDL_WaitEvent
用于等待事件发生 。它会阻塞当前线程 ,直到有事件被推送到事件队列中,并将事件返回给调用者。
c++
int SDL_WaitEvent(SDL_Event* event);
//示例
SDL_Event sdl_event;
SDL_WaitEvent(&sdl_event);
if (sdl_event.type == SFM_REFRESH_EVENT){
//处理事件逻辑(更新视频帧)
}
9 SDL_UpdateTexture
用于更新纹理的内容 。它允许你将一块内存中的图像数据复制到已经创建的纹理中,从而更新纹理的显示内容。
c++
int SDL_UpdateTexture(SDL_Texture* texture, const SDL_Rect* rect,
const void* pixels, int pitch);
//示例
sws_scale(p_ffmpeg_param->pSwsCtx, (const unsigned char* const*)pFrame->data,
pFrame->linesize, 0, p_ffmpeg_param->pCodecCtx->height, pFrameYUV->data,
pFrameYUV->linesize);
SDL_UpdateTexture(p_sdl_param->p_sdl_texture, &(p_sdl_param->sdl_rect),
pFrameYUV->data[0], pFrameYUV->linesize[0]);
texture
:指向目标纹理的指针。该纹理已经通过 SDL_CreateTexture
创建。
rect
:指向一个 SDL_Rect
结构的指针,定义了要更新的纹理区域。如果 rect
为 NULL
,则表示更新整个纹理。
pixels
:指向一个内存缓冲区,包含要更新的像素数据。这个数据通常是一个指向图像的像素数组。
pitch
:每一行像素的字节数 (也就是图像的"步长")。(pFrameYUV->linesize[0]
)
10 SDL_RenderClear
清空渲染器的当前渲染目标;通常在每一帧开始时调用,以清除上一次渲染的内容,并为新的一帧绘制做准备。
c++
void SDL_RenderClear(SDL_Renderer* renderer);
//示例
SDL_RenderClear(p_sdl_param->p_sdl_renderer);
11 SDL_RenderCopy
将纹理绘制到渲染器上 。用于将已加载的图像或纹理绘制到窗口 或其他渲染目标上。常用于渲染图像、动画帧等纹理内容。
c++
int SDL_RenderCopy(SDL_Renderer* renderer, SDL_Texture* texture,
const SDL_Rect* srcrect, const SDL_Rect* dstrect);
//示例
SDL_RenderCopy(p_sdl_param->p_sdl_renderer, p_sdl_param->p_sdl_texture,
NULL, &(p_sdl_param->sdl_rect));
renderer
:指向渲染器对象的指针,表示你希望将纹理绘制到哪个渲染目标(如窗口、纹理等)。texture
:指向要绘制的纹理 的指针。该纹理是通过SDL_CreateTexture
创建的,包含了要显示的图像内容。srcrect
:指向一个SDL_Rect
结构的指针,定义了源纹理区域的位置和大小 。这个参数可以是NULL
,表示绘制整个纹理。dstrect
:指向一个SDL_Rect
结构的指针,定义了纹理在渲染目标上的目标位置和大小 。如果dstrect
为NULL
,则表示纹理将按原始大小显示在渲染目标的原点位置。
12 SDL_RenderPresent
更新渲染窗口 。主要作用是将当前渲染器的内容显示到窗口上,这个函数是在渲染循环的最后调用,以将图像显示出来。
c++
void SDL_RenderPresent(SDL_Renderer* renderer);
//示例
SDL_RenderPresent(p_sdl_param->p_sdl_renderer);
renderer
:指向一个已创建的 SDL_Renderer
对象的指针,表示要更新内容的渲染器。这个渲染器通常与一个窗口相关联,用于将图像或图形绘制到屏幕上。
销毁API
c++
///释放库函数内存
int release_sdl2(SDL_Param_T* p_sdl_param)
{
//纹理
SDL_DestroyTexture(p_sdl_param->p_sdl_texture);
//渲染器
SDL_DestroyRenderer(p_sdl_param->p_sdl_renderer);
//窗口
SDL_DestroyWindow(p_sdl_param->p_sdl_window);
//退出 SDL 子系统并释放所有资源,程序结束时必须调用
SDL_Quit();
return 0;
}