我正在尝试使用OkHttp发送音频流,下面是这里的示例,但问题是,如果我使用管道,我无法控制字节如何发送到服务器,这会导致音频中断,因为服务器对字节流很敏感。
通过监听端口,我发现使用Pipe发送了错误的区块大小预期:
4,626中,4.1255,4.1091,
现实:1460中,1460中,1460中,2109中,1460
有没有一种方法可以操作如何使用PipeBody
发送数据?尝试在sink.write(data)
之间添加Thread.sleep
和flush()
,但没有看到任何更改。
您需要更频繁地刷新接受管道数据并在HTTP请求中发送数据的代码。
替换此:
@Override public void writeTo(BufferedSink sink) throws IOException {
sink.writeAll(pipe.source());
}
有了这个:
@Override public void writeTo(BufferedSink sink) throws IOException {
sink.writeAllFrequentFlush(pipe.source());
}
然后编写一个函数,对每个机会进行刷新。这个是从Okio writeAll函数派生而来的。
fun BufferedSink.writeAllFrequentFlush(source: Source): Long {
var totalBytesRead = 0L
while (true) {
val readCount: Long = source.read(buffer, 8192L)
if (readCount == -1L) break
totalBytesRead += readCount
emit()
}
return totalBytesRead
}