SDL2音视频播放的常用API库

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 结构的指针,定义了要更新的纹理区域。如果 rectNULL,则表示更新整个纹理。

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 结构的指针,定义了纹理在渲染目标上的目标位置和大小 。如果 dstrectNULL,则表示纹理将按原始大小显示在渲染目标的原点位置。

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;
}
相关推荐
_君莫笑3 小时前
【视频】将yuv420p的一帧数据写入文件
c++·音视频·yuv420p
易我数据恢复大师3 小时前
视频里面的音乐怎么提取出来?工具分享和教程示例
电脑·音视频·人声分离
零壹&硬件3 小时前
D类音频应用EMI管理
单片机·嵌入式硬件·硬件架构·音视频·硬件工程·智能硬件
PTTLINK6 小时前
远程作业专家指导调度系统
音视频
红米饭配南瓜汤6 小时前
WebRTC服务质量(10)- Pacer机制(02) RoundRobinPacketQueue
网络·音视频·webrtc·媒体
AI服务老曹8 小时前
报警推送消息升级的名厨亮灶开源了
人工智能·安全·开源·音视频
思为无线NiceRF11 小时前
新品:SA628F39大功率全双工音频传输模块
单片机·嵌入式硬件·音视频
科技小E13 小时前
NVR小程序接入平台EasyNVR视频监控技术如何助力餐饮行业实现明厨亮灶
安全·小程序·音视频·视频监控
MediaTea16 小时前
Ps:在 Photoshop 中编辑视频
ui·音视频·photoshop