使用 MPMediaPicker 选择作为 AVAudioPlayer 输入

Posted

技术标签:

【中文标题】使用 MPMediaPicker 选择作为 AVAudioPlayer 输入【英文标题】:Use MPMediaPicker selections as AVAudioPlayer inputs 【发布时间】:2011-07-17 06:47:17 【问题描述】:

我正在为听障人士编写一个应用程序。我希望从 iTunes 库中获取曲目,并且在我的应用程序中有一个用于平移的滑块。我不想使用 OpenAL(这不是游戏——我再说一遍,这是一个媒体播放器)。因此,既然 AVAudioPlayer 具有简单的平移方法,我可以从 MPMediaPicker 中获取选择并将它们输入到 AVAudioPlayer 以便我可以平移它们吗?

【问题讨论】:

【参考方案1】:

我做的ios开发不多,但我相信有两种方式。

方法#1 您需要在 Xcode 和 #import AVAudioPlayer.h 中将 /System/Library/Frameworks/AVFoundation.framework 添加到您的目标,并且您需要在 Xcode 和 #import 中将 MediaPlayer.framework 添加到您的目标。

对于此操作,您需要 MPMediaPicker 将歌曲数据传递给 AVAMedia Player。可以这样完成:

@interface MusicPlayerDemoViewController : UIViewController <MPMediaPickerControllerDelegate> 
...

...
// This action should open the media picker
- (IBAction)openMediaPicker:(id)sender;
@end

// MusicPlayerDemoViewController.m
- (IBAction)openMediaPicker:(id)sender 
    MPMediaPickerController *mediaPicker = [[MPMediaPickerController alloc] initWithMediaTypes:MPMediaTypeMusic];
    mediaPicker.delegate = self;
    mediaPicker.allowsPickingMultipleItems = NO; // this is the default   
    [self presentModalViewController:mediaPicker animated:YES];
    [mediaPicker release];
                                   

// Media picker delegate methods
- (void)mediaPicker: (MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection 
  // We need to dismiss the picker
  [self dismissModalViewControllerAnimated:YES];

(代码在下面继续,空白供您填写)

此时,调用 AVAAUDIOPLAYER 类并告诉它播放 mediaItemCollection 。播放前记得停止音频,因为它会同时播放多首歌曲。



- (void)mediaPickerDidCancel:(MPMediaPickerController *)mediaPicker 
    // User did not select anything
    // We need to dismiss the picker
    [self dismissModalViewControllerAnimated:YES];

现在,一旦完成,用户需要选择一首新歌曲。您可以在整个过程中创建一个 WHILE 循环,条件是当前时间 >= 持续时间(来自 AVAAUDIO 播放器),

或者,您可以创建一个按钮来打开选择器

更多问题查看:

http://oleb.net/blog/2009/07/the-music-player-framework-in-the-iphone-sdk/(我使用了很多他们的代码)

http://developer.apple.com/library/ios/#DOCUMENTATION/AVFoundation/Reference/AVAudioPlayerClassReference/Reference/Reference.html

祝你好运!

德里克

【讨论】:

谢谢。我想我真的应该做一个自定义课程。我的想法是获取挑选的音频文件,并在应用程序的沙盒位置为它们创建别名。这样 AVAudioPlayer 就可以像往常一样调用它们并播放它们。所以我现在遇到的问题是我不能在自定义类中使用 ViewController.h 中的东西!我需要让类从 ViewController 继承吗? 啊-我想我明白了。在导入视图控制器的自定义类中添加#import 语句。但是现在,如何为 MPMediaPicker 选择设置别名? 不,这一切都不起作用。想不通AVAudioPlayer的播放方法,很奇怪。我确实有一个平移滑块正在运行,但我仍然不知道如何在 AVAudioPlayer 中使用 MPMediaPicker 选择。 我现在有一个更大的问题。我使用 MPMediaItemPropertyAssetURL 找到了媒体项的 URL,但现在我遇到了更大的问题。当媒体选择器加载时:2011-07-18 23:06:45.159 PeterPan[301:707] *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[PeterPanViewController handle_VolumeChanged:]:无法识别的选择器发送到实例0x25c790'【参考方案2】:

    尝试让 AVAMediaPlayer 播放变量 mediaItemCollection。这是由选择器通过上面的代码指定为歌曲位置的。如果这不起作用,请确保 AVAMediaPlayer 使用与 MpMediaPicker 相同的输入变量类型(格式,如 ID 或文件夹位置)。

    该错误消息听起来像是技术问题。我唯一能想到的是 AVAAudio 播放器或 MPmedia 播放器正在寻找一个 Volume 变量(它是必需的?)并且找不到。我无法真正回答这个问题,因为我不做 iPhone 开发,请尝试论坛或网站寻求帮助。

听起来你做得很好!如果您有兴趣,(我不知道您是否留在 DA)Cochran 先生(高年级学生的院长)正在教授 iPhone 开发课程和 AP 计算机科学课程(我在)。如果你想更进一步,或者你只想问问题,我知道他也很高兴!

祝你好运!完成后告诉我,以便我测试结果!

【讨论】:

谢谢!我认为这可能是一种必需的方法。 是的,这是必需的方法。但是,现在,当我选择一首歌曲时,媒体选择器并没有消失,也没有播放任何内容。这正在变成一个更大的痛苦,它应该是。是的,我住在 DA。 有 AVAMediaPlayer 吗?还是您的意思是 AVAudioPlayer?是的,这就是我正在做的。 - (void) mediaPicker: (MPMediaPickerController *) mediaPicker didPickMediaItems: (MPMediaItemCollection *) mediaItemCollection if (mediaItemCollection) [musicPlayer setQueueWithItemCollection:mediaItemCollection]; panPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[mediaItemCollection valueForProperty:MPMediaItemPropertyAssetURL] error:nil]; [panPlayer 准备播放]; [panPlayer 播放]; [音乐播放器播放]; [self dismissModalViewControllerAnimated: YES]; 这就是您选择歌曲时发生的情况。

以上是关于使用 MPMediaPicker 选择作为 AVAudioPlayer 输入的主要内容,如果未能解决你的问题,请参考以下文章

在我的应用程序中复制 iphone 库的音乐文件

ava学习那家好

已经在 J​​ava 类中管理 ID 为 0 的 GoogleApiClient

如何将ios音频上传到服务器?

ava Maven项目之Nexus私服搭建和版本管理应用

如何使用 AVA 进行单元测试?