繁体   English   中英

将Int16写入AVAudioPCMBuffer swift

[英]Write Int16 Into AVAudioPCMBuffer swift

我有一个Data对象,它是一个Int16对象数组。 由于某些原因,使用“ .pcmFormatInt16”不能用于我的AVAudioPCMBuffer的格式,并且没有声音或内存错误。 最终,通过将Int16转换为浮点并将其放置到我的AVAudioPCMBuffer的两个通道上,我能够从扬声器中获得白噪声/静态噪声。 我感觉自己正在接近答案,因为每当我对着麦克风讲话时,我都会听到不同频率的静电。 我认为问题是我没有将转换后的Int16转换为float floatChannelData缓冲区。

这是我的代码:

 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
  })

典型的多通道PCM缓冲区具有基于每个样本的交织通道,尽管我不熟悉快速音频,但在这里看到给定通道的缓冲区数据结构尺寸后,我感到耳目一新

...当我看到您的守卫检查钳位val> 1设置为val = 1等等时,一个标志会上升。...其他地方不需要,因为这些边界检查没有意义,因为数据很好地就位了

...我猜你是因为val> 1和val <-1,所以输入音频[]的符号为int 16? 如果为true,则除以max int float是错误的,因为您将失去一半的动态范围...

我建议你仔细看一下

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

让我们检查一下音频的整数范围[]

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

2 ^ 15 == 32768 //如果已签名,则值的范围为-32768至(2 ^ 15-1),即-32768至32767

请告诉您输入缓冲区audio []是否已签名...有时有助于识别输入数据的max_seen和min_seen值...执行此操作,然后告诉我们输入音频的max和min值[]

现在,让我们关注您所需的输出缓冲区self.buffer.floatChannelData ...,因为您说的是16位浮点数...这里的有效范围是多少? -1 <有效值<1?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM