Java Android中通过HTTP/2发布流媒体音频
一些背景: 我正在尝试在android应用程序上开发一个与语音相关的功能,用户可以使用语音进行搜索,服务器在用户说话时发送中间结果(这反过来会更新用户界面),并在查询完成时发送最终结果。因为服务器只接受HTTP/2单套接字连接和Android HTTPUrlConnection HTTP/2,所以我使用的是改进型2 我已经看过了,但是每个例子都有固定长度的数据,或者大小可以事先确定。。。这不是音频搜索的情况 以下是我的POST方法:Java Android中通过HTTP/2发布流媒体音频,java,android,retrofit2,audio-streaming,okhttp,Java,Android,Retrofit2,Audio Streaming,Okhttp,一些背景: 我正在尝试在android应用程序上开发一个与语音相关的功能,用户可以使用语音进行搜索,服务器在用户说话时发送中间结果(这反过来会更新用户界面),并在查询完成时发送最终结果。因为服务器只接受HTTP/2单套接字连接和Android HTTPUrlConnection HTTP/2,所以我使用的是改进型2 我已经看过了,但是每个例子都有固定长度的数据,或者大小可以事先确定。。。这不是音频搜索的情况 以下是我的POST方法: public interface Service{
public interface Service{
@Streaming
@Multipart
@POST("/api/1.0/voice/audio")
Call<ResponseBody> post(
@Part("configuration") RequestBody configuration,
@Part ("audio") RequestBody audio);
}
这当然行不通。这是继续向ResponseBook写入音频样本的正确方法吗?我到底应该在哪里调用Service.post(config,audio)
方法,这样我就不会每次音频缓冲区中有内容时都发布配置文件
此外,由于我必须继续发送流式音频,我如何才能保持相同的POST连接打开,而在用户停止讲话之前不关闭它
我基本上不熟悉OkHttp和Okio。如果我错过了任何东西或部分代码不清楚,请让我知道,我会上传该片段。谢谢。您可以使用音频线程生成数据,并在网络线程上使用 从a:
如果您的数据可以作为连续流写入,那么这种方法将最有效。如果不能,你最好用
阻塞队列
或类似的方法来做类似的事情。那么基本上用生产者-消费者的方式来解决它?可以用okio完成吗?如何仅使用一篇文章就将音频数据附加到@Part(“audio”)RequestBody audio
?管道类应该会有所帮助。运行示例以查看控制流的外观。与管道存在同步问题。目前,它正在使用BlockingQueue。
Content-Type = multipart/form-data;boundary=----------------------------41464684449247792368259
//HEADERS
----------------------------414646844492477923682591
Content-Type: application/json; charset=utf-8
Content-Disposition: form-data; name="configuration"
//JSON data structure with different audio parameters.
----------------------------414646844492477923682591
Content-Type: audio/wav; charset=utf-8
Content-Disposition: form-data; name="audio"
<audio_data>
----------------------------414646844492477923682591--
public RequestBody createPartForAudio(final byte[] samples){
RequestBody requestBody = new RequestBody() {
@Override
public MediaType contentType() {
return MediaType.parse("audio/wav; charset=utf-8");
}
@Override
public void writeTo(BufferedSink sink) throws IOException {
//Source source = null;
sink.write(samples);
}
};
return requestBody;
}
/**
* This request body makes it possible for another
* thread to stream data to the uploading request.
* This is potentially useful for posting live event
* streams like video capture. Callers should write
* to {@code sink()} and close it to complete the post.
*/
static final class PipeBody extends RequestBody {
private final Pipe pipe = new Pipe(8192);
private final BufferedSink sink = Okio.buffer(pipe.sink());
public BufferedSink sink() {
return sink;
}
@Override public MediaType contentType() {
...
}
@Override public void writeTo(BufferedSink sink) throws IOException {
sink.writeAll(pipe.source());
}
}