tar -zxvf nginx-1.13.1
tar -zxvf master
cd nginx-1.13.1
./configure --prefix=/usr/local/nginx --add-module=../nginx-rtmp-module-master --with-http_ssl_module
make
sudo make install
sudo vim /usr/local/nginx/conf/nginx.conf
mkdir -p /usr/share/nginx/html/hls
rtmp {
server {
listen 1935; #监听的端口
chunk_size 4000;
application hls { #rtmp推流请求路径
live on;
record off;
# hls on;
# hls_path /usr/share/nginx/html/hls;
# hls_fragment 1s;
}
}
}
location / {
add_header Cache-Control no-cache;
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
add_header 'Access-Control-Allow-Headers' 'Range';
root /usr/share/nginx/html;
index index.html index.htm;
}
sudo /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
sudo /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf -s reload
package com.example.demo.service;
import org.bytedeco.javacpp.Loader;
import org.bytedeco.javacpp.avcodec;
import org.bytedeco.javacpp.opencv_core.IplImage;
import org.bytedeco.javacpp.opencv_objdetect;
import org.bytedeco.javacv.CanvasFrame;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.FrameGrabber;
import org.bytedeco.javacv.FrameRecorder;
import org.bytedeco.javacv.OpenCVFrameConverter;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@Service
public class RTSPtoRTMPService {
static boolean exit = false;
@Async
public void recordPush(String inputFile,String outputFile,int v_rs) throws Exception, org.bytedeco.javacv.FrameRecorder.Exception, InterruptedException{
Loader.load(opencv_objdetect.class);
//long startTime=0;
FrameGrabber grabber =FFmpegFrameGrabber.createDefault(inputFile);
int width = 1280,height = 720;
grabber.setOption("rtsp_transport", "tcp"); // 使用tcp的方式,不然会丢包很严重
// 一直报错的原因!!!就是因为是 2560 * 1440的太大了。。
grabber.setImageWidth(width);
grabber.setImageHeight(height);
try {
grabber.start();
} catch (Exception e) {
try {
grabber.restart();
} catch (Exception e1) {
throw e;
}
}
OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();
Frame grabframe =grabber.grab();
IplImage grabbedImage =null;
if(grabframe!=null){
System.out.println("取到第一帧");
grabbedImage = converter.convert(grabframe);
}else{
System.out.println("没有取到第一帧");
}
//如果想要保存图片,可以使用 opencv_imgcodecs.cvSaveImage("hello.jpg", grabbedImage);来保存图片
FrameRecorder recorder;
try {
recorder = FrameRecorder.createDefault(outputFile, 1280, 720);
} catch (org.bytedeco.javacv.FrameRecorder.Exception e) {
throw e;
}
recorder.setInterleaved(true);
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264); // avcodec.AV_CODEC_ID_H264
recorder.setFormat("flv");
recorder.setVideoOption("crf", "28");
recorder.setFrameRate(v_rs);
recorder.setGopSize(v_rs);
recorder.setPixelFormat(0);
System.out.println("准备开始推流...");
/*try {
recorder.start();
} catch (org.bytedeco.javacv.FrameRecorder.Exception e) {
try {
System.out.println("录制器启动失败,正在重新启动...");
if(recorder!=null)
{
System.out.println("尝试关闭录制器");
recorder.stop();
System.out.println("尝试重新开启录制器");
recorder.start();
}
} catch (org.bytedeco.javacv.FrameRecorder.Exception e1) {
throw e;
}
}*/
recorder.start();
System.out.println("开始推流");
//CanvasFrame frame = new CanvasFrame("camera", CanvasFrame.getDefaultGamma() / grabber.getGamma());
//frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
/*frame.setAlwaysOnTop(true);
while (frame.isVisible() && (grabframe=grabber.grab()) != null) {
System.out.println("推流...");
frame.showImage(grabframe);
grabbedImage = converter.convert(grabframe);
Frame rotatedFrame = converter.convert(grabbedImage);
if (startTime == 0) {
startTime = System.currentTimeMillis();
}
recorder.setTimestamp(1000 * (System.currentTimeMillis() - startTime));//时间戳
if(rotatedFrame!=null){
recorder.record(rotatedFrame);
}
Thread.sleep(40);
}
*/
while(grabframe!=null){
grabber.setOption("rtsp_transport", "tcp"); // 使用tcp的方式,不然会丢包很严重
// 一直报错的原因!!!就是因为是 2560 * 1440的太大了。。
grabber.setImageWidth(width);
grabber.setImageHeight(height);
grabframe =grabber.grab();
grabbedImage = converter.convert(grabframe);
Frame rotatedFrame = converter.convert(grabbedImage);
recorder.record(rotatedFrame);
}
Thread.sleep(40);
recorder.stop();
recorder.release();
grabber.stop();
System.exit(2);
}
}
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Video.js 5.18.4</title>
<link href="../css/video.css" rel="stylesheet">
<!-- If you'd like to support IE8 -->
<script src="../js/videojs-ie8.js"></script>
<style>
body{background-color: #191919}
.m{ width: 640px; height: 264; margin-left: auto; margin-right: auto; margin-top: 100px; }
</style>
</head>
<body>
<div class="m">
<video id="my-video" class="video-js" controls preload="auto" width="640" height="264"
poster="MY_VIDEO_POSTER.jpg" data-setup="{}">
<source src="rtmp://192.168.8.250:1935/hls/index" type="rtmp/flv"/>
<p class="vjs-no-js">
To view this video please enable JavaScript, and consider upgrading to a web browser that
<a href="http://videojs.com/html5-video-support/" target="_blank">supports HTML5 video</a>
</p>
</video>
<script src="../js/video.js"></script>
<script src="../js/jquery-1.7.1.min.js"></script>
<script type="text/javascript">
$.ajax({
url:"/preview",
type:"get",
async:true,
success:function(data){
var myPlayer = videojs('my-video');
videojs("my-video").ready(function(){
var myPlayer = this;
myPlayer.play();
});
},
error:function(data){
console.log(data)
}
});
</script>
</div>
</body>
</html>