iOS - 从文档目录中读取音频文件

时间:2015-07-01 17:39:12

标签: ios xcode audio nsfilemanager file-management

我正在将音频数据保存到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”中保存的路径确实存在。同样,如果我在将文件保存到磁盘后立即播放文件,它将播放。

如果我能提供更多信息,我会更清楚。非常感谢你。

2 个答案:

答案 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(这是绝对路径的一部分)正在发生变化 - 也许是一个知识渊博的人可以权衡。

密切关注变量人员的字符串值!