Запись стерео с цифрового линейного входа

Я пытаюсь получить стереосэмплы из цифровой линии на iPhone/iPad. Чтобы получить линейный стереовход, я использую микрофон Mickey Blue «Addon» для iOS.

См. это.

Я использую пример Aruts iOS CoreAudio из здесь.

Это прекрасно работает для получения семплов в моно из линейного входа, но я не могу понять правильную настройку для стерео.

Если есть кто-нибудь, кто может указать мне в правильном направлении, это было бы очень полезно. Мне нужны образцы непосредственно для их обработки в первую очередь, поэтому сначала запись в файл невозможна.


person Dirk de Boer    schedule 22.05.2014    source источник


Ответы (2)


Я думаю, вы могли бы использовать AVAudioRecorder следующим образом:

AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
[session setActive:YES error:nil];

NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc] init];
[recordSetting setValue:[NSNumber numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey];
[recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey];
//this should enable stereo
[recordSetting setValue:[NSNumber numberWithInt: 2] forKey:AVNumberOfChannelsKey];

AVAudioRecorder *recorder = [[AVAudioRecorder alloc] initWithURL:outputFileURL settings:recordSetting error:NULL];
recorder.delegate = self;
[recorder prepareToRecord];
[recorder record];
person robert    schedule 22.05.2014
comment
о, начиная с iOS7, вы можете установить предпочитаемыйInputNumberOfChannels в AVAudioSession. См. developer.apple.com/library/ios /документация/AVFoundation/ - person robert; 22.05.2014
comment
Спасибо за ваше решение, но, насколько я понимаю, AVAudioRecorder может записывать только в файл, как в вашем примере. Мне нужны образцы напрямую и в сыром виде, чтобы обработать их в первую очередь. - person Dirk de Boer; 22.05.2014

Нашел решение:

AudioStreamBasicDescription каким-то образом будет принимать только 32 бита на канал в стереорежиме. Использование приведенного ниже кода позволяет получить семплы в стерео (в настоящее время только с использованием дополнительного оборудования)

Вот аудиоформат, который я использовал, чтобы заставить его работать:

AudioStreamBasicDescription stereoStreamFormat;
stereoStreamFormat.mSampleRate          = 44100.00;
stereoStreamFormat.mFormatID            = kAudioFormatLinearPCM;
stereoStreamFormat.mFormatFlags         = kAudioFormatFlagsAudioUnitCanonical;
stereoStreamFormat.mBytesPerPacket      = 4;
stereoStreamFormat.mBytesPerFrame       = 4;
stereoStreamFormat.mFramesPerPacket     = 1;
stereoStreamFormat.mChannelsPerFrame    = 2;
stereoStreamFormat.mBitsPerChannel      = 32;

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

struct AudioBufferListStereo
{
    UInt32      mNumberBuffers;
    AudioBuffer mBuffers[2]; //<-- this array has been set hardcoded to 2 channels because the standard iOS version did not work as expected.
#if defined(__cplusplus) && CA_STRICT
public:
    AudioBufferListStereo() {}
private:
    //  Copying and assigning a variable length struct is problematic so turn their use into a
    //  compile time error for eacy spotting.
    AudioBufferListStereo(const AudioBufferListStereo&);
    AudioBufferListStereo&    operator=(const AudioBufferListStereo&);
#endif

};
typedef struct AudioBufferListStereo  AudioBufferListStereo;

Полный исходный код довольно длинный, поэтому я опубликую его на GitHub, если он кому-то понадобится.

person Dirk de Boer    schedule 22.05.2014