首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >AVPlayer和本地文件

AVPlayer和本地文件
EN

Stack Overflow用户
提问于 2012-03-06 11:20:12
回答 6查看 45.4K关注 0票数 20

我正在为iOS构建一个播放web上托管的音频文件的MP3播放器。我想提供离线播放文件的能力,所以我有文件下载使用ASIHTTP,但我似乎找不到在应用程序文档目录中的mp3初始化AVPlayer的信息。以前有人这么做过吗?这有可能吗?

*我在下面发布了一个答案,展示了如何对本地和http文件使用iOS AvPlayer。希望这能有所帮助!

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-03-08 20:42:17

我决定回答我自己的问题,因为我觉得关于如何使用苹果提供的用于本地和流(通过http)文件的AVPlayer的文档很少。为了帮助理解该解决方案,我将一个sample project on GitHub in Objective-CSwift放在一起。下面的代码是Objective-C,但您可以下载我的Swift示例来查看。它非常相似!

我发现,除了为Asset > PlayerItem > AVPlayer链实例化NSURL之外,这两种设置文件的方法几乎是相同的。

下面是核心方法的概述

.h文件(部分代码)

代码语言:javascript
复制
-(IBAction) BtnGoClick:(id)sender;
-(IBAction) BtnGoLocalClick:(id)sender;
-(IBAction) BtnPlay:(id)sender;
-(IBAction) BtnPause:(id)sender;
-(void) setupAVPlayerForURL: (NSURL*) url;

.m文件(部分代码)

代码语言:javascript
复制
-(IBAction) BtnGoClick:(id)sender {

    NSURL *url = [[NSURL alloc] initWithString:@""];

    [self setupAVPlayerForURL:url];
}

-(IBAction) BtnGoLocalClick:(id)sender {

    // - - - Pull media from documents folder

    //NSString* saveFileName = @"MyAudio.mp3";
    //NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    //NSString *documentsDirectory = [paths objectAtIndex:0];
    //NSString *path = [documentsDirectory stringByAppendingPathComponent:saveFileName];

    // - - -

    // - - - Pull media from resources folder

    NSString *path = [[NSBundle mainBundle] pathForResource:@"MyAudio" ofType:@"mp3"];

    // - - -

    NSURL *url = [[NSURL alloc] initFileURLWithPath: path];

    [self setupAVPlayerForURL:url];
}

-(void) setupAVPlayerForURL: (NSURL*) url {
    AVAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil];
    AVPlayerItem *anItem = [AVPlayerItem playerItemWithAsset:asset];

    player = [AVPlayer playerWithPlayerItem:anItem];
    [player addObserver:self forKeyPath:@"status" options:0 context:nil];
}


- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {

    if (object == player && [keyPath isEqualToString:@"status"]) {
        if (player.status == AVPlayerStatusFailed) {
            NSLog(@"AVPlayer Failed");
        } else if (player.status == AVPlayerStatusReadyToPlay) {
            NSLog(@"AVPlayer Ready to Play");
        } else if (player.status == AVPlayerItemStatusUnknown) {
            NSLog(@"AVPlayer Unknown");
        }
    }
}

-(IBAction) BtnPlay:(id)sender {
    [player play];
}

-(IBAction) BtnPause:(id)sender {
    [player pause];
}

请查看Objective-C source code,了解有关这方面的工作示例。希望这能有所帮助!

-Update 12/7/2015我现在有了一个可以view here的源代码的Swift示例。

票数 35
EN

Stack Overflow用户

发布于 2016-05-20 00:02:04

我通过将file://前缀到我的本地URL来让AVPlayer与本地url一起工作

代码语言:javascript
复制
NSURL * localURL = [NSURL URLWithString:[@"file://" stringByAppendingString:YOUR_LOCAL_URL]];
AVPlayer * player = [[AVPlayer alloc] initWithURL:localURL];
票数 18
EN

Stack Overflow用户

发布于 2012-03-06 12:34:48

是的,可以下载.mp3(或任何类型的文件)并保存到NSDocument目录中,然后您可以使用AVAudioPlayer从该目录中检索并播放。

代码语言:javascript
复制
NSString *downloadURL=**your url to download .mp3 file**

NSURL *url = [NSURLURLWithString:downloadURL];

NSURLConnectionalloc *downloadFileConnection = [[[NSURLConnectionalloc] initWithRequest:      [NSURLRequestrequestWithURL:url] delegate:self] autorelease];//initialize NSURLConnection

NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,  YES) objectAtIndex:0];

NSString *fileDocPath = [NSStringstringWithFormat:@"%@/",docDir];//document directory path

[fileDocPathretain];

NSFileManager *filemanager=[ NSFileManager defaultManager ];

NSError *error;

if([filemanager fileExistsAtPath:fileDocPath])
{

//just check existence of files in document directory
}

NSURLConnection is used to download the content.NSURLConnection Delegate methods are used to  support downloading.

(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{

}
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
NSFileManager *filemanager=[NSFileManagerdefaultManager];
if(![filemanager fileExistsAtPath:filePath])
{
[[NSFileManagerdefaultManager] createFileAtPath:fileDocPath contents:nil attributes:nil];

}
NSFileHandle *handle = [NSFileHandlefileHandleForWritingAtPath:filePath];

[handle seekToEndOfFile];

[handle writeData:data];

[handle closeFile];
 }

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
 {
 UIAlertView *alertView=[[UIAlertViewalloc]initWithTitle:@”"message:
 [NSStringstringWithFormat:@"Connection failed!\n Error - %@ ", [error localizedDescription]]   delegate:nilcancelButtonTitle:@”Ok”otherButtonTitles:nil];
  [alertView show];
  [alertView release];
  [downloadFileConnectioncancel];//cancel downloding
  }

找回下载的音频并播放:

代码语言:javascript
复制
   NSString *docDir1 = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,   NSUserDomainMask, YES) objectAtIndex:0];

   NSString *myfilepath = [docDir1 stringByAppendingPathComponent:YourAudioNameinNSDOCDir];

   NSLog(@”url:%@”,myfilepath);

   NSURL *AudioURL = [[[NSURLalloc]initFileURLWithPath:myfilepath]autorelease];

只需编写代码即可使用AudioURL播放音频

我想知道你在这方面是否有任何澄清。

谢谢

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9577471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档