我正在编写一些代码来将音频流传输到服务器,它运行得很好,除了我似乎总是丢失前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之前检查委托是否套接字打开,但没有帮助。我将录制的音频的副本写入一个文件,并确认录制的所有音频都在那里,所以需要在第一个数据包中执行一些操作。如有任何建议,我们将不胜感激。
谢谢
1条答案
按热度按时间ippsafx71#
我最后在audioQueueInputCallback中添加了代码来检查WebSocket状态,如果websocket没有打开,我就获取缓冲区并将其附加到NSMutableData变量,然后将缓冲区放回队列中。
我一直追加到变量,直到套接字被打开。当WebSocket打开,我发送NSMutableData变量,而不是在回调中发送的缓冲区,然后清除变量,以防再次需要它。我还检查了WS在接收到x个缓冲区后是否未打开,以停止记录并提醒用户,这样他们就不会在发生任何错误时走得太远。