xcode 尝试通过WebSocket流式传输AudioQueueNewInput中录制的音频时丢失第一个缓冲区

mxg2im7a  于 2023-01-14  发布在  其他
关注(0)|答案(1)|浏览(132)

我正在编写一些代码来将音频流传输到服务器,它运行得很好,除了我似乎总是丢失前500 ms的音频。我的假设是,当第一个缓冲区被发送时,WebSocket仍然打开,然后当下一个缓冲区满了并运行回调时,套接字打开。当用户单击record键时,websocket打开如下:

func startRecording() {
        if !connected{
            connect()
            print("Websocket state is: \(webSocketTask?.state.rawValue)")
                startStreaming()
        }
    }

我认为问题就在这里,在startStreaming函数中;

liveRecorder.delegate?.readyRecordingData(audio: audioData)
            liveRecorder.currentPacket = liveRecorder.currentPacket + Int64(inNumPackets)

第一次调用readyRecordingData并传递audioData时,套接字打开,但我们尚未收到服务器准备好接收通过WebSocket传入的数据的确认。
在readyRecordingData中,我们执行基本检查以确保可以发送audioData:

if (!recordingStarted || !connected){  //connected is set to true when we get ready confirmation from server
 return //since we can't send the data
}
//Send the data here

在第一次回调时,我们总是连接!。之后一切正常。我试图找出第一个数据包是否基本丢失,因为我们在这里增加了数据包liveRecorder.currentPacket = liveRecorder.currentPacket + Int64(inNumPackets),而不是让它排队并在就绪时发送。我尝试使用DispatchQueue.main.asyncAfter在套接字未打开时添加延迟,但没有修复它。我尝试在发送到readyRecordingData之前检查委托是否套接字打开,但没有帮助。我将录制的音频的副本写入一个文件,并确认录制的所有音频都在那里,所以需要在第一个数据包中执行一些操作。如有任何建议,我们将不胜感激。
谢谢

ippsafx7

ippsafx71#

我最后在audioQueueInputCallback中添加了代码来检查WebSocket状态,如果websocket没有打开,我就获取缓冲区并将其附加到NSMutableData变量,然后将缓冲区放回队列中。

audRecorder.audioBufferCallbacks += 1
            audRecorder.bufferQueue.append(audioData as Data) //NSMutableData
            audRecorder.currentPacket = audRecorder.currentPacket + Int64(inNumPackets)

我一直追加到变量,直到套接字被打开。当WebSocket打开,我发送NSMutableData变量,而不是在回调中发送的缓冲区,然后清除变量,以防再次需要它。我还检查了WS在接收到x个缓冲区后是否未打开,以停止记录并提醒用户,这样他们就不会在发生任何错误时走得太远。

相关问题