首页 > 其他分享 >SDL_AudioSpec 解析以及使用说明

SDL_AudioSpec 解析以及使用说明

时间:2023-04-07 15:32:46浏览次数:42  
标签:AudioSpec format channels samples SDL 解析 spec size

前言

SDL_AudioSpec是包含音频输出格式的结构体,同时它也包含当音频设备需要更多数据时调用的回调函数。

解析

头文件说明

typedef struct SDL_AudioSpec
{
    int freq;                   /**< DSP frequency -- samples per second */
    SDL_AudioFormat format;     /**< Audio data format */
    Uint8 channels;             /**< Number of channels: 1 mono, 2 stereo */
    Uint8 silence;              /**< Audio buffer silence value (calculated) */
    Uint16 samples;             /**< Audio buffer size in sample FRAMES (total samples divided by channel count) */
    Uint16 padding;             /**< Necessary for some compile environments */
    Uint32 size;                /**< Audio buffer size in bytes (calculated) */
    SDL_AudioCallback callback; /**< Callback that feeds the audio device (NULL to use SDL_QueueAudio()). */
    void *userdata;             /**< Userdata passed to callback (ignored for NULL callbacks). */
} SDL_AudioSpec;

freq采样率

指定了每秒向音频设备发送的sample数。常用的值为:11025,22050,44100。值越高质量越好。


format音频数据格式

format 告诉SDL我们将要给的格式。在“S16SYS”中的S表示有符号的signed,16表示每个样本是16位长的,SYS表示大小头的顺序是与使用的系统相同的。这些格式是由avcodec_decode_audio2为我们给出来的输入音频的格式。


channels声音的通道数

1 单声道, 2 立体声;


silence 表示静音的值

因为声音采样是有符号的,所以0当然就是这个值


size 音频缓存区大小(字节数)

当我们想要更多声音的时候,我们想让SDL给出来的声音缓冲区的尺寸。一个比较合适的值在512到8192之间;ffplay使用1024


samples音频缓冲区中的采样个数(详细说明)

这个决定了回调len的长度,len=samples*chn*位宽(单位是字节)


摘自WIKI

samples specifies a unit of audio data. When used with SDL_OpenAudioDevice() this refers to the size of the audio buffer in sample frames. A sample frame is a chunk of audio data of the size specified in format multiplied by the number of channels. When the SDL_AudioSpec is used with SDL_LoadWAV() samples is set to 4096. This field's value must be a power of two.

理解

实际上该值是每次读取的采样数量,多久产生一次回调

例如

// 音频参数设置SDL_AudioSpec
    spec.freq = 44100;          // 采样频率
    spec.format = AUDIO_S16SYS; // 采样点格式
    spec.channels = 2;          // 2通道
    spec.silence = 0;
    spec.samples = 1024;       // 23.2ms -> 46.4ms 每次读取的采样数量,多久产生一次回调
    spec.callback = fill_audio_pcm; // 回调函数
    spec.userdata = NULL;

疑问

audio buffer size in samples (power of 2); 详情参考“讨论”

析疑


实际上针对AAC,M4a采样个数设置为1024,针对MP2,MP3,WMA采样个数设置为1152,不一定是2的幂指数次方,该值最好由AVFrame->nb_samples参数赋值


例子

wanted_spec.freq = aCodecCtx->sample_rate;

wanted_spec.format = AUDIO_S16SYS;

wanted_spec.channels = aCodecCtx->channels;

wanted_spec.silence = 0;

wanted_spec.samples = AVFrame->nb_samples;

wanted_spec.callback = audio_callback;

wanted_spec.userdata = aCodecCtx;




标签:AudioSpec,format,channels,samples,SDL,解析,spec,size
From: https://blog.51cto.com/fengyuzaitu/6176340

相关文章

  • Go-json源码解析
    代码例子如下:typeStudentstruct{Namestring`json:"name"`Ageint`json:"age"`}funcmain(){stu:=Student{Name:"张三",Age:21,}buf:=bytes.NewBuffer(make([]byte,0))//新建一个缓冲区......
  • Flash加密解密(三)——特殊混淆让asv2010解析代码失败
    1.Flash加密解密(一)——doswf混淆还原2.Flash加密解密(二)——Doswf生成代码分析3.Flash加密解密(三)——特殊混淆让asv2010解析代码失败从前面两节的分析可以看出,脆弱的swf文件极其容易被一些现成的工具反编译回可执行源代码。一旦可以进行动态调试,那么这个文件将被他人掌控,即使你使用......
  • Spring 源码解析 --Bean 的初始化流程
    --Spring原理架构图   --容器刷新  ---Bean初始化  --Bean生命周期流程 ......
  • Spring 源码阅读之标签解析
    全局目录.md引子1、容器最基本使用.md系列1-bean标签解析:2、XmlBeanFactory的类图介绍.md3、XmlBeanFactory对xml文件读取.md4、xml配置文件解析之【默认】命名空间【标签】的解析.md5、xml配置文件解析之【自定义】命名空间【标签】的解析.md系列2-bean获取:get......
  • 网络解析(一):LeNet-5详解
    一、前言LeNet-5出自论文Gradient-BasedLearningAppliedtoDocumentRecognition,是一种用于手写体字符识别的非常高效的卷积神经网络。本文将从卷积神经网络结构的基础说起,详细地讲解每个网络层。论文下载:请到文章结尾处下载。我为大家准备了超详细的学习资料,算法工程师的......
  • 2023年快消行业企业CRM数字化转型服务商调研与案例解析
    近年来,“数字化转型是公司最重要的战略方向之一”已成为消费品零售企业的共识。越来越多企业开始更主动、更广泛深入地利用数字化、智能化的手段来“修炼内功”,以降低外部环境的影响,并通过技术创新、模式创新、业态创新等技术手段,不断夯实核心业务竞争力,从而将挑战转化成机遇。 ......
  • GaussDB(DWS)云原生数仓技术解析
    摘要:本文主要介绍GaussDB(DWS)云原生数仓架构、产品能力,帮助开发者快速了解GaussDB(DWS)云原生数仓相关信息与能力。本文分享自华为云社区《直播回顾|GaussDB(DWS)云原生数仓技术解析》,作者:胡辣汤。在本期《GaussDB(DWS)云原生数仓技术解析》的主题直播中,我们邀请到华为云EID......
  • 实例解析
     HTML部分:我们可以使用任何的HTML元素来打开下拉菜单,如:<span>,或a<button>元素。使用容器元素(如:<div>)来创建下拉菜单的内容,并放在任何你想放的位置上。使用<div>元素来包裹这些元素,并使用CSS来设置下拉内容的样式。CSS部分:.dropdown 类使用 position:re......
  • 中断解析
    NVIC_SetPriority函数解析/***@briefSetthepriorityforaninterrupt**@paramIRQnThenumberoftheinterruptforsetpriority*@parampriorityTheprioritytoset**Setthepriorityforthespecifiedinterrupt.Theinterrupt*numbe......
  • ZooKeeper数据和集群特点,ZAB协议和选主过程解析
    前言本文讲述ZooKeeper集群架构特点、数据结构、事务ID、选主和ZAB协议具体执行过程。服务保证ZooKeeper非常快速且非常简单。由于它的目标是构建更复杂的服务(如同步)的基础,因此它提供了一组保证:【顺序一致性】来自客户端的更新将按发送顺序执行,因为只有唯一的主节点负责写......