【问题标题】:Using MPMediaItems with AVAudioPlayer将 MPMediaItems 与 AVAudioPlayer 一起使用
【发布时间】:2011-03-07 16:48:47
【问题描述】:

是否可以使用 MPMediaPickerController 选择媒体项,然后将它们加载到 AVAudioPlayer 对象中?

【问题讨论】:

    标签: iphone objective-c


    【解决方案1】:

    如果MPMusicPlayerController 不能满足您的需求,您可以copy the audio to your local bundle,这样您就可以使用AVAudioPlayer

    编辑

    您基本上有三个选项来播放用户 iPod 库中的音频:MPMediaPlayerAVPlayerAVAudioPlayer

    以下是MPMediaPlayerAVPlayer 的示例:

    - (void) mediaPicker: (MPMediaPickerController *) mediaPicker
       didPickMediaItems: (MPMediaItemCollection *) collection {
    
    
        MPMediaItem *item = [[collection items] objectAtIndex:0];
        NSURL *url = [item valueForProperty:MPMediaItemPropertyAssetURL];
    
        [self dismissModalViewControllerAnimated: YES];
    
        // Play the item using MPMusicPlayer
    
        MPMusicPlayerController* appMusicPlayer = [MPMusicPlayerController applicationMusicPlayer];
    
        [appMusicPlayer setQueueWithItemCollection:collection];
        [appMusicPlayer play];
    
    
        // Play the item using AVPlayer
    
        AVPlayerItem *playerItem = [[AVPlayerItem alloc] initWithURL:url];
        AVPlayer *player = [[AVPlayer alloc] initWithPlayerItem:playerItem];
        [player play];  
    
    }
    

    如果您出于某种原因需要使用AVAudioPlayer,或者您需要访问音频文件的实际音频数据,您必须先将音频文件复制到应用程序的目录中,然后再在那里使用它。如果您习惯于处理照片和视频,AVAsset + AVPlayer 最接近于 ALAsset

    【讨论】:

    • 那么以 AVAssets 形式存在的音频资产使用起来和 ALAssets 一样吗?
    • 我正在尝试在主机端播放音乐,连接的连接听到在主机端播放的相同音乐。从主机端,我尝试通过连接的会话将媒体项目发送到加入端,但媒体项目不发送。请告诉我如何将媒体项目从主机发送到加入(客户端)端?顺便说一句,我成功发送了媒体标题和媒体作品。谢谢。
    • 链接可能应该更新——要么更新到archival version,要么直接更新到它所指的bitbucket repo
    • 通过使用这个: MPMediaItem *item = [[collection items] objectAtIndex:0]; NSURL *url = [item valueForProperty:MPMediaItemPropertyAssetURL];它告诉我,URL 为空。
    【解决方案2】:

    只是想说,在 iOS 6 和 7 中,AVAudioPlayer 可以直接从 iPod 播放文件 URL,而无需按照 Art 的建议将音频数据复制到您的应用目录中。

    - (void) mediaPicker: (MPMediaPickerController *) mediaPicker didPickMediaItems: (MPMediaItemCollection *) collection {
    
    
        MPMediaItem *item = [[collection items] objectAtIndex:0];
        NSURL *url = [item valueForProperty:MPMediaItemPropertyAssetURL];
    
        // Play the item using AVPlayer
        self.avAudioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
        [self.avAudioPlayer play];
    }
    

    【讨论】:

    • 在使用媒体查询时会导致 -43 NSOSStatusErrorDomain
    • 有人可以验证 AVAudioPlayer 真的可以播放 iPod 库中的歌曲吗?现在在 MPMusicPlayerController 上弃用 setVolume 变得更加重要。
    • 我使用 AVAudioPlayer 在 iOS 6 和 7 中播放 iPod 歌曲。它可以工作。
    • 有些歌曲无法播放——特别是我注意到一些 >6 年前购买的歌曲对我不起作用——我认为 DRM 不允许在外部播放它们音乐应用...
    【解决方案3】:

    我想补充一下(我还不能评论 SO),它似乎在 iOS 8 中,也许在此之前,存储在 iCloud 上的歌曲没有属性 assetURL 的值并返回 @ 987654322@ 为[npItem valueForProperty:MPMediaItemPropertyAssetURL]

    这是一个示例输出:

    MPMediaItem *npItem = self.musicPlayerController.nowPlayingItem;
    NSLog(@"Song Title: %@\n assetURL: %@\n Cloud Item: %d", npItem.title, [npItem valueForProperty:MPMediaItemPropertyAssetURL], npItem.cloudItem)
    
    
    // Log Output
    Song Title: Time We Had
    assetURL: (null)
    Cloud Item: 1
    
    Song Title: The Quiet
    assetURL: ipod-library://item/item.m4a?id=1529654720874100371
    Cloud Item: 0
    

    【讨论】:

    • 有没有办法区分“旧”受 DRM 保护的歌曲和 iCloud 上的歌曲?
    【解决方案4】:

    我想你会发现[NSBundle mainBundle] 是只读的。无法将文件写入APP,因此AVAudioPlayer不适用于iPod-Library MPMediaItems

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多