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;
}
相关推荐
诸葛小猿8 小时前
windows部署spleeter 版本2.4.0:分离音频的人声和背景音乐
windows·音视频·音频·语音识别·spleeter
程序员Linc12 小时前
用OpenCV写个视频播放器可还行?(C++版)
c++·opencv·音视频·opencv 4.11
春末的南方城市12 小时前
阿里发布新开源视频生成模型Wan-Video,支持文生图和图生图,最低6G就能跑,ComFyUI可用!
人工智能·计算机视觉·自然语言处理·开源·aigc·音视频
伊织code16 小时前
SmolVLM2 - 将视频理解带到每个设备
音视频·视觉·视频理解·小模型·smolvlm·端侧
遇到困难睡大觉哈哈18 小时前
HarmonyOS 音频录制与播放模块
华为·音视频·harmonyos·鸿蒙
波波仔8619 小时前
视频录像机视频通道是指什么
音视频·视频录像机·选型指标
余~~1853816280019 小时前
【定制开发】碰一碰发视频系统定制开发,支持OEM
音视频
weixin_4862814520 小时前
webRTC实现一对一通话视频流程
音视频·webrtc
远方2.021 小时前
AI视频生成工具清单(附网址与免费说明)
人工智能·音视频
EasyCVR1 天前
EasyRTC嵌入式视频通话SDK的跨平台适配,构建web浏览器、Linux、ARM、安卓等终端的低延迟音视频通信
android·arm开发·网络协议·tcp/ip·音视频·webrtc