首页 文章

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

提问于
浏览
1

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

    不要将完整的目录路径写入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];
    

    这将为您提供文件的实际路径 .

    继续编码........... :)

  • 2

    在将问题解决了几天之后我找到了解决方案 . 我突然指出并打印出来的程序,我发现我保存的文件路径与文件的文件路径不同 .

    我认为这是一个模拟器问题,因为问题只发生在模拟器的不同会话之间,并且在同一个会话中工作,所以设备ID(这是绝对路径的一部分)正在改变 - 也许更有知识的人可以权衡在那 .

    密切关注变量伙伴的字符串值!

相关问题