iOS xcode4 AVQueuePlayer не воспроизводит звук

Я пытаюсь воспроизвести звуковой файл .m4a с помощью AVQueuePlayer на iPhone4, но звука нет. Если я попробую AudioServicesPlaySystemSound с тем же файлом, все работает нормально.

Вот код.

(AVFoundation framework is installed.)

    #import <AVFoundation/AVFoundation.h> 

-(void) play_sound_file: (NSString *) sound_file_m4a
{
    printf("\n play_sound_file 1: '%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;
}

ПОСЛЕДНИЙ КОД ОТ 28.08.12........ (Примечание: оба звуковых файла работают с AudioServicesPlaySystemSound)

AVPlayerItem *sound_file1 = [[AVPlayerItem alloc] initWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:[[NSString alloc] initWithFormat:@"Hold still"] ofType:@"m4a"]]]; 

AVPlayerItem *sound_file2 = [[AVPlayerItem alloc] initWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:[[NSString alloc] initWithFormat:@"Press go"] ofType:@"m4a"]]];     

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

[player play]; 

person Doug Null    schedule 28.08.2012    source источник
comment
кстати, наиболее широко принятой нотацией для именования методов и переменных в target-c является верблюжий регистр. developer.apple.com/library/mac/# документация/Какао/Концептуальные/   -  person jere    schedule 28.08.2012


Ответы (1)


Я объяснил, как это исправить, в комментарии к моему ответу в вашем последнем посте. Одна из причин, по которой это может не работать, заключается в том, что вы передаете один элемент в arrayWithObjects:, для которого требуется более одного элемента. Еще одна причина, по которой это может не работать, заключается в том, что если вы пытаетесь запустить это в симуляторе, существуют известные проблемы совместимости между AVQueuePlayer и симулятором.

Также:

Заменять

AVPlayerItem *sound_file = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:[[NSBundle mainBundle] pathForResource:sound_file_m4a ofType:@"m4a"]]]; 

С

AVPlayerItem *sound_file = [[AVPlayerItem alloc] initWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:[[NSString alloc] initWithFormat:@"sound_file_m4a"] ofType:@"m4a"]]];

EDIT: Вот пример последовательного воспроизведения аудиофайлов.

В вашем заголовочном файле:

#import <AVFoundation/AVFoundation.h>

AVAudioPlayer *data;
NSArray *arrayOfTracks;
NSUInteger currentTrackNumber;

Затем в вашем файле реализации:

- (void)viewDidLoad
{
    [super viewDidLoad];
    arrayOfTracks = [[NSArray alloc] initWithObjects:@"1",@"2",@"3", nil];//Do NOT include file extension here
    currentTrackNumber = 0;
}
- (void)startPlaying
{
    if (data) {
        [data stop];
        //[data release]; if project isn't using Automatic Reference Counting
        data = nil;
    }
    data = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:[[NSString alloc] initWithString:[arrayOfTracks objectAtIndex:currentTrackNumber]] ofType:@"m4a"]] error:NULL];
    data.delegate = self;
    [data play];
}

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
    if (flag) {
        if (currentTrackNumber < [arrayOfTracks count] - 1) {
            currentTrackNumber ++;
            if (data) {
                [data stop];
                //[data release]; if project isn't using Automatic Reference Counting
                data = nil;
            }
            data = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:[[NSString alloc] initWithString:[arrayOfTracks objectAtIndex:currentTrackNumber]] ofType:@"m4a"]] error:NULL];
            data.delegate = self;
            [data play];
        }
    }
}
person Mick MacCallum    schedule 28.08.2012
comment
Это тоже не сработало. Я использую iPhone4 (iOS 5.1), а не симулятор. Я добавил свой последний код выше и использую два файла. Комментарии в последнем посте кажутся немного нарезанными, но я почищу их, как только это заработает. Спасибо, NSPostWhenIdle. - person Doug Null; 28.08.2012
comment
@DouglasK.Bell Создает ли журнал, который вы ввели, что-нибудь? - person Mick MacCallum; 28.08.2012
comment
NSPostWhenIdle: Yes -- это показывает, что игра выполнена; был журнал до и после игры. А если просто использовать AVPlayer? На самом деле я вызываю процедуру только с одним файлом за раз. Воспроизведение AVPlayer блокируется до тех пор, пока не будет воспроизведен звуковой файл? - person Doug Null; 28.08.2012
comment
@DouglasK.Bell Не совсем так, сейчас я работаю с AVPlayer в проекте с использованием очереди, но я бы не рекомендовал это делать. AVPlayer не был предназначен для обработки очереди из коробки, тогда как AVQueuePlayer является подклассом AVPlayer, который был разработан для этого. Если вам нужна другая альтернатива, я отредактирую свой ответ, чтобы показать вам, как вы можете воспроизвести звук в AVAudioPlayer, а затем использовать метод делегата player didFinishPlaying, чтобы запустить следующий музыкальный элемент из массива названий песен. - person Mick MacCallum; 28.08.2012
comment
@DouglasK.Bell Я отредактировал свой пост здесь, чтобы показать пример того, как создать очередь с помощью AVAudioPlayer - person Mick MacCallum; 28.08.2012
comment
Спасибо, но, к сожалению, у него та же проблема, что и у AudioServicesPlaySystemSound: мне нужно запрограммировать audioPlayerDidFinishPlaying. Мне нужно иметь возможность воспроизводить последовательные звуки, например: [self play_sound_file: @one]; [собственный play_sound_file: @two]; [собственный play_sound_file: @three]; ... без необходимости программировать конечный автомат приложения для каждого воспроизводимого звукового файла. Вот почему мне нужно запустить AVQueuePlayer, чтобы я мог отправить ему один или несколько звуковых файлов и не ждать между ними. - person Doug Null; 29.08.2012
comment
@DouglasK.Bell AVAudioPlayer сделает это. Вы вводите имена звуков в массив, как указано выше, и автоматически вызывается audioPlayerDidFinishPlaying, и сразу же воспроизводится следующий звук, как только закончился предыдущий. - person Mick MacCallum; 29.08.2012