Почему BytesPerFrame в буфере неожиданно огромен при подключении микрофона в AVAudioEngine - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь получить данные буфера с микрофона.

Я пытался получить доступ к BytesPerFrame из значения буфера внутри блока крана. Я попытался запустить тот же код на Xcode с Swift, и это дает нормальное значение. Это становится странным только когда я запускаю его в C # с Xamarin.iOS.

Я даже пытался инициализировать формат с AudioStreamBasicDescription с определенным BytesPerFrame = 2, но проблема та же.

Вот как это выглядит в C #:

    var engine = new AVAudioEngine();

    var format = new AVAudioFormat(
        format: AVAudioCommonFormat.PCMInt16, 
        sampleRate: 44100, 
        channels: 1, 
        interleaved: false);

    engine.InputNode.InstallTapOnBus(
        bus: 0,
        bufferSize: 4096, 
        format,
        tapBlock: (buffer, when) =>
            {
                Console.WriteLine(buffer.FrameCapacity);
                Console.WriteLine(buffer.Format.StreamDescription.BytesPerFrame);

                // other processing
            });

    engine.StartAndReturnError(out var err);

Это быстрая версия:

    let format = AVAudioFormat(commonFormat: AVAudioCommonFormat.pcmFormatInt16, sampleRate: Double(44100), channels: 1, interleaved: false)
    engine.inputNode.installTap(onBus: 0, bufferSize: 4096, format: format) { (buffer, time) -> Void in
        let bytesPerFrame = buffer.format.streamDescription.pointee.mBytesPerFrame;
        let frameCapacity = buffer.frameCapacity;
    }

    status = .Recording
    try! engine.start()

В C # я ожидал, что значение BytesPerFrame будет просто 2, но я получаю нечто странно огромное, вроде 1871587600

Это не происходит в быстром темпе.

...