0

我在我的方法中设置了一个AVQueuePlayer命名播放器。viewDidLoad我也有一个UIbutton播放该序列的方法。

这是我的观点确实加载方法

AVPlayerItem *firstSound = [[AVPlayerItem alloc] initWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"first" ofType:@"mp3"]]];
AVPlayerItem *secondSound = [[AVPlayerItem alloc] initWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"second" ofType:@"mp3"]]];
AVPlayerItem *thirdSound = [[AVPlayerItem alloc] initWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"third" ofType:@"mp3"]]];

player = [AVQueuePlayer queuePlayerWithItems:[NSArray arrayWithObjects:firstSound, secondSound, thirdSound,  nil]];

这是我的按钮方法

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

当视图首次加载时,按下按钮只会产生一次声音序列。当我再次单击该按钮时,没有任何反应。但是,如果我导航到另一个视图控制器并返回到该视图控制器,它将在我第一次再次按下按钮时起作用,但和以前一样,它仅适用于第一次单击。

更新:在按钮而不是 viewDidLoad 方法中进行设置是根据第一个答案解决我的问题的关键。

我的 mp3 文件很小,每个文件只有一个单词。我有一个包含 3 列的 UIPickerView 设置,根据选择的行,当按下按钮时,它将按顺序播放这些特定的单词。关于我如何做到这一点有什么好的建议吗?

我目前正在尝试执行此操作,但出现错误

-(IBAction)sequencePlay:(id)sender 
{
NSString *sayFirst = _firstRowWord.description;

AVPlayerItem *firstSound = [[AVPlayerItem alloc] initWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:sayFirst.description ofType:@"mp3"]]];

我收到以下错误 * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“* -[NSURL initFileURLWithPath:]: nil string parameter”

firstRowWord 的描述与我要播放的 mp3 文件的名称完全相同

4

1 回答 1

2

您可以尝试使用 sequencePlay: 方法在此处设置 AVQueuePlayer。所以:

-(IBAction)sequencePlay:(id)sender {
AVPlayerItem *firstSound = [[AVPlayerItem alloc] initWithURL:[NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource:@"first" ofType:@"mp3"]]];
AVPlayerItem *secondSound = [[AVPlayerItem alloc] initWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"second" ofType:@"mp3"]]];
AVPlayerItem *thirdSound = [[AVPlayerItem alloc] initWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"third" ofType:@"mp3"]]];

player = [AVQueuePlayer queuePlayerWithItems:[NSArray arrayWithObjects:firstSound, secondSound, thirdSound,  nil]];
[player play];
}

如果您担心它的性能,您可以使用 actionAtItemEnd 属性来重新填充播放器。希望这有帮助!

于 2013-09-07T21:25:56.843 回答