Аудио-очередь - Записывающий к сжатому формату аудио.
Q: Мой код записи Аудио-очереди основывается на выборке SpeakHere, и я хотел бы записать использование сжатого формата аудио вместо линейного PCM, как я могу сделать это?
A: Мой код записи Аудио-очереди основывается на выборке SpeakHere, и я хотел бы записать использование сжатого формата аудио вместо линейного PCM, как я могу сделать это?
Поддержки iPhone OS, записывающие .caf файл с помощью многих различных сжатых форматов аудиокодирования:
Apple Lossless -
kAudioFormatAppleLosslessiLBC (интернет-Низкоскоростной кодек) -
kAudioFormatiLBCIMA/ADPCM (иначе IMA4) -
kAudioFormatAppleIMA4µLaw -
kAudioFormatULawaLaw -
kAudioFormatALaw
Используя службы 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 разрешение его записать сжатое аудио. |