如何连续播放多个.m4a文件?
目前,我的函数开始播放一个,使用AudioServicesPlaySystemSound等,使用AudioServicesAddSystemSoundCompletion选择一个回调,然后返回。声音完成后,回调让我的软件继续。
每当有背靠背声音时,这就是很多编码。
我的软件能否开始播放.m4a,SOMEHOW等待它完成,等待其回调设置标志?我可以使用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;
}
答案 0 :(得分:3)
这可以在AVQueuePlayer
中轻松实现。你不必处理完成或任何事情,你只需要给它你想要按顺序播放的AVPlayerItem并调用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];
另外,使用来自MPMusicPlayerController
委托方法[{1}}
didPickMediaItems
来自用户iPod库的项目也可以实现这一点
MPMediaPickerController
答案 1 :(得分:-1)
我无法使用AVQueuePlayer解决方案。
伟大的解决方案: 对于要播放的每个声音,旋转等待然后锁定互斥锁的线程,然后执行AudioServicesPlaySystemSound。只需为每个连续的声音旋转一个线程,然后使用pthread互斥锁延迟每个连续的线程,直到AudioServicesAddSystemSoundCompletion函数解锁互斥锁。像冠军一样工作。
这是21世纪的嵌入式编程:在这个问题上抛出线索!