Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS-从文档目录读取音频文件_Ios_Xcode_Audio_Nsfilemanager_File Management - Fatal编程技术网

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

iOS-从文档目录读取音频文件,ios,xcode,audio,nsfilemanager,file-management,Ios,Xcode,Audio,Nsfilemanager,File Management,我正在将音频数据保存到Documents目录并尝试将其读回。如果我立即播放它,它会成功播放,但是,如果我启动一个新会话并尝试在本地播放歌曲,它会失败,即使在Documents目录中列出的文件显示我的文件仍然存在。请注意,如果文件立即播放或在新会话期间播放,则会以相同的方式(相同的代码)从“文档”文件夹中播放该文件 以下是如何将音频数据保存到Documents目录: +(void)writeDataToAudioFile:(NSData*)data forTrack:(MediaItem*)tra

我正在将音频数据保存到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];
    }

url无法正确创建,因为AVPlayer无法播放。此外,我尝试了各种不同的方法将文件作为数据加载到NSData对象中,以检查字节大小,但尝试访问文件作为数据总是返回nil。但是,该文件的存在就好像我使用NSFileManager一样,我能够迭代文档目录中的项目并打印它们的文件名/路径,从而验证我保存在“\u currentTrack.local\u file\u path”中的路径是否存在。同样,如果我在将文件保存到磁盘后立即播放该文件,它将播放


如果有更多的信息,我可以提供,使这更清楚,我会。非常感谢。

我把这个问题放了几天后找到了解决办法。我打断并打印程序,发现我保存的文件路径与文件的文件路径不同

我认为这是一个模拟器问题,因为该问题只发生在模拟器的不同会话之间,并且在同一会话中工作,因此设备id(是绝对路径的一部分)正在发生变化-也许有更了解情况的人可以参与进来


请密切注意变量的字符串值

不要将完整目录路径写入数据库。它会改变的。您只需要将文件名保存到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]; 
这将为您提供文件的实际路径


继续编码………..:)

“试图以数据形式访问文件总是返回nil”,这是需要解决的问题。首先假设
NSData
始终有效。使用NSFileManager获取文件大小。还将路径记录为保存时间和加载时间。添加到问题中,然后查看Finder中的目录(如果在模拟器上运行)。最好创建一个小方法来返回文件路径,这样可以消除潜在的错误。目前看来,您正在使用路径进行保存,并使用URL进行加载,这对于正确性来说不是一个很好的概念。加上更少的代码和缺乏重复是一件好事。