Технические вопросы и ответы QA1615

Аудио-очередь - Записывающий к сжатому формату аудио.

Q: Мой код записи Аудио-очереди основывается на выборке SpeakHere, и я хотел бы записать использование сжатого формата аудио вместо линейного PCM, как я могу сделать это?

A: Мой код записи Аудио-очереди основывается на выборке SpeakHere, и я хотел бы записать использование сжатого формата аудио вместо линейного PCM, как я могу сделать это?

Поддержки iPhone OS, записывающие .caf файл с помощью многих различных сжатых форматов аудиокодирования:

Используя службы Audio Queue для записи аудио в одном из поддерживаемых сжатых форматов требует установки AudioStreamBasicDescription структура (также названный ASBD), который описывает формат. Вы тогда передаете это описание AudioQueueNewInput функция. Необходимо обеспечить допустимую частоту дискретизации, идентификатор формата и число каналов в структуре ASBD.

Например, перечисление 1 от выборки SpeakHere демонстрирует, как измениться AudioStreamBasicDescription структура для различного формата записи. По умолчанию kAudioFormatLinearPCM используется, но это может легко быть изменено на kAudioFormatAppleIMA4 или любой другой формат из списка опций.

Перечисление 1  SpeakHere - initWithURL: в AudioRecorder.m

- (id) initWithURL: fileURL {
    NSLog (@"initializing a recorder object.");
    self = [super init];

    if (self != nil) {

        // Specify the recording format. Options are:
        //
        //      kAudioFormatLinearPCM
        //      kAudioFormatAppleLossless
        //      kAudioFormatAppleIMA4
        //      kAudioFormatiLBC
        //      kAudioFormatULaw
        //      kAudioFormatALaw
        //
        // When targeting the Simulator, SpeakHere uses linear PCM regardless of the format
        //  specified here. See the setupAudioFormat: method in this file.
        [self setupAudioFormat: kAudioFormatLinearPCM];

        OSStatus result =   AudioQueueNewInput (
                                &audioFormat,
                                recordingCallback,
                                self,                   // userData
                                NULL,                   // run loop
                                NULL,                   // run loop mode
                                0,                      // flags
                                &queueObject
                            );

        NSLog (@"Attempted to create new recording audio queue object. Result: %f", result);

        // get the recording format back from the audio queue's audio converter --
        //  the file may require a more specific stream description than was 
        //  necessary to create the encoder.
        UInt32 sizeOfRecordingFormatASBDStruct = sizeof (audioFormat);

        AudioQueueGetProperty (
            queueObject,
            kAudioQueueProperty_StreamDescription,  // this constant is only available in iPhone OS
            &audioFormat,
            &sizeOfRecordingFormatASBDStruct
        );

        ...
    }

    return self;
} 

// Configures the audio data format for recording
- (void) setupAudioFormat: (UInt32) formatID {

    // Obtains the hardware sample rate for use in the recording
    // audio format. Each time the audio route changes, the sample rate
    // needs to get updated.
    UInt32 propertySize = sizeof (self.hardwareSampleRate);

    AudioSessionGetProperty (
        kAudioSessionProperty_CurrentHardwareSampleRate,
        &propertySize,
        &hardwareSampleRate
    );

// When running in the Simulator, the kAudioSessionProperty_CurrentHardwareSampleRate
//  property is not available, so set it manually.
#if TARGET_IPHONE_SIMULATOR
        audioFormat.mSampleRate = 44100.0;
#warning *** Simulator mode: using 44.1 kHz sample rate.
#else
        audioFormat.mSampleRate = self.hardwareSampleRate;
#endif

    NSLog (@"Hardware sample rate = %f", self.audioFormat.mSampleRate);

    audioFormat.mFormatID           = formatID;
    audioFormat.mChannelsPerFrame   = 1;

    if (formatID == kAudioFormatLinearPCM) {

        audioFormat.mFormatFlags        = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
        audioFormat.mFramesPerPacket    = 1;
        audioFormat.mBitsPerChannel     = 16;
        audioFormat.mBytesPerPacket     = 2;
        audioFormat.mBytesPerFrame      = 2;
    }
}

Ссылки:



История версии документа


ДатаПримечания
21.05.2009

Обновленный к ссылочному SpeakHere v2.0

27.01.2009

Обновленный URLs

24.09.2008

Новый документ, описывающий, как изменить выборку SpeakHere iPhone разрешение его записать сжатое аудио.