音视频八股文(5)--SDL 音视频渲染实战。会使用就行,不需要深究。
01-SDL 子系统
SDL 将功能分成下列数个子系统(subsystem):
◼ SDL_INIT_TIMER:定时器
◼ SDL_INIT_AUDIO:音频
◼ SDL_INIT_VIDEO:视频
◼ SDL_INIT_JOYSTICK:摇杆
◼ SDL_INIT_HAPTIC:触摸屏
◼ SDL_INIT_GAMECONTROLLER:游戏控制器
◼ SDL_INIT_EVENTS:事件
◼ SDL_INIT_EVERYTHING:包含上述所有选项
02-SDL Window 显示:SDL 视频显示函数简介
◼ SDL_Init():初始化 SDL 系统
◼ SDL_CreateWindow():创建窗口 SDL_Window
◼ SDL_CreateRenderer():创建渲染器 SDL_Renderer
◼ SDL_CreateTexture():创建纹理 SDL_Texture
◼ SDL_UpdateTexture():设置纹理的数据
◼ SDL_RenderCopy():将纹理的数据拷贝给渲染器
◼ SDL_RenderPresent():显示
◼ SDL_Delay():工具函数,用于延时
◼ SDL_Quit():退出 SDL 系统
◼ SDL_Window 代表了一个“窗口”
◼ SDL_Renderer 代表了一个“渲染器”
◼ SDL_Texture 代表了一个“纹理”
◼ SDL_Rect 一个简单的矩形结构
在 SDL 中,窗口、渲染器和纹理是三个重要的概念:
◼ SDL_Window 代表了一个“窗口”,即我们所看到的窗口界面。可以通过调用 SDL_CreateWindow() 函数来创建窗口。
◼ SDL_Renderer 代表了一个“渲染器”,用于把纹理渲染到窗口上。可以通过调用 SDL_CreateRenderer() 函数来创建渲染器。
◼ SDL_Texture 代表了一个“纹理”,即需要渲染的图像数据。可以通过调用 SDL_CreateTexture() 函数来创建纹理,并使用 SDL_UpdateTexture() 函数设置纹理的数据。
此外,SDL 还提供了一个简单的矩形结构 SDL_Rect,用于描述矩形的位置和大小。
在窗口显示时,需要先创建窗口和渲染器,然后创建纹理并将其渲染到渲染器上,最后通过调用 SDL_RenderPresent() 显示出来。同时,可以使用 SDL_Delay() 函数来延时,让窗口停留一段时间后再退出程序。
存储 RGB 和存储纹理的区别:比如一个从左到右由红色渐变到蓝色的矩形,用存储 RGB 的话就需要把矩形中每个点的具体颜色值存储下来;而纹理只是一些描述信息,比如记录了矩形的大小、起始颜色、终止颜色等信息,显卡可以通过这些信息推算出矩形块的详细信息。所以相对于存储 RGB 而已,存储纹理占用的内存要少的多。
03-SDL 事件
在 SDL 中,事件是指与用户输入、系统操作等相关的行为。可以通过以下函数来处理事件:
◼ 函数• SDL_WaitEvent():等待一个事件。该函数会一直等待,直到有事件发生才会返回。• SDL_PushEvent():发送一个事件。可以使用该函数自定义事件,并把它加入到事件队列中。• SDL_PumpEvents():将硬件设备产生的事件放入事件队列,用于读取事件,在调用该函数之前,必须调用 SDL_PumpEvents 搜集键盘等事件。• SDL_PeepEvents():从事件队列提取一个事件。从事件队列提取一个或多个事件。它可以指定要提取的事件类型,并且可以选择是否要移除事件。
◼ 数据结构• SDL_Event:代表一个事件。事件包括键盘事件、鼠标事件、窗口事件、定时器事件等等。在处理事件时,可以使用 SDL_Event 结构体中的 type 字段来区分不同类型的事件。
在实际应用中,一般会在主循环中处理事件。主循环会一直运行,直到程序退出。每次循环都会调用 SDL_PollEvent() 函数来检查是否有事件发生。如果有事件发生,就根据事件类型执行对应的操作。当没有事件发生时,可以进行渲染等其他操作。
总之,事件是 SDL 中一个非常重要的概念,处理事件可以使程序更加灵活和响应用户。对于各种不同的事件类型,可以通过 SDL 提供的函数和数据结构来进行处理。
04-SDL 线程
在 SDL 中,可以通过以下函数来实现多线程的功能:
◼ SDL 线程创建:SDL_CreateThread
◼ SDL 线程等待:SDL_WaitThead
◼ SDL 互斥锁:SDL_CreateMutex/SDL_DestroyMutex
◼ SDL 锁定互斥:SDL_LockMutex/SDL_UnlockMutex
◼ SDL 条件变量(信号量):SDL_CreateCond/SDL_DestoryCond
◼ SDL 条件变量(信号量)等待/通知:SDL_CondWait/SDL_CondSingal
使用这些函数,可以在 SDL 中实现多线程编程。由于 SDL 是跨平台的,因此它提供的多线程接口也能够在不同的操作系统上运行。例如,在 Windows 和 Linux 下都可以使用这些函数来实现多线程。
多线程可以用于实现一些比较耗时的操作,如图像处理、网络通信等等。常见的做法是把这些操作放到一个新的线程中执行,以免阻塞主线程。同时,需要注意线程间的同步,避免出现数据竞争等问题。在 SDL 中,可以通过互斥锁和条件变量(信号量)来实现线程间的同步。
总之,SDL 提供了丰富的多线程接口,可以让开发者更加方便地进行多线程编程,以提高程序的性能和响应速度。同时,在使用多线程时需要注意同步问题,以避免出现线程安全问题。
05-SDL YUV 显示:SDL 视频显示的流程
06-SDL 播放音频 PCM-打开音频设备
打开音频设备
SDL_AudioSpec
SDL_AudioCallback
播放音频数据
总之,在 SDL 中,可以通过以上几个函数实现音频的播放功能。需要注意的是,除了设置好音频参数外,还需要填充音频缓冲区,并且确保采样率和声道数等参数的匹配。这样才能顺利地播放出音频数据。
版权声明: 本文为 InfoQ 作者【福大大架构师每日一题】的原创文章。
原文链接:【http://xie.infoq.cn/article/bfe5659c1651a17c5d7f11062】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论