Мы подумали о следующем процессе:
мобильное приложение -> /api/realtime/camera -> запускает процесс FFMPEG, который подключается к URL-адресу RTSP -> записывает входной поток процесса в ответ API с помощью webflux.
Это фрагмент кода:
Код: Выделить всё
----------- process init -----------------------------
ProcessBuilder ffmpegBuilder = new ProcessBuilder(
"ffmpeg",
"-rtsp_transport", "tcp",
"-i", rtspConnection,
"-c:v", "libx264",
"-preset", "ultrafast",
"-tune", "zerolatency",
"-b:v", "2000k",
"-an",
"-f", "mp4",
"-movflags", "frag_keyframe+empty_moov+default_base_moof",
"pipe:1");
------------- process read & push to spring reactive Sink ------------------
try (var inputStream = ffmpegProcess.getInputStream()) {
byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
DataBuffer dataBuffer = new DefaultDataBufferFactory().wrap(copyOf(buffer, bytesRead));
sink.emitNext(dataBuffer, Sinks.EmitFailureHandler.FAIL_FAST);
}
} catch (Exception e) {
sink.emitError(e, Sinks.EmitFailureHandler.FAIL_FAST);
} finally {
this.dispose();
}
----------------- API that will eventually transform previous sink as flux -----------
@GetMapping(value = "/{deviceId}/camera", produces = "video/mp4")
public Flux streamCamera(@PathVariable Long deviceId) {
// return previous sink as flux
}
Правильно ли использовать такую функцию? Или мобильное приложение должно подключаться напрямую к URL-адресу RTSP?
Подробнее здесь: https://stackoverflow.com/questions/798 ... ng-backend
Мобильная версия