Проблемы с воспроизведением файлов AAC в iOS (Objective-C) в AudioQueue

это мой первый пост здесь, я надеюсь, что вы можете помочь мне с этим. Я работаю над этим кодом, чтобы получить воспроизведение AAC на основе AudioQueue, я проверил это с форматом WAV, и он работает. Это происходит, когда я помещаю файл .CAF или .M4A, а затем запускаю метод воспроизведения, появляется эта ошибка:

ОШИБКА: >aq> 1608: сбой (-66674); остановится (66150/0 кадров)

Я искал этот код ошибки -66674 в документах поддержки Apple Dev и говорит, что у меня есть ошибка, связанная с проблемой с AudioQueuePrime или AudioQueueStart (сейчас AudioQueuePrime отсутствует в коде, но я также тестировал это). Я знаю, что можно использовать AAC с AudioQueues, и в моем случае я считаю, что это самый надежный способ точной синхронизации звуков.

- (IBAction)play:(id)sender {
    //OSStatus result;
    NSArray *audioTracks = [NSArray arrayWithObjects:
                            @"/Users/mauro_ptt/Documents/XCODE/SimpleAQPlayViewController/Sample01.caf",
                            nil];

    for (id object in audioTracks) {
    // Open the audio file from an existing NSString path
    NSURL *sndFileURL = [NSURL fileURLWithPath:object];

    AudioFileOpenURL((__bridge CFURLRef)sndFileURL, kAudioFileReadPermission, 0, &mAudioFile);

    // get audio format
    UInt32 dataFormatSize = sizeof(mDataFormat);
    AudioFileGetProperty(mAudioFile, kAudioFilePropertyDataFormat, &dataFormatSize, &mDataFormat);

    // create playback queue
    AudioQueueNewOutput(&mDataFormat, AQOutputCallback, (__bridge void *)(self), CFRunLoopGetCurrent(), kCFRunLoopCommonModes, 0, &mQueue);

    // get buffer size, number of packets to read
    UInt32 maxPacketSize;
    UInt32 propertySize = sizeof(maxPacketSize);
    // get the theoretical max packet size without scanning the entire file
    AudioFileGetProperty(mAudioFile, kAudioFilePropertyPacketSizeUpperBound, &propertySize, &maxPacketSize);
    // get sizes for up to 0.5 seconds of audio
    DeriveBufferSize(mDataFormat, maxPacketSize, 0.5, &bufferByteSize, &mNumPacketsToRead);

    // allocate packet descriptions array
    bool isFormatVBR = (mDataFormat.mBytesPerPacket == 0 || mDataFormat.mFramesPerPacket == 0);
    if (isFormatVBR) {
        mPacketsDescs = (AudioStreamPacketDescription*) malloc(mNumPacketsToRead * sizeof(AudioStreamPacketDescription));
    } else {
        mPacketsDescs = NULL;
    }

    // Get magic cookie (COMPRESSED AAC)
    UInt32 cookieSize = sizeof(UInt32);
    OSStatus couldNotGetProperty = AudioFileGetPropertyInfo(mAudioFile, kAudioFilePropertyMagicCookieData, &cookieSize, NULL);
    if ((couldNotGetProperty == noErr) && cookieSize) {
        char *magicCookie = (char *) malloc(cookieSize);
        AudioFileGetProperty(mAudioFile, kAudioFilePropertyMagicCookieData, &cookieSize, magicCookie);
        AudioQueueSetProperty(mQueue, kAudioQueueProperty_MagicCookie, magicCookie, cookieSize);
        free(magicCookie);
    }

    // Allocate and prime audio queue buffers
    mCurrentPacket = 0;
    for (int i=0; i < kNumberBuffers; ++i) {
        AudioQueueAllocateBuffer(mQueue, bufferByteSize, &mBuffers[i]);
        AQOutputCallback((__bridge void *)(self), mQueue, mBuffers[i]);
    }
        mIsRunning = true;
    AudioQueueStart(mQueue, NULL);

    }
}

Заранее спасибо!


person Mauro José Vigliotti    schedule 23.02.2014    source источник
comment
Как вы реализовали AQOutputCallback?   -  person cahn    schedule 05.03.2014
comment
Я только что решил это. Это была проблема с AQOutputCallback, помещающим объект вместо структуры, спасибо!   -  person Mauro José Vigliotti    schedule 05.03.2014


Ответы (2)


Была проблема с AQOutputCallback, нужно быть осторожным при размещении правильных типов для каждого аргумента функции.

person Mauro José Vigliotti    schedule 05.03.2014
comment
Я разрабатываю приложение для удаленного рабочего стола, рендеринг видео и аудио и отправку данных отдельно, пытаясь синхронизировать с помощью Audio Queue Services, тоже добился результата, но это дало сбои в звуке, использовал AudioQueueReset для синхронизации звука с видео, но получил сбои. Любая помощь будет принята с благодарностью! - person Bhuvanendra Pratap Maurya; 04.09.2019

У меня была похожая проблема месяц назад, и я не мог понять. Так закончилось использование .wav. Размер был больше, но, к счастью, мне пришлось воспроизвести только 5 файлов.

person matiasrengel    schedule 23.02.2014