【问题标题】:AVPlayer not playing MP3 audio file in documents directory iOSAVPlayer 不在 iOS 文档目录中播放 MP3 音频文件
【发布时间】:2012-08-28 08:00:16
【问题描述】:

我正在使用 AVPlayer 播放位于文档目录中的 MP3(文件已确认在其中)-我加载 AVPlayerItem 等待 AVPlayerItemStatusReadyToPlay 然后用该项目实例化 AVPlayer 并播放.

确实调用了AVPlayerItemStatusReadyToPlay,但实际上没有播放音频,有人知道为什么吗?

- (void)checkFileExists {
    if (![[NSFileManager defaultManager] fileExistsAtPath:[self.urlForEightBarAudioFile path]]) {
        [self beginEightBarDownload];
    } else {
        // set up audio
        [self setupAudio];

        //NSLog(@"file %@ already exists", [self.urlForEightBarAudioFile path]);
    }
}


- (void)setupAudio
{
    AVAsset *eightBarAsset = [AVAsset assetWithURL:self.urlForEightBarAudioFile];
    self.eightBarsPlayerItem = [[AVPlayerItem alloc] initWithAsset:eightBarAsset];
    [self.eightBarsPlayerItem addObserver:self forKeyPath:@"status" options:0 context:nil];
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if ([object isKindOfClass:[AVPlayerItem class]])
    {
        AVPlayerItem *item = (AVPlayerItem *)object;

        if ([keyPath isEqualToString:@"status"])
        {
            switch(item.status)
            {
                case AVPlayerItemStatusFailed:
                    break;
                case AVPlayerItemStatusReadyToPlay:
                    self.player = [[AVPlayer alloc] initWithPlayerItem:self.eightBarsPlayerItem];
                    [self.player play];
                    NSLog(@"player item status is ready to play");
                    break;
                case AVPlayerItemStatusUnknown:
                    NSLog(@"player item status is unknown");
                    break;
            }
        }
        else if ([keyPath isEqualToString:@"playbackBufferEmpty"])
        {
            if (item.playbackBufferEmpty)
            {
                NSLog(@"player item playback buffer is empty");
            }
        }
    }
}

【问题讨论】:

    标签: objective-c ios avfoundation avplayer


    【解决方案1】:

    这样做:

    - (void)setupAudio
    {
     if([NSFileManager defaultManager] fileExistsAtPath:[self.urlForEightBarAudioFile absoluteString]])
     {
       AVAsset *eightBarAsset = [AVAsset assetWithURL:self.urlForEightBarAudioFile];
       self.eightBarsPlayerItem = [[AVPlayerItem alloc] initWithAsset:eightBarAsset];
       self.eightBarsPlayer = [AVPlayer playerWithPlayerItem:self.eightBarsPlayerItem]; //forgot this line
       [self.eightBarsPlayer addObserver:self forKeyPath:@"status" options:0 context:nil]; // add observer for player not item
     }
    }
    

    参考avplayer-and-local-files链接

    【讨论】:

    • 谢谢,但我已经检查了文件是否存在,我已经编辑了我的帖子以显示这一点。
    • 嗯,对了,如果你从本地播放,那么你必须观察播放器,但如果你从远程播放,那么你观察播放器项目?我这样想对吗?你的回答很完美,谢谢。
    【解决方案2】:

    迅速

    func setupAudio() {
     if NSFileManager.defaultManager().fileExistsAtPath(self.urlForEightBarAudioFile.absoluteString) {
       self.eightBarsPlayerItem = AVPlayerItem(asset: AVAsset(URL: self.urlForEightBarAudioFile))
       self.eightBarsPlayer = AVPlayer(playerItem: self.eightBarsPlayerItem)
     }
    }
    

    【讨论】:

      【解决方案3】:
      - (void)setupAudio
      {
        dispatch_async(dispatch_get_main_queue(), ^{ 
        AVAsset *eightBarAsset = [AVAsset   assetWithURL:self.urlForEightBarAudioFile];
        self.eightBarsPlayerItem = [[AVPlayerItem alloc] initWithAsset:eightBarAsset];
        self.eightBarsPlayer = [AVPlayer  playerWithPlayerItem:self.eightBarsPlayerItem]; //forgot this line
        [self.eightBarsPlayer addObserver:self forKeyPath:@"status" options:0 context:nil]; // add observer for player not item
      });
      

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-28
        • 2015-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-30
        • 2014-10-26
        • 1970-01-01
        相关资源
        最近更新 更多