При использовании avaudioplayernode, чтобы запланировать короткий буфер, чтобы немедленно воспроизвести на сенсорном событии («Touch Up Inside»), я заметил слышимые глюки / артефакты при воспроизведении во время тестирования. Аудио вообще не сжимает в симуляторе iOS, однако есть слышимые искажения при воспроизведении, когда я запускаю приложение на фактическом устройстве iOS. Аудиционное искажение происходит случайным образом (запускаемый звук иногда звучит великолепно, в то время как в других случаях оно звучит искаженно) < /p>
Я пытался использовать различные аудиофайлы, форматы файлов и подготовить буфер для воспроизведения, используя метод PreparewithFrameCount, но, к сожалению, результат всегда один и я застрял, что могло бы пойти не так. вплоть до глобалов для ясности и простоты. Любая помощь или понимание будут высоко оценены. Это моя первая попытка разработать приложение iOS и мой первый вопрос, опубликованный в переполнении стека. < /P>
let filePath = NSBundle.mainBundle().pathForResource("BD_withSilence", ofType: "caf")!
let fileURL: NSURL = NSURL(fileURLWithPath: filePath)!
var error: NSError?
let file = AVAudioFile(forReading: fileURL, error: &error)
let fileFormat = file.processingFormat
let frameCount = UInt32(file.length)
let buffer = AVAudioPCMBuffer(PCMFormat: fileFormat, frameCapacity: frameCount)
let audioEngine = AVAudioEngine()
let playerNode = AVAudioPlayerNode()
func startEngine() {
var error: NSError?
file.readIntoBuffer(buffer, error: &error)
audioEngine.attachNode(playerNode)
audioEngine.connect(playerNode, to: audioEngine.mainMixerNode, format: buffer.format)
audioEngine.prepare()
func start() {
var error: NSError?
audioEngine.startAndReturnError(&error)
}
start()
}
startEngine()
let frameCapacity = AVAudioFramePosition(buffer.frameCapacity)
let frameLength = buffer.frameLength
let sampleRate: Double = 44100.0
func play() {
func scheduleBuffer() {
playerNode.scheduleBuffer(buffer, atTime: nil, options: AVAudioPlayerNodeBufferOptions.Interrupts, completionHandler: nil)
playerNode.prepareWithFrameCount(frameLength)
}
if playerNode.playing == false {
scheduleBuffer()
let time = AVAudioTime(sampleTime: frameCapacity, atRate: sampleRate)
playerNode.playAtTime(time)
}
else {
scheduleBuffer()
}
}
// triggered by a "Touch Up Inside" event on a UIButton in my ViewController
@IBAction func triggerPlay(sender: AnyObject) {
play()
}
< /code>
Обновление: < /p>
ОК. Я думаю, что я идентифицировал источник искажения: объем узла (ы) слишком велик при выводе и вызывает обрезку. Добавив эти две строки в мою функцию Startengine, искажение больше не произошло: < /p>
playerNode.volume = 0.8
audioEngine.mainMixerNode.volume = 0.8
< /code>
Однако я до сих пор не знаю, почему мне нужно снизить вывод- мой аудиофайл не обрезает. Я предполагаю, что это может быть результатом того, как реализованы Avaudioplayernodebufferoptions.Erengrests. Когда буфер прерывает другой буфер, может ли быть увеличение выходного объема в результате перерыва, вызывая выходной обрез? Я все еще ищу убедительное понимание того, почему это происходит ... если кто -то хочет/может дать какие -либо разъяснения по этому поводу, это было бы фантастически!
Подробнее здесь: https://stackoverflow.com/questions/289 ... ift-workin
Аудирующие глюки на воспроизведении буфера через avaudioplayernode в iOS (SWIFT) *Работая в симуляторе, но не на устройс ⇐ IOS
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение