Напишите Int16 в AVAudioPCMBuffer swift

У меня есть объект данных в Swift, который представляет собой массив объектов Int16. По какой-то причине использование ".pcmFormatInt16" не сработало для формата моего AVAudioPCMBuffer и не дало ни звука, ни ошибки памяти. В конце концов мне удалось получить белый / статический шум для воспроизведения через динамики, преобразовав Int16 в плавающее число и поместив его на оба канала моего AVAudioPCMBuffer. У меня такое ощущение, что я приближаюсь к ответу, потому что всякий раз, когда я говорю в микрофон, я слышу другую частоту статического электричества. Я думаю, проблема в том, что я не конвертирую конвертированный Int16 в буфер 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
  })

1 ответ

Типичный многоканальный буфер PCM имеет чередование каналов для каждой выборки, хотя, будучи не знакомым с быстрым звуком, я нахожу освежающим видеть здесь каналы, имеющие измерение в структуре данных буфера

... флаг поднимается, когда я вижу, что ваши охранные проверки фиксируют значение val > 1, установленное на val = 1 и т. д.... в другом месте, которое не требуется, поскольку эти проверки границ не соответствуют действительности, поскольку данные хорошо ложатся на свои места как есть

... я думаю, что ваш входной аудио [] подписан int 16 из-за ваших val > 1 и val <-1? если 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

Мы можем продолжить, как только вы сообщите нам ответы на эти основные вопросы.

Другие вопросы по тегам