当前位置: 首页 > 面试题库 >

在Android中通过HTTP / 2进行POST流音频

姜博
2023-03-14
问题内容

一些背景:

我正在尝试在android应用程序上开发与语音相关的功能,用户可以在其中使用语音进行搜索,并且服务器在用户讲话时会发送中间结果(依次更新UI),并在查询完成后发送最终结果。由于服务器仅接受HTTP
/ 2单套接字连接,而Android HTTPUrlConnection
尚不支持
HTTP / 2,因此我正在使用Retrofit2。

我已经看过了这个,这个和这个,但是每个示例都有固定长度的数据,或者可以事先确定大小……对于音频搜索而言,情况并非如此。

这是我的POST方法:

  public interface Service{
    @Streaming
    @Multipart
    @POST("/api/1.0/voice/audio")
    Call<ResponseBody> post(
            @Part("configuration") RequestBody configuration,
            @Part ("audio") RequestBody audio);
}

该方法以以下方式发送配置文件(包含音频参数-JSON结构)和流音频。(预期的POST请求)

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--

不太确定如何发送流(!!)<audio_data>。我尝试使用Okio以这种方式为音频创建多部分(来自:https : //github.com/square/okhttp/wiki/Recipes#post-
streaming)

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

这当然没有用。这是继续将音频样本写入ResponseBody的正确方法吗?我到底应该在哪里调用Service.post(config, audio)method,这样我就不会在音频缓冲区中每次有东西时都不会发布配置文件。

另外,由于我必须继续发送流音频,因此如何保持相同的POST连接打开,直到用户停止讲话后才关闭它?

我基本上是OkHttp和Okio的新手。如果我错过了任何内容或部分代码不清楚,请让我知道,我将上传该代码段。谢谢。


问题答案:

您也许可以使用Pipe从音频线程中产生数据并将其消耗到网络线程中。

通过新创建的OkHttp配方:

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

如果您的数据可以连续写入,则此方法最有效。如果不能,那么最好用a BlockingQueue<byte[]>或类似的方法做些类似的事情。



 类似资料:
  • 它不是重复的。所提供的链接是旧的。“HTTP客户端”已在api23中删除 我想发送json对象: 到URL: http://10digimr.mobimedia.in/api/mobile_retailer/update_profile怎么做?通过post方法? 回应:

  • 问题内容: 我想在Java中使用JSON进行简单的HTTP POST。 假设网址是 并采用标记为例如的值。 我将如何为POST创建语法? 我似乎也无法在JSON Javadocs中找到POST方法。 问题答案: 这是你需要做的: 获取Apache HttpClient,这将使你能够发出所需的请求 使用它创建一个HttpPost请求,并添加标题“ application / x-www-form-u

  • 我想创建一个能够接收音频流的Android应用程序。我曾想过使用A2DP配置文件,但似乎Android不支持A2DP接收器。看起来有很多人在寻找这个问题的解决方案。但是,如果接收一个普通的位流,然后在应用程序中将数据转换成音频呢?我想通过RFCOMM(SPP蓝牙模式)接收PCM或Mp3数据流,然后使用AudioTrack播放。 首先,我如何通过RFCOMM在我的Android手机上接收比特流?是否

  • 问题内容: 通过AJAX从标准HTTP页面调用HTTPS页面(例如信用卡授权服务,例如WorldPay)是否会有问题? 我无法想象为什么会有问题,响应将是HTML页面,然后我可以将其嵌入结果窗格或类似的页面? 问题答案: 是的,这将是跨域发布,并且将被浏览器阻止。

  • 问题内容: 我想使用将文件(特别是图像)上传到REST Server 。我已经导入/添加了构建路径和。而且我在堆栈跟踪中收到以下错误。 这有效吗? HTTP POST代码 堆栈跟踪 问题答案: 您似乎缺少依赖项。 我有,,并用和在我的类路径罐子。 我也使用而不是使用header属性。 查看Internet媒体类型以了解更多详细信息

  • 我不熟悉编程和Android,这是我第一次尝试编程一个应用程序,但我已经无法登录了。登录必须与服务器连接,在get请求的帮助下,我将获得json数据,我可以使用它来验证登录数据(用户名)。允许使用该应用程序的人员已在数据库中。这应该很简单。在这个论坛中,我只能找到使用等的解决方案,但仅使用已不再有效。我使用了LoginActivity模板 这是我的代码(我也没有使用JSON数据的经验)。这是我们的