使用nginx-http-flv转RTSP至flv/rtmp
背景:项目需要对接摄像头,使用hls延迟高,使用java代码转hls画面会卡顿,找了很多方案,决定使用nginx-http-flv方式解决。
java代码转FLV参考地址:https://gitee.com/giteeClass/rtsp-converter-flv-spring-boot-starter
windows版本nginx-http-flv下载地址:https://download.csdn.net/download/qq_36776720/88476403
linux环境比较简单,可参考:https://gitee.com/winshining/nginx-http-flv-module,具体的nginx配置也可参考当前地址中的文档
public static void main( String[] args ) throws Exception {
String sourceRtspUrl = "rtsp://xxxx";
// 1985是rtmp->serve->port;video是nginx.conf中rtmp->serve->application video{live on; gop_cache on;} 中的名字,stream是发布的流的名称
String destRtmp = "rtmp://127.0.0.1:1985/video/stream";
/**
* 相当于CMD命令,
* ffmpeg -re -rtsp_transport tcp -i <sourceRtspUrl> -vcodec h264 -acodec aac -f flv <destRtmp>
*/
ProcessBuilder pb = new ProcessBuilder("ffmpeg",
"-re",
"-rtsp_transport",
"tcp",
"-i",
sourceRtspUrl,
"-f",
"flv",
"-vcodec",
"h264",
"-acodec",
"aac",
destRtmp
);
Process process = pb.inheritIO().start();
boolean exit = false;
while (true) {
// debugger时修改exit为true,退出转换
if (exit) {
process.destroy();
break;
} else {
TimeUnit.SECONDS.sleep(10);
}
}
}
生成的FLV流地址示例:
假设在 http 配置块中的 listen 配置项是:
http {
...
server {
listen 80;
...
location /live {
flv_live on;
}
}
}
在 rtmp 配置块中的 listen 配置项是:
rtmp {
...
server {
listen 1985; #不是默认的 1935 端口
...
application video {
live on;
}
}
}
并且发布的流的名称是 stream,那么基于 HTTP 的播放 url 是:
http://127.0.0.1:80/live?port=1985&app=video&stream=stream
RTMP 方式
rtmp://127.0.0.1:80/video/stream