logo
当前位置:首 页 > 编程技术 >后端开发 >docker > 查看文章

一、rtmp服务器搭建

环境:

centos 7.*

1.先安装docker(省略)

2.下载docker容器

docker pull alfg/nginx-rtmp

3.运行容器(记得打开防火墙端口 1935和8080)

docker run -it -p 1935:1935 -p 8080:80 –rm alfg/nginx-rtmp

二、推流方式

ok rtmp服务器 搭建成功,接下来就是推流了(这里列举三种方式)

第一种:利用OBS Studio推送直播到这个地址

rtmp://服务器ip:1935/stream/自定义名称

第二种:ffmpeg推送本地视频为直播流

ffmpeg -re -i /home/holle.flv -vcodec copy -acodec aac -ar 44100 -f flv rtmp://192.168.1.201:1935/stream/example

第三种:利用javacv推本地摄像头视频到流媒体服务器(代码实现如下)

  1. import javax.swing.JFrame;
  2.  
  3. import org.bytedeco.javacpp.Loader;
  4. import org.bytedeco.javacpp.avcodec;
  5. import org.bytedeco.javacpp.opencv_core;
  6. import org.bytedeco.javacpp.opencv_objdetect;
  7. import org.bytedeco.javacv.*;
  8. import org.bytedeco.javacv.FrameGrabber.Exception;
  9.  
  10. public class JavavcCameraTest
  11. {
  12. public static void recordCamera(String outputFile, double frameRate)
  13. throws Exception, InterruptedException, org.bytedeco.javacv.FrameRecorder.Exception {
  14. Loader.load(opencv_objdetect.class);
  15. FrameGrabber grabber = FrameGrabber.createDefault(0);//本机摄像头默认0,这里使用javacv的抓取器,至于使用的是ffmpeg还是opencv,请自行查看源码
  16. grabber.start();//开启抓取器
  17.  
  18. OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();//转换器
  19. opencv_core.IplImage grabbedImage = converter.convert(grabber.grab());//抓取一帧视频并将其转换为图像,至于用这个图像用来做什么?加水印,人脸识别等等自行添加
  20. int width = grabbedImage.width();
  21. int height = grabbedImage.height();
  22.  
  23. FrameRecorder recorder = FrameRecorder.createDefault(outputFile, width, height);
  24. recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264); // avcodec.AV_CODEC_ID_H264,编码
  25. recorder.setFormat("flv");//封装格式,如果是推送到rtmp就必须是flv封装格式
  26. recorder.setFrameRate(frameRate);
  27.  
  28. recorder.start();//开启录制器
  29. long startTime=0;
  30. long videoTS=0;
  31. CanvasFrame frame = new CanvasFrame("camera", CanvasFrame.getDefaultGamma() / grabber.getGamma());
  32. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  33. frame.setAlwaysOnTop(true);
  34. Frame rotatedFrame=converter.convert(grabbedImage);//不知道为什么这里不做转换就不能推到rtmp
  35. while (frame.isVisible() && (grabbedImage = converter.convert(grabber.grab())) != null) {
  36. rotatedFrame = converter.convert(grabbedImage);
  37. frame.showImage(rotatedFrame);
  38. if (startTime == 0) {
  39. startTime = System.currentTimeMillis();
  40. }
  41. videoTS = 1000 * (System.currentTimeMillis() - startTime);
  42. recorder.setTimestamp(videoTS);
  43. recorder.record(rotatedFrame);
  44. Thread.sleep(40);
  45. }
  46. frame.dispose();
  47. recorder.stop();
  48. recorder.release();
  49. grabber.stop();
  50.  
  51. }
  52.  
  53. public static void main(String[] args) throws Exception, InterruptedException, org.bytedeco.javacv.FrameRecorder.Exception {
  54. // recordCamera("D:\\example.mp4",25); //保持到本地
  55. recordCamera("rtmp://192.168.1.201:1935/stream/example",25); //推流到rtmp服务器
  56. }
  57.  
  58. }

 

 

javacv依赖

 

  1. <dependency>
  2. <groupId>org.bytedeco</groupId>
  3. <artifactId>javacv-platform</artifactId>
  4. <version>1.3.2</version>
  5. </dependency>

 

三、观看直播(rtmp流)

观看 rtmp流 可以用PotPlayer

菜单——打开——打开链接  贴入rtmp流地址  即可播放了

rtmp://192.168.1.201:1935/stream/example

参考:

https://hub.docker.com/r/alfg/nginx-rtmp/

https://blog.csdn.net/eguid_1/article/details/52678775

转载自:https://blog.csdn.net/lipei1220/article/details/80234281

 

 

说说梦想,谈谈感悟 ,聊聊技术,有啥要说的来github留言吧 https://github.com/cjx2328

—— 陈 建鑫

陈建鑫
你可能也喜欢Related Posts
footer logo
未经许可请勿自行使用、转载、修改、复制、发行、出售、发表或以其它方式利用本网站之内容。站长联系:cjx2328#126.com(修改#为@)
Copyright ©ziao Studio All Rights Reserved. E-mail:cjx2328#126.com(#号改成@) 沪ICP备14052271号-3