【发布时间】:2015-09-19 00:16:24
【问题描述】:
我正在将音频数据保存到 Documents 目录并尝试将其读回。如果我立即播放它,它会成功播放,但是,如果我开始一个新会话并尝试在本地播放歌曲,即使列出 Documents 目录中的文件表明我的文件仍然存在,它也会失败。请注意,如果文件立即播放或在新会话期间播放,文件将以相同的方式(相同的代码)从 Documents 文件夹播放。
这是我将音频数据保存到 Documents 目录的方法:
+(void)writeDataToAudioFile:(NSData*)data forTrack:(MediaItem*)track
{
// filename looks like "[track_id].mp3"
NSString *fileName = [NSString stringWithFormat:@"%@.%@",track.sc_id,track.original_format];
NSString *pathName = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask,
YES) firstObject]
stringByAppendingPathComponent:fileName];
[[NSFileManager defaultManager] createFileAtPath:pathName
contents:data
attributes:nil];
}
然后在我的音乐播放器中,我想将本地 URL 加载到该文件以初始化 AVPlayer:
NSURL *url;
if(_currentTrack.is_local_item)
{
url = [NSURL fileURLWithPath:_currentTrack.local_file_path];
}
由于 AVPlayer 无法播放,因此无法正确创建 URL。此外,我尝试了各种不同的方法将文件作为数据加载到 NSData 对象中以检查字节大小,但尝试访问文件,因为数据总是返回 nil。但是,该文件存在,就好像我使用 NSFileManager 我能够遍历 Documents 目录中的项目并打印它们的文件名/路径,验证我保存在“_currentTrack.local_file_path”中的路径确实存在。同样,如果我在将文件保存到磁盘后立即播放文件,它将播放。
如果我可以提供更多信息以使这一点更清楚,我会提供的。非常感谢。
【问题讨论】:
-
"试图访问文件,因为数据总是返回 nil" 这就是要解决的问题。首先假设
NSData总是有效。使用 NSFileManager 获取文件大小。还将路径记录为保存时间和加载时间。添加到问题中,然后在模拟器上运行时查看 Finder 中的目录。最好创建一个小方法来返回文件路径,以消除潜在的错误。目前,您似乎正在使用路径保存并使用 URL 加载,这对于正确性来说不是一个很好的概念。加上更少的代码和没有重复是一件好事。
标签: ios xcode audio nsfilemanager file-management