AvaudioEngine производит плохой выход, когда образцы в основном имеют одинаковое значение [закрыто]IOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 AvaudioEngine производит плохой выход, когда образцы в основном имеют одинаковое значение [закрыто]

Сообщение Anonymous »

Я использую AvaudioEngine для обработки в режиме реального времени. Некоторые образцы постоянно генерируются моим приложением. Это создаст очень частые звуки, которые не исчезают, даже в безмолвные моменты. Если они все идентичны, что помогает в безмолвные моменты, но всплывающие всплески начинаются после возобновления музыки. < /p>
Вот легко воспроизводимый пример. Если вы запустите это, вы заметите, что этот длинный поток -1,0 образцов будет производить частые всплывающие положения, чего не должно произойти. Это следует интерпретировать как молчание. < /P>
class AudioManager {
private let audioEngine = AVAudioEngine()
private let audioNode = AVAudioPlayerNode()
private let audioFormat = AVAudioFormat(standardFormatWithSampleRate: 44100, channels: 2)
private var buffer: [Float] = []

func startAudio() {
do {
try AVAudioSession.sharedInstance().setPreferredIOBufferDuration(0.005)
try AVAudioSession.sharedInstance().setCategory(.playAndRecord, options: [.allowAirPlay, .mixWithOthers])
try AVAudioSession.sharedInstance().setActive(true)
try AVAudioSession.sharedInstance().setAllowHapticsAndSystemSoundsDuringRecording(true)

try AVAudioSession.sharedInstance().overrideOutputAudioPort(.speaker)

self.audioEngine.attach(self.audioNode)
self.audioEngine.connect(self.audioNode, to: self.audioEngine.outputNode, format: self.audioFormat)

try self.audioEngine.start()

self.audioNode.play()

DispatchQueue.global().async {
self.playAudio()
}
} catch {
print(error)
}
}

// call this function frequently to update the samples, 60hz is fine
func updateBuffer() {
if audioNode.isPlaying {
let samples = [Float](repeating: -1.0, count: 1024)
nslock.lock()
buffer.append(contentsOf: samples)
nslock.unlock()
}
}

private func playAudio() {
if let outputBuffer = AVAudioPCMBuffer(pcmFormat: self.audioFormat!, frameCapacity: AVAudioFrameCount(8192 * 2)) {
// we just need one inputBuffer
if let floatBuffer = outputBuffer.floatChannelData {
var isEven = true

var leftIndex = 0
var rightIndex = 0

nslock.lock()
while buffer.count > 0 {
let sample = buffer.removeFirst()
if isEven {
floatBuffer[0][leftIndex] = sample
leftIndex += 1
} else {
floatBuffer[1][rightIndex] = sample
rightIndex += 1
}
isEven = !isEven
}
nslock.unlock()

let frameLength = AVAudioFrameCount(8192)
outputBuffer.frameLength = frameLength
}

self.audioNode.scheduleBuffer(outputBuffer) { [weak self, weak node = self.audioNode] in
if node?.isPlaying == true {
if let self = self {
DispatchQueue.global().async {
self.playAudio()
}
}
}
}
}
}
}

let audioManager = AudioManager()
audioManager.startAudio()

// this is so the "while true" loop doesn't lock up the app,
// but you are still able to constantly send samples to the buffer.
DispatchQueue.global.async {
while true {
DispatchQueue.main.sync {
audioManager.updateBuffer()
// Optional: add sleep here
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/797 ... same-value
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «IOS»