播放 mp3/wav 声音导致异常
Playing mp3/wav sound causes exception
当使用 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 使用这样的 stracktrace 报告 SIGSEGV 错误,但异常本身不会使模拟器崩溃:
libAVFAudio.dylib in 0x27c1c000
使用的音频class:
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]
有其他人遇到过这种问题吗?
原来 wav 和 mp3 音频文件都已损坏。转换为 aiff 解决了问题。
请尝试使用 AVAudioSessionCategoryPlayback 而不是 AVAudioSessionCategoryAmbient。
AVAudioSessionCategoryAmbient :将此类别用于背景声音,例如下雨、汽车发动机噪音等
与其他音乐混音。
AVAudioSessionCategoryPlayback:将此类别用于音乐曲目。
当使用 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 使用这样的 stracktrace 报告 SIGSEGV 错误,但异常本身不会使模拟器崩溃:
libAVFAudio.dylib in 0x27c1c000
使用的音频class:
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]
有其他人遇到过这种问题吗?
原来 wav 和 mp3 音频文件都已损坏。转换为 aiff 解决了问题。
请尝试使用 AVAudioSessionCategoryPlayback 而不是 AVAudioSessionCategoryAmbient。
AVAudioSessionCategoryAmbient :将此类别用于背景声音,例如下雨、汽车发动机噪音等
与其他音乐混音。
AVAudioSessionCategoryPlayback:将此类别用于音乐曲目。