Были проблемы с синхронизацией с 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. Если я что-то пропустил или часть кода не ясна, пожалуйста, дайте мне знать, и я загрузлю этот фрагмент. Спасибо.