Audiotoolbox API AudioConvertNewSpecific возвращает неправильный размер выходного пакета при преобразовании в G711u вместо AAC в Objective C

#objective-c #audiotoolbox

#objective-c #audiotoolbox

Вопрос:

Я пытаюсь преобразовать необработанные буферы PCM в кодек G711u в IOS с помощью Audio Toolbox. Я вижу много примеров кода, работающих для кодека AAC с использованием того же кода и API.Но когда я пытаюсь сделать это для PCMU, он не работает. AudioConverter настроен без ошибок, но когда я пытаюсь запросить размер выходного пакета в AudioConverterGetProperty, он возвращает значение 2, что мне кажется неправильным, потому что, когда я использую тот же код для кодека AAC, он возвращает размер выходного пакета 600. Ниже я вставляю свой код и заранее благодарю за помощь в этом.

===== Исходный код ===========

 OSStatus result = 0;
    AudioStreamBasicDescription in = {0}, out = {0};

    in.mSampleRate = frequencyInHz;
    in.mChannelsPerFrame = channelCount;
    in.mBitsPerChannel = 16;
    in.mFormatFlags =  kAudioFormatFlagIsSignedInteger | kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked;
    in.mFormatID = kAudioFormatLinearPCM;
    in.mFramesPerPacket = 1;
    in.mBytesPerFrame = in.mBitsPerChannel * in.mChannelsPerFrame / 8;
    in.mBytesPerPacket = in.mFramesPerPacket*in.mBytesPerFrame;

    m_in = in;

    out.mFormatID = kAudioFormatULaw;
    out.mFormatFlags = 0;
    out.mFramesPerPacket = kSamplesPerFrame;
    out.mSampleRate = frequencyInHz;
    out.mChannelsPerFrame = channelCount;

    m_out = out;

    UInt32 outputBitrate = bitrate;
    UInt32 propSize = sizeof(outputBitrate);
    UInt32 outputPacketSize = 1024;

    const OSType subtype = kAudioFormatULaw;
    AudioClassDescription requestedCodecs[2] = {
        {
            kAudioEncoderComponentType,
            subtype,
            kAppleSoftwareAudioCodecManufacturer
        },
        {
            kAudioEncoderComponentType,
            subtype,
            kAppleHardwareAudioCodecManufacturer
        }
    };

    result = AudioConverterNewSpecific(amp;in, amp;out, 2, requestedCodecs, amp;m_audioConverter);
    if(result !=0) {
        DLog("Error AudioConverterNewSpecific %x n", (int)result);

    }

    result = AudioConverterSetProperty(m_audioConverter, kAudioConverterEncodeBitRate, propSize, amp;outputBitrate);
    if(result !=0) {
        DLog("Error AudioConverterSetProperty %x n", (int)result);
     }

    result = AudioConverterGetProperty(m_audioConverter, kAudioConverterPropertyMaximumOutputPacketSize, amp;propSize, amp;outputPacketSize);
    if(result !=0) {
        DLog("Error AudioConverterGetProperty %x n", (int)result);

    }
    DLog("The output packet size is %x n", (int)outputPacketSize);
  

====== Вывод============

Ошибка AudioConverterSetProperty 70726f70

Размер выходного пакета равен 2

Проблема в том, что размер выходного пакета возвращается к 2, и когда я пытаюсь использовать кодировщик, он выдает мне вывод в 2 байта для каждого вызова. Я думаю, что мы не получаем правильный размер выходного пакета. Как это исправить?

Комментарии:

1. Кто-нибудь использовал AudioToolbox AudioConverterNewSpecific API для преобразования необработанных кадров PCM в кодек PMCU / PCMA. Я хочу добиться того же с помощью приведенного выше кода, поскольку до сих пор на него нет ответа, поэтому меня смущает, нахожусь ли я на правильном пути или нет.