目录
1.获取RTSP地址
2.搭建流媒体服务器
2.1下载资源
下载nginx
下载rtmp组件
启动nginx
测试工具(由于java代码调试问题,所以这里先下载一个转码推流的工具,其中javacv的原理也是它)可忽略
下载VLC(测试视频是否成功)
2.2测试向流媒体服务器推流
3.转码
4.查看监控数据状态:
最近基于摄像头搭建一个由摄像头采取RTSP流数据,并返回前端的需求。研究了一下怎么实现。
1.获取RTSP地址
摄像头厂商为:乔安智联的摄像头(其他摄像头也可以)。
通过ONVIF Device Manager软件在局域网内进行查找获取摄像头的RTSP流地址
ONVIF Device Managerhttps://sourceforge.net/projects/onvifdm/
使用方法网上很多(这里可能会出现问题,我由于电脑问题出现反序列失败,用别人的电脑已连接就成功,目前不知道原因)
2.搭建流媒体服务器
2.1下载资源
下载nginx
首先我们要知道一般nginx不能直接配置rtmp服务,在Windows系统上需要特殊nginx版本才能进行搭建 : nginx 1.7.11.3 Gryphon.ziphttp://nginx-win.ecsds.eu/download/
下载并解压,进入文件夹,打开cmd命令窗口。输入nginx -v。出现一下效果显示安装成功
下载rtmp组件
由于后面需要检查监控直播状态,这里下载一个组件
nginx-rtmp-module-masterhttps://github.com/arut/nginx-rtmp-module/解压文件到nginx目录下
启动nginx
在conf目录下,新建文件nginx.conf
内容:
worker_processes 1; #Nginx进程数,建议设置为等于CPU总核数
events {
worker_connections 1024; #工作模式与连接数上限
}
rtmp_auto_push on;
#RTMP服务
rtmp {
server {
listen 1935;
chunk_size 4096;
application live {
live on; #开启直播
record off;
}
}
}
#HTTP服务
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server { #nginx启动页面
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
location /live_hls{
types{
#m3u8 type设置
application/vnd.apple.mpegurl m3u8;
#ts分片文件设置
video/mp2t ts;
}
#指向访问m3u8文件目录
alias ./m3u8File;
add_header Cache-Control no-cache; #禁止缓存
}
location /control{
rtmp_control all;
}
location /stat{ #映射监控工具
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl{
root ./nginx-rtmp-module-master;
}
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
回到nginx目录,打开cmd命令行
输入start nginx命令启动nginx
在浏览器中输入localhost或是127.0.0.1检查启动是否成功(如下效果为成功)
文章来源地址https://www.toymoban.com/news/detail-740192.html
测试工具(由于java代码调试问题,所以这里先下载一个转码推流的工具,其中javacv的原理也是它)可忽略
ffmpeghttps://ffmpeg.org/
解压并配置全局变量
测试ffmpeg:
在文件路径下打开终端
输入ffmpeg -i .\1.png i.jpg
当出现一下界面并且目录中出现转码的文件,表示操作成功
下载VLC(测试视频是否成功)
VLChttps://www.videolan.org/vlc/
2.2测试向流媒体服务器推流
在命令行中输入ffmpeg -i 上传的文件名 -f flv rtmp://127.0.0.1:1935/live
-i 表示推流的文件 -f表示指定推流的协议 后面的rtmp地址根据流媒体服务器中监听的端口和应用来获取
这里以我的1.MP4为例
ffmpeg -i .\1.mp4 -f flv rtmp:127.0.0.1:1935/live (如果之前的所有和我一样,这里的也应该是一样的)
出现下面界面 表示正在推流中
打开VCL,在媒体选项中选择打开网络串流
地址输入推流的地址
出现视频表示推流,拉流成功
3.转码
由于目前大多数的浏览器无法直接解析RTSP流地址,所以这里选择用java作为后台转码并推流到流媒体服务器。
依赖:
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv</artifactId>
<version>1.4.3</version>
</dependency>
<dependency>
<groupId>org.bytedeco.javacpp-presets</groupId>
<artifactId>ffmpeg-platform</artifactId>
<version>4.0.2-1.4.3</version>
</dependency>
java代码:
package com.example.demo.util;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import lombok.SneakyThrows;
import org.bytedeco.javacpp.avcodec;
import org.bytedeco.javacv.*;
public class RecordVideoThread {
public static void main(String[] args) {
String RtspURL = "rtsp://192.168.17.88:554/live/ch00_0";// RTSP流地址(1中获取的)
String RtmpUrl = "rtmp://127.0.0.1:1935/live/test"; //(RTMP地址)
push(RtspURL , RtmpUrl );
}
public void push(String RtspURL, String RtmpUrl) {
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(RtspURL);
FFmpegFrameRecorder recorder = null;
try {
//发起请求
grabber.start();
System.out.println("1111");
Frame frame = grabber.grabFrame();
if (frame != null) {
// 流媒体输出地址,分辨率(长,高),是否录制音频(0:不录制/1:录制)
recorder = new FFmpegFrameRecorder(RtmpUrl, 1080, 1440, 1);
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);// 直播流格式
recorder.setFormat("flv");// 录制的视频格式
recorder.setFrameRate(25);// 帧数
//百度翻译的比特率,默认400000,但是我400000贼模糊,调成800000比较合适
recorder.setVideoBitrate(800000);
System.out.println("开始保存视频");
recorder.start();
while ((frame != null)) {
recorder.record(frame);// 推流
frame = grabber.grabFrame();// 获取下一帧
}
recorder.record(frame);
// 停止录制
recorder.stop();
grabber.stop();
}
} catch (FrameGrabber.Exception e) {
e.printStackTrace();
} catch (FrameRecorder.Exception e) {
e.printStackTrace();
} finally {
if (null != grabber) {
try {
grabber.stop();
} catch (FrameGrabber.Exception e) {
e.printStackTrace();
}
}
if (recorder != null) {
try {
recorder.stop();
} catch (FrameRecorder.Exception e) {
e.printStackTrace();
}
}
}
}
}
启动项目,打开VCL,输入RTMP地址
4.查看监控数据状态:
在浏览器输入localhost/stat
文章来源:https://www.toymoban.com/news/detail-740192.html
到了这里,关于基于javacv(推流),nginx(流媒体服务器),VCL(播放器)搭建直播视频的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!