使用 EZOutput 时获取机械音和斩波音频

问题描述 投票:0回答:1

我正在使用 EZAudio 中的 EZOutput 来输出从音频流 (self.myAudioBufferList) 接收到的声音。想想现场聆听。我还有音频基本描述(self.asbd!)。然而,当我设置 EZOutput 数据源的 shouldFill 方法时,我得到了一个机器人版本的声音,其中一些声音被切断了。

func output(_ output: EZOutput!, shouldFill audioBufferList: UnsafeMutablePointer<AudioBufferList>!, withNumberOfFrames frames: UInt32, timestamp: UnsafePointer<AudioTimeStamp>!) -> OSStatus {
    
    if self.asbd != nil {
        output.inputFormat = self.asbd!
    }
    
    if self.audioBufferList != nil {
        audioBufferList.pointee.mNumberBuffers = self.myAudioBufferList!.mNumberBuffers
        audioBufferList.pointee.mBuffers.mNumberChannels = self.myAudioBufferList!.mBuffers.mNumberChannels
        audioBufferList.pointee.mBuffers.mData = self.myAudioBufferList!.mBuffers.mData
    } else {
        print("it is nil, and that is why it is making low noise")
        audioBufferList.pointee.mBuffers.mData = nil
    }
    
    return noErr;
}

此外,当设置audioBufferList mDataByteSize时,质量会变差。在当前配置中,dataByteSize 为 4096,而 myAudioBufferList 不是恒定的并且会波动,永远不会超过 512。

audioBufferList.pointee.mBuffers.mDataByteSize = self.myAudioBufferList!.mBuffers.mDataByteSize

数据源方法给出的帧值为 1024。

注意:我还尝试在创建 EZOutput 实例时提供 inputFormat,但这对改善声音没有任何帮助

// Assign a delegate and datasource to the shared instance of the output to provide the output audio data
self.ezOutput = EZOutput.init(dataSource: self, inputFormat: asbd)
self.ezOutput?.delegate = self
ios swift audio audio-streaming ezaudio
1个回答
0
投票

我对 EZAudio 不是特别熟悉,但回调似乎要求特定数量的帧,而您似乎忽略了这一点。如果它要求 1024 帧,您必须在返回之前精确填充 1024 帧(除非您位于数据末尾,在这种情况下您需要填充并发布 EZAudioPlayerDidReachEndOfFileNotification)。如果您没有 1024 帧,那么您要么需要阻塞,直到达到为止,发出欠载信号(不确定 EZAudio 如何做到这一点),或者制造“适当的”数据来填充(例如,丢包隐藏)。如果您以不规则大小的块获取数据,那么您可能需要缓冲一点。

“机器人”或其他类型的噪声通常是由于波形不匹配造成的。 (这会转化为高频噪声。)在此代码中,这可能是由于丢失了良好的数据或由于为丢失的数据插入了零。

© www.soinside.com 2019 - 2024. All rights reserved.