hkversion javacv nginx-rtmp

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>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值