Java Android中通过HTTP/2发布流媒体音频

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{

一些背景:

我正在尝试在android应用程序上开发一个与语音相关的功能,用户可以使用语音进行搜索,服务器在用户说话时发送中间结果(这反过来会更新用户界面),并在查询完成时发送最终结果。因为服务器只接受HTTP/2单套接字连接和Android HTTPUrlConnection HTTP/2,所以我使用的是改进型2

我已经看过了,但是每个例子都有固定长度的数据,或者大小可以事先确定。。。这不是音频搜索的情况

以下是我的POST方法:

  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());
  }
}