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-打开音频设备

打开音频设备

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

SDL_AudioSpec

typedef 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;

SDL_AudioCallback

// 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);

总之,在SDL中,可以通过以上几个函数实现音频的播放功能。需要注意的是,除了设置好音频参数外,还需要填充音频缓冲区,并且确保采样率和声道数等参数的匹配。这样才能顺利地播放出音频数据。

音视频八股文(5)--SDL音视频渲染实战。会使用就行,不需要深究。相关推荐

  1. Android音视频学习系列(六) — 掌握视频基础知识并使用OpenGL ES 2.0渲染YUV数据

    系列文章 Android音视频学习系列(一) - JNI从入门到精通 Android音视频学习系列(二) - 交叉编译动态库.静态库的入门 Android音视频学习系列(三) - Shell脚本入门 ...

  2. 关于音视频里面的 解码帧率 和 渲染帧率

    在知识星球里面有位 PM 同学,咨询关于音视频里面的解码帧率和渲染帧率,关于这两个概念其实挺绕的,不同的人可能还有不同的看法,所以也让大家一起来评估一下解读是否正确!! 以下是星球内的提问: 各位开发 ...

  3. java音视频开发技术_FFmpeg音视频核心技术精讲与实战

    百度网盘2 D2 h2 i; n# o0 D# M* C! [: B1 M 第1章 学习指南[课程提供200+问题与答案库]4 a# t% {  h6 ^: E# O [你遇到的坑,别人已经出坑了,课 ...

  4. 音视频基础概念(4)—音视频开发常用工具

    目录 1.VLC播放器简介 1.1 VLC 播放器 1.2 VLC的功能列表 1.3 VLC播放网络串流 1.4 VLC作为流媒体服务器 2. MediaInfo简介 2.1 MediaInfo 2. ...

  5. 音视频面试题:什么是秒开视频? 如何去秒开视频?

    给大家带来一些音视频的面试题,或者说是一些开发思路吧,不希望它成为以后你面试的八股文... 这次主要是视频秒开方面.秒开是指用户点击播放到看到画面的时间非常短,在 1 秒之内. 为什么需要秒开? 目前 ...

  6. 音视频开发进阶指南--音视频概念基础

    音视频开发进阶指南--音视频概念基础 音频概念基础: 采样.量化和编码: 首先要对模拟信号进行采样,所谓采样就是在时间轴上对信号进行数字化.根据奈奎斯特定理(也称为采样定理),按比声音最高频率高2倍以 ...

  7. wallpaper怎么导入视频_抖音上爆火的手绘视频怎么做?这篇文章来教你!

    抖音上爆火的手绘视频,最近很多人都在问,确实这个领域的市场非常大,做好可带货量是非常大的,所以,今天就跟大家讲解一下! 下面正式讲解抖音手绘视频: 首先准备条件: 1.电脑一台 2.videoscri ...

  8. Android 音视频难学?音视频(流媒体)开发学习也有套路

    我们都知道音视频流媒体开发这块的知识比较纷繁复杂,对新手很不友好,自学难度大,想要们既需要比较扎实的C/C++基础,又需要有很多的工程/项目经验,今天就从音视频开发/开源框架/就业方向分析,为广大开发 ...

  9. 音视频开发系列1:音视频开发基本概念

    #视频文件的本质 #一张图 音视频技术=封装技术+视频压缩编码技术+音频压缩编码技术+流媒体协议技术 播放流程: 获取流–>解码–>播放 录制播放流程: 录制音频视频–>剪辑–> ...

  10. 音视频开发二:音视频知识总结

    文章目录 简介 简单理解,音视频原理 音视频理论基础 音频 声音介绍 **为什么要存在数字音频 ?** **什么是数字音频?** 从"模拟信号"到"数字化"的过 ...

最新文章

  1. 小猿圈解析vue数据双向绑定的缺点
  2. ASP.NET MVC下的异步Action的定义和执行原理
  3. [转]gtest使用
  4. 金融专业计算机大几可以不学,大学选专业,只要明白4个档次,3个原则,基本不会有太大的问题...
  5. python按照每行输出八个_Python/PyCharm的每行输出
  6. 简述python3默认使用的编码标准_Python3.X默认使用的编码是
  7. 认真学习系列:编译原理——B站笔记
  8. LINUX下载编译libfaac
  9. 图中PNP型三极管发射极和基极为什么要加个100K(R21)的电阻?
  10. Bootstrap-table 如何合并相同单元格
  11. 软件测试自学还是培训?
  12. 高中电子技术——万用表的表笔接法(指针式和数字式)
  13. Js出库入库数量变化
  14. 简单的一道 SQL 题,谈如何提高编程水平
  15. 2019CSP初赛基础知识整理
  16. 网络出口区流量清洗经典引流方案分享
  17. [小工具] 微信小程序代码压缩器
  18. 系统可用性衡量指标MTTR|MTTF|MTBF
  19. 网络多媒体素材加工【1】
  20. Hive小咖,是时候穿上你的振金战衣! 与职场高阶雷神之锤High-Five了!!!

热门文章

  1. 【IoT】加密与安全:CC254x 低功耗蓝牙 BLE 之 AES-128 加密算法
  2. django跨域访问
  3. Vivado公开课-01基础篇:Vivado一切超乎想象 笔记
  4. android让图片资源保持正圆不变形
  5. 基因数据压缩算法(ACTG) C++
  6. iphone不能网络连接到服务器未响应,iphone用usb上网没反应怎么办
  7. Linux 命令之软连接、硬连接详解
  8. flutter问题搜集
  9. 命令模式(command line)
  10. wpf 后台设置背景色16进制