首页 > 其他分享 >音视频八股文(5)--SDL音视频渲染实战。会使用就行,不需要深究。

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

时间:2023-04-25 23:10:09浏览次数:37  
标签:多线程 函数 -- 音频 音视频 事件 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视频显示的流程

音视频八股文(5)--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中,可以通过以上几个函数实现音频的播放功能。需要注意的是,除了设置好音频参数外,还需要填充音频缓冲区,并且确保采样率和声道数等参数的匹配。这样才能顺利地播放出音频数据。

标签:多线程,函数,--,音频,音视频,事件,SDL,纹理
From: https://blog.51cto.com/u_14891145/6225497

相关文章

  • Python计算 x 的整数 n 次幂函数
    Python实现pow(x,n),即计算x的整数n次幂函数(即,xn)。defmyPow(self,x:float,n:int)->float:ifx==0:return0res=1ifn<0:x,n=1/x,-nwhilen:ifn&1:res*=xx*=xn>>=1......
  • 微软财报预测:深度分析微软的投资价值
    在过去的十年里,微软(MSFT)一直统治着个人电脑操作系统市场。近年来,该公司又成功解锁了新的商业模式,即,通过其快速增长的办公生产力和云解决方案进一步推动了收入快速增长。根据prosperspark的数据,目前已经有95%的财富500强公司在使用微软Azure,有超过70%的财富500强公司拥有微软365正......
  • 美国销售税合规平台TaxCloud完成2000万美元融资
    猛兽财经获悉,总部位于加州诺沃克面向电子商务企业的销售税合规平台TaxCloud近期宣布完成2000万美元融资。本轮融资由CamberPartners领投。该公司打算利用这笔资金继续为其客户提供服务,同时扩大其产品供应、营销和销售。作为投资的一部分,TaxCloud宣布任命NateGilmore为首席执行......
  • 磁盘I/O性能监控的指标
    服务器硬盘是磁盘资源中最慢的组件,在企业数据中心,注意仔细设计存储子系统,不要让它成为主要性能瓶颈,而最理想的办法是使用SAN,即使预算不允许,也要想办法确保磁盘资源争用不会导致虚拟机(VM)瘫痪。首先应将宿主操作系统安装到专用硬盘上,注意不是专用卷,确保宿主操作系统不会与虚拟机抢夺......
  • 监控自建MySQL慢查询日志并上报到企业微信集群
    shell脚本如下#!/bin/bash#设置企业微信机器人webhook地址和机器人名称WEBHOOK_URL="你的WEBHOOK_URL"BOT_NAME="MySQLSlowLogBot"#设置慢日志文件路径和记录已发送行数的文件路径LOG_FILE="/data/mysql/mysql-slow-log.log"SENT_LINE_FILE="/tmp/mysql-slow-log.sent......
  • 【230425-2】在(x+2x^-2)^5的展开式中,x^2的系数是?
    ......
  • 【230425-3】在(x^0.5-2)^5的展开式中,x^2的系数是?
    ......
  • 基于Haar分类和五官验证的人脸识别
    访问【WRITE-BUG数字空间】_[内附完整源码和文档]AdaBoost算法是1995年提出的一种快速人脸检测算法,是人脸检测领域里程碑式的进步,这种算法根据弱学习的反馈,适应性地调整假设的错误率,使在效率不降低的情况下,检测正确率得到了很大的提高。摘要:人脸检测是人脸分析的首要环节,其处理......
  • “源擎”云原生分布式核心业务系统有什么产品优势?
     “源擎”核心系统利用云原生、分布式、微服务技术,基于企业架构设计思想,构建了基础服务、业务服务、交易中心以及系列支撑组件,包含业务架构和多个微服务应用。业务架构中,交易中心为银行提供了更灵活的选择,支持产品粒度的功能可替换,同时也能快速引入新的产品服务,支持未来业务发展,实......
  • JDBC访问数据库
    下载,安装MySQL(下载地址:https://www.mysql.com/downloads/)创建数据库——createdatabase<数据库名>创建用户——mysql>grantallprivilegeson数据库名.*to新用户名@locahost identifiedby‘密码’;使用DDL创建表——createtable表名(字段名数据类型是否主键/非空)使用DML操......