使用 AVAudioPlayer 时 OSStatus 错误 2003334207
OSStatus error 2003334207 when using AVAudioPlayer
我正在尝试在按下按钮时播放 MP3 文件(通过 VLC/iTunes 播放时有效)。这是我的代码:
var audioPlayer: AVAudioPlayer!
@IBAction func playEpisode(sender: AnyObject) {
println("now playing")
let indexPath = NSIndexPath(forRow: sender.tag, inSection: 0)
let data: CDEpisode = fetchedResultsController.objectAtIndexPath(indexPath!) as! CDEpisode
var err: NSError?
let url = NSURL(string: data.localPath)
println("The url is \(url)")
audioPlayer = AVAudioPlayer(contentsOfURL: url, error: &err)
if audioPlayer == nil {
if let e = err {
println(e.localizedDescription)
}
}
audioPlayer.delegate = self
audioPlayer.prepareToPlay()
audioPlayer.play()
}
这是日志:
now playing
The url is Optional(file:///var/mobile/Containers/Data/Application/4747A71E-A63F-4EFC-B2DF-8B361361080B/Documents/serial-s01-e12.mp3)
The operation couldn’t be completed. (OSStatus error 2003334207.)
fatal error: unexpectedly found nil while unwrapping an Optional value
EXC_BREAKPOINT
发生在 audioPlayer.delegate = self
。
StackoOverflow 上的其他线程没有帮助。有任何想法吗?
谢谢
编辑:我尝试将 localURL 传递给 contentsOfURL(而不是 CDEpisode 对象),但仍然失败。
您似乎在尝试解包一个值为 nil 的变量。您应该安全地解包变量以防止出现这种情况。
if let data: CDEpisode = fetchedResultsController.objectAtIndexPath(indexPath!) as! CDEpisode
{
var err: NSError?
let url = NSURL(string: data.localPath)
println("The url is \(url)")
//rest of code
}
您仍然需要弄清楚为什么它返回 nil,但这是一种更安全的解包变量和防止崩溃的方法,因为需要更多的上下文来解决该问题。
一些要研究的问题:
- 您确定 fetchedResultsController 正在返回一个对象吗
全部?
- 你确定是 CDEpisode 的吗?
您正在检查 audioPlayer
是否为 nil
,但随后您继续使用它,就好像它不是。你可能想要这样的东西:
if audioPlayer == nil {
if let e = err {
println(e.localizedDescription)
}
} else {
audioPlayer.delegate = self
audioPlayer.prepareToPlay()
audioPlayer.play()
}
并做一些事情来实际处理错误情况,而不仅仅是打印错误。
在我的情况下,我遇到了同样的问题,我发现我需要在开始录制之前进行设置
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord)
希望对大家有所帮助
我也遇到了这个问题,查看了音频文件url,发现它存放在Cache目录下。所以音频播放器可能无法根据您的 "url".
找到音频文件
请确保url路径在Document目录下。
这可能是由于试图加载一个不存在的文件造成的。如果这有助于某人添加对 url.checkResourceIsReachable()
的调用,将记录更多描述性消息。
示例代码:
do {
let url = URL(fileURLWithPath: dbObject.path)
let isReachable = try url.checkResourceIsReachable()
// ... you can set breaking points after that line, and if you stopped at them it means file exist.
} catch let e {
print("couldnt load file \(e.localizedDescription)")
}
正如其他人所说,音频播放器找不到文件。
这对我有帮助:
基本上,您不能使用绝对引用加载文件,因为沙箱环境每次都会重新生成绝对文件url。因此,您需要添加一小段代码(见上文)才能使用正确的 url。
试试这个
var player: AVAudioPlayer = AVAudioPlayer()
@IBAction func playX(_ sender: Any) {
let urlstring = "https://file-examples-com.github.io/uploads/2017/11/file_example_MP3_700KB.mp3"
let url = URL(string: urlstring)
let data = try! Data(contentsOf: url!)
player = try! AVAudioPlayer(data: data)
player.prepareToPlay()
player.volume = 1.0
player.play()
}
我正在尝试在按下按钮时播放 MP3 文件(通过 VLC/iTunes 播放时有效)。这是我的代码:
var audioPlayer: AVAudioPlayer!
@IBAction func playEpisode(sender: AnyObject) {
println("now playing")
let indexPath = NSIndexPath(forRow: sender.tag, inSection: 0)
let data: CDEpisode = fetchedResultsController.objectAtIndexPath(indexPath!) as! CDEpisode
var err: NSError?
let url = NSURL(string: data.localPath)
println("The url is \(url)")
audioPlayer = AVAudioPlayer(contentsOfURL: url, error: &err)
if audioPlayer == nil {
if let e = err {
println(e.localizedDescription)
}
}
audioPlayer.delegate = self
audioPlayer.prepareToPlay()
audioPlayer.play()
}
这是日志:
now playing
The url is Optional(file:///var/mobile/Containers/Data/Application/4747A71E-A63F-4EFC-B2DF-8B361361080B/Documents/serial-s01-e12.mp3)
The operation couldn’t be completed. (OSStatus error 2003334207.)
fatal error: unexpectedly found nil while unwrapping an Optional value
EXC_BREAKPOINT
发生在 audioPlayer.delegate = self
。
StackoOverflow 上的其他线程没有帮助。有任何想法吗? 谢谢
编辑:我尝试将 localURL 传递给 contentsOfURL(而不是 CDEpisode 对象),但仍然失败。
您似乎在尝试解包一个值为 nil 的变量。您应该安全地解包变量以防止出现这种情况。
if let data: CDEpisode = fetchedResultsController.objectAtIndexPath(indexPath!) as! CDEpisode
{
var err: NSError?
let url = NSURL(string: data.localPath)
println("The url is \(url)")
//rest of code
}
您仍然需要弄清楚为什么它返回 nil,但这是一种更安全的解包变量和防止崩溃的方法,因为需要更多的上下文来解决该问题。
一些要研究的问题:
- 您确定 fetchedResultsController 正在返回一个对象吗 全部?
- 你确定是 CDEpisode 的吗?
您正在检查 audioPlayer
是否为 nil
,但随后您继续使用它,就好像它不是。你可能想要这样的东西:
if audioPlayer == nil {
if let e = err {
println(e.localizedDescription)
}
} else {
audioPlayer.delegate = self
audioPlayer.prepareToPlay()
audioPlayer.play()
}
并做一些事情来实际处理错误情况,而不仅仅是打印错误。
在我的情况下,我遇到了同样的问题,我发现我需要在开始录制之前进行设置
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord)
希望对大家有所帮助
我也遇到了这个问题,查看了音频文件url,发现它存放在Cache目录下。所以音频播放器可能无法根据您的 "url".
找到音频文件请确保url路径在Document目录下。
这可能是由于试图加载一个不存在的文件造成的。如果这有助于某人添加对 url.checkResourceIsReachable()
的调用,将记录更多描述性消息。
示例代码:
do {
let url = URL(fileURLWithPath: dbObject.path)
let isReachable = try url.checkResourceIsReachable()
// ... you can set breaking points after that line, and if you stopped at them it means file exist.
} catch let e {
print("couldnt load file \(e.localizedDescription)")
}
正如其他人所说,音频播放器找不到文件。
这对我有帮助:
基本上,您不能使用绝对引用加载文件,因为沙箱环境每次都会重新生成绝对文件url。因此,您需要添加一小段代码(见上文)才能使用正确的 url。
试试这个
var player: AVAudioPlayer = AVAudioPlayer()
@IBAction func playX(_ sender: Any) {
let urlstring = "https://file-examples-com.github.io/uploads/2017/11/file_example_MP3_700KB.mp3"
let url = URL(string: urlstring)
let data = try! Data(contentsOf: url!)
player = try! AVAudioPlayer(data: data)
player.prepareToPlay()
player.volume = 1.0
player.play()
}