SDL音视频渲染

SDL介绍

  • SDL(Simple DirectMedia Layer) 是一套开放源代码的跨平台多媒体开发库,使用C语言写成。

  • SDL提供数种控制图像,声音,输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux、Windows、Mac OS X等)的应用软件。

  • 目前SDL多用于开发游戏、模拟器、媒体播放器等多媒体应用领域。

SDL子系统(subsystem)

- SDL_INIT_TIMER::定时器
- SDL_INIT_AUDIO:音频
- SDL_INIT_VIDEO:视频
- SDL_INIT_JOYSTICK:遥感
- SDL_INIT_HAPTIC:触摸屏
- SDL_INIT_GAMECONROLLER:游戏控制器
- SDL_INIT_EVENT:事件
- SDL_INIT_EVERYTHING:包括上述所有选项

SDL数据结构

- SDL_Window:	代表一个窗口
- SDL_Renderer	代表一个渲染器
- SDL_Texture:	代表一个纹理
- SDL_Rect:	一个简单的矩形结构
  • 存储RGB和存储纹理的区别:
    比如一个从左到右由红色渐变到蓝色的矩形,用存储RGB的话就需要把矩形中每个点的具体颜色值存储下来;而纹理只是一些描述信息,比如记录了矩形的大小、起始颜色、终止颜色等信息,显卡可以通过这些信息推算出矩形块的详细信息。所以相对于存储RGB而已,存储纹理占用的内存要少的多。

视频显示函数

- SDL_Init:初始化SDL系统
- SDL_CreateWindow:创建窗口SDL_Window <===> SDL_DestroyWindow
- SDL_CreateRenderer:创建渲染器SDL_Renderer <===> SDL_DestroyRenderer
- SDL_CreateTexture:创建纹理SDL_Texture <===> SDL_DestroyTexture
- SDL_UpdateTexture:设置纹理的数据
- SDL_RenderCopy:将纹理的数据拷贝给渲染器
- SDL_RenderPresent:显示
- SDL__Delay:工具函数,用于延时
- SDL_Quit:退出SDL系统

SDL环境搭建

  1. 下载SDL源码库,SDL2-2.0.10.tar.gz

  2. 解压,然后安装: ./configure && make && sudo make install

  3. 依赖libx-dev, xorg-dev

SDL事件处理

SDL函数

- SDL_WaitEvent():等待一个事件
- SDL_PushEvent():发送一个事件
- SDL_PumpEvents():将硬件设备产生的事件放入事件队列,用于读取事件,在调用该函数之前,必须调用SDL_PumpEvents搜集键盘等事件
- SDL_PeepEvents():从事件队列提取一个事件

事件相关数据结构

- SDL_Event:代表一个事件

SDL线程处理

- SDL线程创建:SDL_CreateThread
- SDL线程等待:SDL_WaitThread
- SDL互斥锁:SDL_CreateMutex/SDL_DestoryMutex
- SDL条件变量(信号量):SDL_CreateCond/SDL_DestoryCond
- SDL条件变量(信号量)等待/通知:SDL_CondWait/SDL_CondSignal

YUV视频播放

PCM音频播放

打开音频设备

// desired:期望的参数
// obtained:实际音频设备的参数,一般情况下设置为NULL即可
int SDLCALL SDL_OpenAudio(SDL_AUdioSpec* desired, SDL_AUdioSpec* obtained);

typdef struct SDL_AudioSpec{
	int freq; // 音频采样频率
	SDL_AudioFormat format; // 音频数据格式
	uint8 channels; // 声道数,1:单声道,2:爽声道
	uint8 silence;  // 设置静音的值,因为声音采样是有符号的,所以0当然就是这个值
	uint16 samples; // 音频缓冲区中的采样个数,要求必须是2的n次
	uint16 padding; // 考虑到兼容性的一个参数
	uint32 size;    // 音频缓冲区的大小,以字节为单位
	SDL_AudioCallBack callback; // 填充音频缓冲区的回调函数
	void* userdata; // 用户自定义的数据
} SDL_AudioSpec;

// userdata: SDL_AudioSpec结构中的用户自定义数据,一般情况下可以不用
// stream: 该指针指向需要填充的音频缓冲区
// len: 音频缓冲区的大小(以字节为单位)1024 * 2 * 2
void (SDLCALL* SDL_AudioCallBack)(void* userdata, uint8* stream, int len);

播放音频数据

// 当pause_on设置为0时即开始播放音频,设置为1的时候,将会播放静音的值
void SDLCALL SDL_PauseAudio(int pause_on)
posted @ 2022-05-25 10:41  flxx  阅读(9)  评论(0编辑  收藏  举报