Воспроизведение mp3 / wav звука вызывает исключение - PullRequest
0 голосов
/ 25 мая 2018

При воспроизведении аудио с использованием AVAudioPlayer, будь то mp3 или wav, я получаю исключение на всех iPad и iPhone 4S и только на iOS 9. Этого не происходит ни на каких других устройствах.

Возникает исключениес

com.apple.coreaudio.AQClient (18): breakpoint 2.2

с

libc++abi.dylib`__cxa_throw:

и я ловлю его, используя точку останова пользователя.$ arg1 ничего не содержит

Вот как я инициализирую AVAudioPlayer

guard let path = Bundle.main.path(forResource: file, ofType: type) else { return nil }
guard let url = URL(string: path) else { return nil }

try? AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient, with: .mixWithOthers)
try? AVAudioSession.sharedInstance().setActive(true)

return try? AVAudioPlayer(contentsOf: url)

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

self.sound?.prepareToPlay()
self.sound?.play()

Первоначально файл представлял собой файл wav, поэтому я преобразовал его в файл mp3, что не помогло.Я также использовал совершенно другой звук, который выдает те же исключения.

Само исключение не приводит к сбою симулятора, хотя Rollbar сообщает об ошибках SIGSEGV с такими следами:

libAVFAudio.dylib in 0x27c1c000

Используемый класс аудио:

import AVFoundation
import Foundation

class Audiotools {
    var sound: AVAudioPlayer?

    let dispatchQueue = DispatchQueue(label: "audio")

    static var shared: Audiotools = {
        let manager = Audiotools()
        return manager
    }()

    init() {
        self.sound = configurePlayer(withFile: Files.sound.name, type: Files.sound.extension)
    }

    func configurePlayer(withFile file: String, type: String) -> AVAudioPlayer? {
        guard let path = Bundle.main.path(forResource: file, ofType: type) else { return nil }
        guard let url = URL(string: path) else { return nil }

        try? AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient, with: .mixWithOthers)
        try? AVAudioSession.sharedInstance().setActive(true)

        return try? AVAudioPlayer(contentsOf: url)
    }

    func playSound() {
        self.dispatchQueue.async {
            self.sound?.prepareToPlay()
            self.sound?.play()
        }
    }
}

Другой отчет Rollbar:

SIGSEGV: Application terminated
libsystem_platform.dylib in _platform_memmove
AudioToolbox in Cached_DataSource::ReadFromHeaderCache(long long, unsigned int, void*, unsigned int*)
AudioToolbox in Cached_DataSource::ReadBytes(unsigned short, long long, unsigned int, void*, unsigned int*)
AudioToolbox in AudioFileObject::ReadBytes(unsigned char, long long, unsigned int*, void*)
AudioToolbox in AudioFileObject::ReadPacketDataVBR(unsigned char, unsigned int*, AudioStreamPacketDescription*, long long, unsigned int*, void*)
AudioToolbox in AudioFileReadPacketData
AVFAudio in AVAudioPlayerCpp::AQOutputCallbackCore(OpaqueAudioQueue*, AudioQueueBuffer*)
AVFAudio in AVAudioPlayerCpp::prepareToPlayQueue()
AVFAudio in AVAudioPlayerCpp::playQueue(AudioTimeStamp const*)
AVFAudio in AVAudioPlayerCpp::play()
AVFAudio in -[AVAudioPlayer play]

У кого-нибудь еще была такая проблема?

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Пожалуйста, попробуйте использовать AVAudioSessionCategoryPlayback вместо AVAudioSessionCategoryAmbient.

AVAudioSessionCategoryAmbient: используйте эту категорию для фоновых звуков, таких как дождь, шум двигателя автомобиля и т. Д.
Микширует с другой музыкой.

AVAudioSessionCategoryPlayback: используйте эту категорию для музыкальных треков.

0 голосов
/ 05 июня 2018

Оказывается, что wav и mp3 аудиофайлы были повреждены.Преобразование в aiff решило проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...