2

如何连续播放多个 .m4a 文件?

目前,我的函数开始播放一个,使用 AudioServicesPlaySystemSound 等,使用 AudioServicesAddSystemSoundCompletion 选择回调,然后返回。声音完成后,回调让我的软件继续。

每当有背靠背的声音时,这就是很多编码。

我的软件可以开始播放 .m4a 并以某种方式等待它完成,等待它的回调设置标志吗?我可以使用 pthread 软件进行多任务暂停的等待循环吗?

到目前为止,这是我的代码...

// 播放声音文件后恢复game_state继续游戏。int game_state_after_sound;void play_sound_file_done (SystemSoundID ssID, void calling_class) { printf("\n play_sound_file_done."); // 声音现在完成了,所以恢复 game_state 并从中断的地方继续 manage_game: game_state = game_state_after_sound; [(GeController )calling_class manage_game]; }

// Plays sound_file_m4a and returns after playing has completed.
-(void) play_sound_file: (NSString *) sound_file_m4a
{
    printf("\n play_sound_file '%s' ", [sound_file_m4a UTF8String] );
    NSString *soundPath = [[NSBundle mainBundle] pathForResource:sound_file_m4a ofType:@"m4a"]; 
    SystemSoundID soundID; 

    AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath: soundPath], &soundID); 
    AudioServicesPlaySystemSound (soundID); 
    AudioServicesAddSystemSoundCompletion ( soundID, NULL, NULL, play_sound_file_done, (void*)self ); 

    game_state_after_sound = game_state;
    game_state =  DELAY_WHILE_PLAYING_SOUND;
}

************************************ AVPlayer 正在进行中...

但这不会产生声音。

#import <AVFoundation/AVFfoundation.h> 

-(void) play_queued_sounds: (NSString *) sound_file_m4a
{
    printf("\n queue_sound_file: '%s' ", [sound_file_m4a UTF8String] );

    AVPlayerItem *sound_file = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:[[NSBundle mainBundle] pathForResource:sound_file_m4a ofType:@"m4a"]]]; 
    AVQueuePlayer *player = [AVQueuePlayer queuePlayerWithItems:[NSArray arrayWithObjects:sound_file, nil]];  

    [player play]; 

    return;
}
4

2 回答 2

3

这可以很容易地在AVQueuePlayer. 您不必处理完成或任何事情,只需给它您要按顺序播放的 AVPlayerItems 并调用 play。这是一个例子:

#import <AVFoundation/AVFfoundation.h>


//AVPlayerItem *item1 = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:[[NSBundle mainBundle] pathForResource:@"myFileName" ofType:@"m4a"]]];

编辑:改用这个

AVPlayerItem *item1 = [[AVPlayerItem alloc] initWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:[[NSString alloc] initWithFormat:@"2"] ofType:@"mp3"]]];

AVQueuePlayer *player = [AVQueuePlayer queuePlayerWithItems:[NSArray arrayWithObjects:item1, nil]];

[player play];

另外,这也可以通过用户 iPod 库中的项目使用来自委托方法的MPMusicPlayerController队列来实现didPickMediaItemsMPMediaPickerController

- (void)mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection
{
    MPMusicPlayerController *player = [MPMusicPlayerController applicationMusicPlayer];
    [player setQueueWithItemCollection:mediaItemCollection];
    [player play];
}
于 2012-08-26T05:25:54.910 回答
-1

我无法让 AVQueuePlayer 解决方案正常工作。

伟大的解决方案:对于每个要播放的声音,启动一个等待然后锁定互斥锁的线程,然后执行 AudioServicesPlaySystemSound。只需为要播放的每个连续声音启动一个线程,并使用 pthread 互斥锁来延迟每个连续线程,直到 AudioServicesAddSystemSoundCompletion 函数解锁互斥锁。像冠军一样工作。

这是 21 世纪的嵌入式编程:解决问题!

于 2012-08-30T05:14:18.470 回答