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环境搭建
-
下载SDL源码库,SDL2-2.0.10.tar.gz
-
解压,然后安装: ./configure && make && sudo make install
-
依赖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)
本文来自博客园,作者:flxx,转载请注明原文链接:https://www.cnblogs.com/faithlocus/p/16308460.html