如何从互联网下载音频/视频文件并存储在iPhone应用程序中?

19

我正在开发一款音乐 iPhone 应用程序。我想给用户一些选项,让他们可以通过流媒体收听歌曲/音乐或者在应用中下载音乐。我知道如何通过编程在应用程序中流式传输音频文件。但是,我不知道如何下载应用程序中的音频文件并播放下载后的音频文件。另外,当下载过程中,用户可以暂停下载,这是否可行?有人可以指导我吗?请分享任何示例代码或教程给我。我还有一个问题:你能帮我创建应用程序内部的文件夹吗?请帮忙。谢谢提前。


1
你应该接受 @Liam George Betsworth 的答案,他已经尽力了。 - swiftBoy
2个回答

52

创建文件夹

每个应用程序都有一个名为“文档文件夹”的文件夹。您在应用程序中使用的所有文件都存储在此处。如果您想在此处创建更多目录,则可以执行以下操作:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; // Get documents folder
NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:@"MyNewFolder"];

if (![[NSFileManager defaultManager] fileExistsAtPath:dataPath])
    [[NSFileManager defaultManager] createDirectoryAtPath:dataPath withIntermediateDirectories:NO attributes:nil error:&error]; //Create folder if it doesn't already exist

下载

如果您想从互联网下载音频文件,则要考虑使用异步方法进行下载。这意味着应用程序可以在下载发生在后台时继续执行其他操作。

为此,我建议您使用ASIHTTPREQUEST。它非常适合执行任何下载请求,并为您提供诸多选项,例如暂停下载(正如您所请求的那样)。

该网站提供了大量有关下载和存储文件的文档。请查看页面上的“下载文件”部分。

就像这样:

NSURL *url = [NSURL URLWithString:@"http://www.fileurl.com/example.mp3"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDownloadDestinationPath:[NSString stringWithFormat:@"%@",dataPath]]; //use the path from earlier
[request setDelegate:self];
[request startAsynchronous];

然后,通过ASIHTTPRequest提供的委托方法处理进度和完成即可。

播放

播放文件非常简单。一旦文件在设备上并且您知道它在哪里,只需将其加载到音频播放器中即可。

这里有一个很棒的教程,介绍如何使用AVAudioPlayer播放声音。在您的情况下,使用它的一个非常简单的示例是:

NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/audiofile.mp3",dataPath];

NSError *error;
audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];

if (audioPlayer == nil)
    NSLog([error description]);
else
    [audioPlayer play];

1
很棒的评论,解释得非常清晰!+1 - onetwopunch
1
这是一个非常好的答案,应该被接受。不知道为什么有些人问完问题就消失了 :( - swiftBoy
4
我建议使用AFNetworking而不是ASIHTTPRequest,不过@LiamGeorgeBetsworth的回答非常好。 - GangstaGraham
我发现ASHttpRequest有很多问题,不知道为什么没有简单的方法将图像从服务器下载到文档目录。我已经实现了从服务器下载文件,但是尝试保存到文档目录并不顺利,文件以损坏的方式保存。请在这里检查我的代码并帮助我,谢谢 :) - Eshwar Chaitanya
1
我同意@GangstaGraham的观点,他应该使用AFNetworking,但请注意日期。那时候还没有可用的AFNetworking类。 - try catch finally
1
@EshwarChaitanya,建议你使用AFNetworking,因为ASIHTTPRequest类存在许多bug,经常会导致应用程序崩溃。几乎所有人都已经转向了AFNetworking。我建议你也尽快这样做。 - try catch finally

0

是的,ASIHTTPRequest 是最好的方法,你应该使用它来下载音频文件,如果出现问题,请告诉我,我会尽力解决,因为真主的名义。 - Khalid Usman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接