Audio Queue не воспроизводит звук

Я делаю приложение, которое использует Audio Queue. Я сделал этот код, читая и изучая книги.

Я просто хочу воспроизвести аудиофайл просто. он не показывает никаких ошибок компиляции, но это не звучит.

пожалуйста, помогите мне.

AudioQueuePayer.h

@interface AudioQueuePlayer : NSObject{
    AudioQueueRef audioQueueObject;
    AudioFileID audioFileID;
    UInt32 numPacketsToRead;
    SInt64 startingPacketCount;
    BOOL donePlayingFile;
}

@property UInt32 numPacketsToRead;
@property AudioFileID audioFileID;
@property SInt64 startingPacketCount;
@property BOOL donePlayingFile;

-(void) prepareAudioQueue;
-(void)play;

AUdioQueuePlayer.m

-(void)prepareAudioQueue{
    //open Audio File
    NSString *path = [[NSBundle mainBundle] pathForResource: @"Arles_001_44"
                                                 ofType: @"wav"];
    NSURL *fileURL = [NSURL fileURLWithPath:path];

    AudioFileOpenURL((__bridge CFURLRef)fileURL,kAudioFileReadPermission,kAudioFileWAVEType,&audioFileID);

    //get audiostreamBasicDescription
    AudioStreamBasicDescription audioFormat;
    UInt32 size = sizeof(AudioStreamBasicDescription);
    AudioFileGetProperty(audioFileID,kAudioFilePropertyDataFormat,&size,&audioFormat);

    //making audioQueue Object
    AudioQueueNewOutput(&audioFormat,outputCallback,(__bridge void *)(self),NULL,NULL,0,&audioQueueObject);

    UInt32 maxPacketSize;
    UInt32 propertySize = sizeof(maxPacketSize);
    AudioFileGetProperty(audioFileID,kAudioFilePropertyPacketSizeUpperBound,
                     &propertySize,
                     &maxPacketSize);
    printf("maxPacketSize = %d\n",maxPacketSize);
    startingPacketCount = 0;
    AudioQueueBufferRef buffers[3];
    numPacketsToRead = 1024;
    UInt32 bufferByteSize = numPacketsToRead * maxPacketSize;
    NSLog(@"bufferByteSize = %d",bufferByteSize);
    int bufferIndex;
    for (bufferIndex = 0;bufferIndex < 3 ;bufferIndex++){

    //make buffers
        AudioQueueAllocateBuffer(audioQueueObject,bufferByteSize,&buffers[bufferIndex] );
        outputCallback((__bridge void *)(self),audioQueueObject,buffers[bufferIndex]);
        if (donePlayingFile)break;
    }

}

- (id)init{
    self = [super init];
    if (self != nil){
        [self prepareAudioQueue];
    }
    return self;
}

- (void)play{
    AudioQueueStart(audioQueueObject,NULL);
    NSLog(@"play Audio Queue");
}

void outputCallback(void *inUserData,
                AudioQueueRef inAQ,
                AudioQueueBufferRef inBuffer){
    //write herelater.
}

в другом классе

AudioQueuePlayer *AQP = [AudioQueuePlayer alloc];
[AQP play];

person whitebear    schedule 18.01.2013    source источник
comment
Ваш outputCallback не реализован, но я не знаю, вы только что убрали его из своего вопроса или на самом деле еще не написали. Это должно быть функциональным для воспроизведения звука.   -  person iluvcapra    schedule 28.02.2013


Ответы (2)


что произойдет, если вы init AudioQueuePlayer вместо alloc ?

AudioQueuePlayer *AQP [[AudioQueuePlayer alloc] init];

Кроме того, большинство функций CoreAudio возвращают код ошибки OSStatus, который вы можете проверить, например:

OSStatus err;
err = AudioFileOpenURL((__bridge CFURLRef)fileURL,kAudioFileReadPermission,kAudioFileWAVEType,&audioFileID);
if (err != noErr) {
    //do something
}

Проверка ошибок может помочь в поиске того, что пошло не так.

person audionuma    schedule 20.01.2013
comment
Привет, аудионума, спасибо. Я пробовал [[AudioQueuePlayer alloc] init]; Но ничего не меняется. Затем я использую проверочный код для каждой функции. Однако ошибок не появляется..... Выглядит отлично, но нет звуков... OSStatus err; err = AudioFileOpenURL((__bridgeCFURLRref)fileURL,kAudioFileReadPermission,kAudioFileWAVEType,&audioFileID); если (ошибка != noErr) { NSLog(@error1); } err = AudioFileGetProperty~~ err = AudioFileOpenURL((~~ err = AudioQueueNewOutput(~~ err = AudioFileGetProperty(~~ err = AudioQueueAllocateBuffer~~ err = AudioQueueStart~~ - person whitebear; 21.01.2013

Возможно, вам следует сначала запустить общий аудиосеанс, как описано здесь - https://stackoverflow.com/a/44805489/57449

Да, чтобы получить звук из AudioQueue, вы также должны инициализировать AudioSession. Застрял с аналогичной проблемой, в моем случае AudioSession воспроизводил звук только после успешного использования AVCaptureSession (которое инициализирует сеанс внутри).

person IPv6    schedule 06.09.2017