Как конвертировать PCM в необработанный формат G711 µlaw

Я пытаюсь использовать PCM (микрофонный вход)->G711, и у меня возникают проблемы с его работой.

В текущей реализации само преобразование проходит успешно, но в буфере как будто нет данных.

Я провел много исследований, но я не могу найти причину проблемы, поэтому я был бы признателен за ваш совет.

      
var audioEngine = AVAudioEngine()

var convertFormatBasicDescription = AudioStreamBasicDescription(
    mSampleRate: 8000,
    mFormatID: kAudioFormatULaw,
    mFormatFlags: AudioFormatFlags(kAudioFormatULaw),
    mBytesPerPacket: 1,
    mFramesPerPacket: 1,
    mBytesPerFrame: 1,
    mChannelsPerFrame: 1,
    mBitsPerChannel: 8,
    mReserved: 0
)

func convert () {
    let inputNode = audioEngine.inputNode
    let micInputFormat = AVAudioFormat(commonFormat: .pcmFormatFloat32, sampleRate: 44100, channels: 1, interleaved: true)!    
    let convertFormat = AVAudioFormat(streamDescription: &convertFormatBasicDescription)!
    let converter = AVAudioConverter(from: micInputFormat, to: convertFormat)!
    
    inputNode.installTap(onBus: 0, bufferSize: 1024, format: micInputFormat) { [weak self] (buffer, time) in
        
        var newBufferAvailable = true

        let inputCallback: AVAudioConverterInputBlock = { inNumPackets, outStatus in
            if newBufferAvailable {
                outStatus.pointee = .haveData
                newBufferAvailable = false
                return buffer
            } else {
                outStatus.pointee = .noDataNow
                return nil
            }
        }

        let convertedBuffer = AVAudioPCMBuffer(pcmFormat: convertFormat, frameCapacity: AVAudioFrameCount(convertFormat.sampleRate) * buffer.frameLength / AVAudioFrameCount(buffer.format.sampleRate))!
        convertedBuffer.frameLength = convertedBuffer.frameCapacity
        
        var error: NSError?
        let status = converter.convert(to: convertedBuffer, error: &error, withInputFrom: inputCallback)

        print(convertedBuffer.floatChannelData) <- nil
    }

    audioEngine.prepare()
    try audioEngine.start()
}

Спасибо.

1 ответ

Это былоaudioBufferList.pointee.mBuffers.mData, нетfloatChannelData, который был необходим для преобразования данных в G711.

Другие вопросы по тегам