我正在将音频数据保存到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无法播放,因此无法正确创建网址。此外,我尝试了每种不同的方式将文件作为数据加载到NSData对象中以检查字节大小,但尝试访问该文件,因为数据始终返回nil。但是,该文件存在就好像我使用NSFileManager我能够迭代Documents目录中的项目并打印它们的文件名/路径,验证我在“_currentTrack.local_file_path”中保存的路径确实存在。同样,如果我在将文件保存到磁盘后立即播放文件,它将播放。
如果我能提供更多信息,我会更清楚。非常感谢你。
答案 0 :(得分:2)
不要将完整的目录路径写入DB。它会改变。您只需将文件名保存到DB作为参考。然后使用如下:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsPath = [paths objectAtIndex:0];
NSString *fileName = @"SAVED_FILE_NAME.mp3"; // eg: [track_id].mp3
NSString *filePath = [documentsPath stringByAppendingPathComponent:fileName];
这将为您提供文件的实际路径。
继续编码...........:)
答案 1 :(得分:0)
我把问题解决了几天后找到了解决方案。我突然指出并打印出程序,我发现我保存的文件路径与文件的文件路径不同。
我认为这是一个模拟器问题,因为问题只发生在模拟器的不同会话之间,并且在同一个会话中工作,因此设备ID(这是绝对路径的一部分)正在发生变化 - 也许是一个知识渊博的人可以权衡。
密切关注变量人员的字符串值!