Я использую 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
AvaudioEngine производит плохую мощность, когда образцы в основном имеют одинаковое значение ⇐ IOS
Программируем под IOS
1753047960
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
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79707585/avaudioengine-produces-bad-output-when-samples-are-mostly-the-same-value[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия