如何在iOS iPhone应用程序上以编程方式轻松回放.m4a文件

时间:2012-08-26 05:04:09

标签: iphone ios audio xcode4

如何连续播放多个.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;
}

2 个答案:

答案 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世纪的嵌入式编程:在这个问题上抛出线索!