首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Int16写入AVAudioPCMBuffer swift

将Int16写入AVAudioPCMBuffer swift
EN

Stack Overflow用户
提问于 2017-07-06 07:33:37
回答 1查看 1.4K关注 0票数 0

我在swift中有一个数据对象,它是一个Int16对象数组。由于某些原因,使用".pcmFormatInt16“不适用于我的AVAudioPCMBuffer格式,并且没有声音,或者是内存错误。最终,通过将Int16转换为浮点数并将其放到我的AVAudioPCMBuffer的两个通道上,我能够从扬声器中播放白噪声/静电。我感觉我离答案越来越近了,因为每当我对着麦克风讲话时,我都会听到一种不同频率的静电。我认为问题在于我没有将转换后的Int16转换为buffer floatChannelData。

下面是我的代码:

代码语言:javascript
复制
 for ch in 0..<2 {
  for i in 0..<audio.count {

       var val = Float( Int16(audio[i]) ) / Float(Int16.max)

       if( val > 1 ){
          val = 1;
       }
       if( val < -1 ){
          val = -1;
       }


       self.buffer.floatChannelData![ch][i+self.bufferCount] = val
       self.bufferCount+=1
     }
  }
  self.audioFilePlayer.scheduleBuffer(self.buffer, at:nil, options: .interruptsAtLoop, completionHandler: {
                print("played sum")
                 self.bufferCount=0
  })
EN

回答 1

Stack Overflow用户

发布于 2017-07-06 11:57:33

典型的多声道PCM缓冲器在每个采样的基础上具有信道交错,尽管我不熟悉快速音频,但我发现在这里看到在缓冲器数据结构上给定维度的信道是令人耳目一新的

..。当我看到你的守卫检查是否夹持val >1,设置为val =1时,旗帜就会升起。在其他地方,这是不需要的,因为这些边界检查是没有意义的,因为数据按原样很好地落到了适当的位置

..。我的猜测是,由于val >1和val < -1,您的输入audio[]是带符号的int16?如果为真,那么除以最大整型浮点数是错误的,因为你将失去一半的动态范围…

我建议你仔细看看你的

代码语言:javascript
复制
var val = Float( Int16(audio[i]) ) / Float(Int16.max)

让我们在audio[]中检查int的范围

2^16 == 65536 //如果无符号,则值的范围从0到(2^16 - 1),即0到65535

2^15 == 32768 //如果有符号,则值的范围从-32768到(2^15 - 1),即-32768到32767

请告诉我输入缓冲区audio[]是否签名...有时识别输入数据的max_seen和min_seen值很有帮助……执行此操作并告诉我们输入audio[]的最大值和最小值

现在让我们来关注一下你想要的输出缓冲区self.buffer.floatChannelData ...既然你说的是16位浮点数...这里的有效范围是多少?-1 < valid_value <1?

一旦你告诉我们这些基本问题的答案,我们就可以继续

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44937554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档