AVPlayer和本地文件

sti*_*itz 20 iphone avfoundation ipad avplayer

我正在构建一个用于iOS的MP3播放器,播放在网络上托管的音频文件.我想提供离线播放文件的能力,所以我使用ASIHTTP下载文件,但我似乎无法在app文档目录中找到有关初始化AVPlayer的信息.有没有人这样做过?它甚至可能吗?

*我在下面发布了一个答案,显示了如何将iOS AvPlayer用于本地和http文件.希望这可以帮助!

sti*_*itz 34

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

我发现除了你如何为Ass​​et> PlayerItem> AVPlayer链实例化NSURL之外,设置文件的两种方式几乎完全相同.

以下是核心方法的概述

.h文件(部分代码)

-(IBAction) BtnGoClick:(id)sender;
-(IBAction) BtnGoLocalClick:(id)sender;
-(IBAction) BtnPlay:(id)sender;
-(IBAction) BtnPause:(id)sender;
-(void) setupAVPlayerForURL: (NSURL*) url;
Run Code Online (Sandbox Code Playgroud)

.m文件(部分代码)

-(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];
}
Run Code Online (Sandbox Code Playgroud)

查看Objective-C源代码以获取相关的工作示例.希望这可以帮助!

-Update 12/7/2015我现在有一个Swift示例,您可以在此处查看源代码.


Sud*_*udo 14

AVPlayer通过预先添加file://到我的本地URL来使用本地URL

NSURL * localURL = [NSURL URLWithString:[@"file://" stringByAppendingString:YOUR_LOCAL_URL]];
AVPlayer * player = [[AVPlayer alloc] initWithURL:localURL];
Run Code Online (Sandbox Code Playgroud)