Были проблемы с синхронизацией с Pipe. На данный момент он работает с BlockingQueue <byte []>.

го предыстории:

Я пытаюсь разработать голосовую функцию в приложении для Android, где пользователь может выполнять поиск с помощью голоса, а сервер отправляет промежуточные результаты во время разговора пользователя (который, в свою очередь, обновляет пользовательский интерфейс) и конечный результат после завершения запроса. Так как сервер принимает только соединение 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) метод, чтобы я не заканчивал публиковать файл конфигурации каждый раз, когда в аудио-буфере что-то есть.

Кроме того, так как я должен продолжать отправлять потоковое аудио, как я могу оставить то же самое соединение POST открытым и не закрывать его, пока пользователь не перестанет говорить?

Я в основном новичок в OkHttp и Okio. Если я что-то пропустил или часть кода не ясна, пожалуйста, дайте мне знать, и я загрузлю этот фрагмент. Спасибо.

Ответы на вопрос(1)

Ваш ответ на вопрос