vlc搭建rtsp直播Demo ffmpeg + nginx + flv.js实现rtsp网页播放Demo

news2024/11/22 21:17:53

文章目录

    • 学习链接
    • 本地视频文件作为数据源
      • 推流步骤
      • 拉流步骤
    • 本地摄像头作为数据源
      • 拉流步骤
    • vlc + ffmpeg + nginx + flv.js 实现网页视频直播
      • 概括
      • vlc打开摄像头,提供rtsp视频流
      • nginx配置
        • http-flv.conf的nginx配置文件
      • ffmpeg将rtsp视频流转为rtmp,推送给nginx
      • flv.html
        • 下载github上flv.js
      • 效果

学习链接

ffmpeg 使用VLC亲手搭建RTSP直播点播
【前端】rtsp 与 rtmp 视频流的播放方法
在windows下搭建、配置nginx流媒体服务器,并进行rtmp流的推流、拉流测试(测了有效,但是播放一会儿之后,就断了,不知道咋回事)
Windows上搭建Nginx RTMP服务器并使用FFmpeg实现本地视频推流

如何不花钱让html5播放rtsp视频流(第一弹)
FFmpeg-Linux下实现FFmpeg+nginx搭建 RTMP&flv流媒体服务器实现监控等视频进行web直播
rtmp、hls、flv基本介绍

ffmpeg & nginx 解决无法在web里播放海康rtsp流媒体的问题

HTTP-FLV直播模块(nginx-http-flv-module)配置
[http-flv]flv.js和nginx-http-flv的推流和拉流 !!! 有用
[nginx-rtmp]ffmpeg+video-js的推流和拉流 (不推荐)

nginx-http-flv-module模块使用介绍 gitee地址
哔哩哔哩flv.js

本地视频文件作为数据源

推流步骤

点击媒体->流
在这里插入图片描述
点击添加,选择视频文件,后点击串流
在这里插入图片描述
点击串流后,点击下一个
在这里插入图片描述
选择rtsp后,点击添加
在这里插入图片描述
手动输入路径,点击下一个
在这里插入图片描述
如图选择ts流(激活转码要勾选哦),点击下一个
在这里插入图片描述
点击流
在这里插入图片描述
即可看到,它开始推流了
在这里插入图片描述

拉流步骤

点击媒体->打开网络串流
在这里插入图片描述
手动输入rtsp的推流地址

在这里插入图片描述
下面开始动了
在这里插入图片描述
然后,稍等,就可以看到视频在播放了
在这里插入图片描述

本地摄像头作为数据源

与上面相同,点击媒体->流
在这里插入图片描述
点击下一个

在这里插入图片描述
选择rtsp,点击添加

在这里插入图片描述
手动输入地址,如下
在这里插入图片描述
选择ts,点击下一个
在这里插入图片描述
可以看到推流地址,点击流

在这里插入图片描述
开始再推了
在这里插入图片描述

拉流步骤

输入rtsp的地址,点击播放
在这里插入图片描述
播放摄像头的视频
在这里插入图片描述

vlc + ffmpeg + nginx + flv.js 实现网页视频直播

概括

大概操作的过程
在这里插入图片描述

  • 参考上面的链接,先使用vlc利用本基本的摄像头,转成rtsp的视频流,
  • 然后使用ffmeg把rtsp的视频流转为rtmp的视频流推送到nginx的rtmp模块配置的myapp下(nginx要安装nginx-http-flv-module这个模块才可以),
  • 并且nginx在http模块中的/live下使用flv_live on打开HTTP播放FLV直播流功能,
  • 这样在前端就能够使用bilibili的flvjs使用地址:http://127.0.0.1/live?port=1935&app=myapp&stream=mystream 看到摄像头所拍摄的视频了

vlc打开摄像头,提供rtsp视频流

操作步骤,与前面的截图一样
在这里插入图片描述

nginx配置

需要安装nginx-http-flv-module这个模块,这里是直接下载别人编译好的nginx(里面已经有这个模块了,链接: https://pan.baidu.com/s/1NfK8EtPKWldTuT7ZktgolQ?pwd=yqxy 提取码: yqxy),然后启动nginx

http-flv.conf的nginx配置文件

下面的配置,我的理解是:通过添加配置的rtmp模块让nginx能够在myapp上能够接收来自ffmpeg推送过来的视频流,然后这个myapp也能把推送过来的流,再推出去(因为这个时候,我还可以打开另一个vlc窗口,使用地址:rtmp://127.0.0.1:1935/myapp/mystream,看到摄像头的视频)。然后,因为要实现网页上播放,网页上直接用这个rtmp://127.0.0.1:1935/myapp/mystream的视频地址的话会报跨域的错误,没找到解决办法,所以使用http服务开了/live这个地址,使用flv_live打开Http播放flv直播功能(因此需要安装nginx-http-flv-module这个模块才能支持),这样就可以添加请跨域相关的请求头了,并且它也能够根据请求参数中的port、app、stream找到 使用ffmpeg推送的myapp。

worker_processes  1;

error_log logs/error.log error;

events {
    worker_connections  4096;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    keepalive_timeout  65;

    server {
        listen       80;

        location / {
            root   www;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        location /live {
            flv_live on; #打开HTTP播放FLV直播流功能
            chunked_transfer_encoding on; #支持'Transfer-Encoding: chunked'方式回复

            add_header 'Access-Control-Allow-Origin' '*'; #添加额外的HTTP头
            add_header 'Access-Control-Allow-Credentials' 'true'; #添加额外的HTTP}

        location /hls {
            types {
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }

            root temp;
            add_header 'Cache-Control' 'no-cache';
        }

        location /dash {
            root temp;
            add_header 'Cache-Control' 'no-cache';
        }

        location /stat {
            #推流播放和录制统计数据的配置

            rtmp_stat all;
            rtmp_stat_stylesheet stat.xsl;
        }

        location /stat.xsl {
            root www/rtmp; #指定stat.xsl的位置
        }

        #如果需要JSON风格的stat, 不用指定stat.xsl
        #但是需要指定一个新的配置项rtmp_stat_format

        #location /stat {
        #    rtmp_stat all;
        #    rtmp_stat_format json;
        #}

        location /control {
            rtmp_control all; #rtmp控制模块的配置
        }
    }
}

rtmp_auto_push on;
rtmp_auto_push_reconnect 1s;
rtmp_socket_dir temp;

rtmp {
    out_queue           4096;
    out_cork            8;
    max_streams         128;
    timeout             15s;
    drop_idle_publisher 15s;

    log_interval 5s; #log模块在access.log中记录日志的间隔时间,对调试非常有用
    log_size     1m; #log模块用来记录日志的缓冲区大小

    server {
        listen 1935;
        #server_name www.test.*; #用于虚拟主机名后缀通配

        application myapp {
            live on;
            gop_cache on; #打开GOP缓存,减少首屏等待时间
        }

        application hls {
            live on;
            hls on;
            hls_path temp/hls;
        }

        application dash {
            live on;
            dash on;
            dash_path temp/dash;
        }
    }
}

ffmpeg将rtsp视频流转为rtmp,推送给nginx

敲入以下命令

ffmpeg -i rtsp://127.0.0.1:8554/rtsp01 -vcodec copy -acodec copy -f flv -an -b 1024k -y rtmp://127.0.0.1:1935/myapp/mystream

flv.html

下载github上flv.js

地址:flv.js下载
chrome要求不能直接播放视频,要让用户手动触发才能播放,所以下面帮定了个按钮触发视频播放。

<html>
		<head>
				<title>Live</title>
				<meta charset="utf-8">
		</head>
		<body >
				<h2 >推流测试</h2>
				<button id="startVideoBtn">开始</button>
				<script src="flv.js"></script>
				<video id="videoElement"></video>
				<script>
				function start() {
					if (flvjs.isSupported()) {
						var videoElement = document.getElementById('videoElement');
						var flvPlayer = flvjs.createPlayer({
							type: 'flv',
						    url:'http://127.0.0.1/live?port=1935&app=myapp&stream=mystream'
						});
						flvPlayer.attachMediaElement(videoElement);
						flvPlayer.load();
						flvPlayer.play();
					}
				}
						 
				let startVideoBtn = document.getElementById('startVideoBtn')	
				startVideoBtn.onclick = ()=>{
					start()
				}
				</script>
		</body>
</html>


效果

延迟有点高,15s延迟
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/531003.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

硬文:为什么中本聪不给比特币设计最终性?

* * * 原创&#xff1a;刘教链 * * * 昨日刘教链公众号刊发原创文章《论比特币和以太坊的“宕机”》之后&#xff0c;引发了一些对区块链工作原理感兴趣的朋友的热烈讨论。其中&#xff0c;魔笛手社区群主Claire提了一个好问题&#xff1a;为什么中本聪不给比特币设计最终性&a…

Babylon.js实战WebXR/元宇宙

从 VR 音频实验到街机上的 VR 休闲游戏&#xff0c;再到使用 AR 或 VR 创建新协作方式的更严肃用途&#xff0c;阅读本文后&#xff0c;你应该对今天可以做什么有很好的了解。 事实上&#xff0c;在本文中&#xff0c;我将分享我一直致力于使用 Babylon.js 构建沉浸式或增强现…

Towards Open-Set Object Detection and Discovery(论文翻译)

Towards Open-Set Object Detection and Discovery 摘要 随着人类对知识的不断追求&#xff0c;开集目标检测&#xff08;OSOD&#xff09;被设计用于识别动态世界中的未知目标。然而&#xff0c;当前设置的一个问题是&#xff0c;所有预测的未知对象共享相同的类别为“未知”…

Kali-linux使用Metasploitable操作系统

Metasploitable是一款基于Ubuntu Linux的操作系统。该系统是一个虚拟机文件&#xff0c;从http://sourceforge.net/projects/metasploitable/files/Metasploitable2/网站下载解压之后可以直接使用&#xff0c;无需安装。由于基于Ubuntu&#xff0c;所以Metasploitable使用起来十…

卧龙、凤雏!两源码学得一,代码质量都不会差!

作者&#xff1a;小傅哥 博客&#xff1a;https://bugstack.cn 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; 有人问我&#xff0c;编程能力怎么提升&#xff0c;我说学源码学的。他有问我&#xff0c;是不学 Spring 源码比学 MyBatis 更好…

ESP32 event loop(事件循环)(17)

提示&#xff1a;本博客作为学习笔记&#xff0c;有错误的地方希望指正&#xff0c;主要参考乐鑫技术手册说明结合实例代码分析&#xff0c;结合理论知识学习后示例分析以及常见问题说明。 文章目录 一、ESP32 Event Loop 概述2、使用 esp_event APIs3、默认 event loop4、句柄…

Java进阶-面向对象进阶(抽象类接口内部类)

1 抽象类 1.1 概述 1.1.1 抽象类引入 ​ 父类中的方法&#xff0c;被它的子类们重写&#xff0c;子类各自的实现都不尽相同。那么父类的方法声明和方法主体&#xff0c;只有声明还有意义&#xff0c;而方法主体则没有存在的意义了(因为子类对象会调用自己重写的方法)。换句话…

Marvin - LLM驱动的AI函数开发包【Python】

Marvin是一个用于构建 AI 驱动软件的Python库。 Marvin 的工作是将 AI 直接集成到你的代码库中&#xff0c;使其看起来和感觉起来与任何其他功能一样。 Marvin 引入了一个新概念&#xff0c;称为 AI 函数&#xff08;AI functions&#xff09;。 AI函数与传统函数的不同之处在…

Java进阶-常用的API

1 Math类 1.1 概述 tips&#xff1a;了解内容 查看API文档&#xff0c;我们可以看到API文档中关于Math类的定义如下&#xff1a; Math类所在包为java.lang包&#xff0c;因此在使用的时候不需要进行导包。并且Math类被final修饰了&#xff0c;因此该类是不能被继承的。 Math类…

springboot+jsp超市库存进销存管理系统-a597o

Spring框架是Java平台的一个开放源代码的Full-stack(全栈)应用程序框架&#xff0c;和控制翻转容器的实现。Spring框架的一些核心功能理论&#xff0c;可以用于所有Java应用&#xff0c;Spring还为Java EE构建的Web应用提供大量的扩展支持。Spring框架没有实现任何的编程模型&a…

PHP生成带有雪花背景的验证码

<?session_start();?> <FORM METHOD=POST ACTION=""> <input type=text name=number maxlength=4><img src="YanZhengMa.php?act=init"> <INPUT TYPE="submit" name="sub"> </FORM><?//检…

【分布族谱】正态分布和二项分布的关系

文章目录 正态分布二项分布验证 正态分布 正态分布&#xff0c;最早由棣莫弗在二项分布的渐近公式中得到&#xff0c;而真正奠定其地位的&#xff0c;应是高斯对测量误差的研究&#xff0c;故而又称Gauss分布。测量是人类定量认识自然界的基础&#xff0c;测量误差的普遍性&am…

本地电脑做服务器搭建私人音乐网站ThinkMusic + cpolar内网穿透

文章目录 1. 前言2. 本地网页搭建2.1 环境使用2.2 支持组建选择 3. 网页安装3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 转发自CSDN lisacpolar的文章&#xff1a;ThinkMusic源码搭建音乐网站&#xff0c;并实现公网访问 1. 前言 在我们的日…

数据结构初阶(1)(一些学习数据结构所需掌握的先导知识:包装类、装箱与拆箱、泛型【泛型的编译——擦除机制、泛型的上界、泛型方法、裸类型】、List简介)

目录 包装类 基本数据类型&#xff08;Primitive Types&#xff09;&#xff1a; 包装类&#xff08;Wrapper Classes&#xff09;&#xff1a; 装箱和拆箱 自动装箱和自动拆箱 泛型 泛型的编译——很重要的擦除机制&#xff1a; 泛型的上界&#xff1a; 泛型方法&…

LC-1335. 工作计划的最低难度(区间DP、记忆化搜索==>动态规划)

1335. 工作计划的最低难度 难度困难97 你需要制定一份 d 天的工作计划表。工作之间存在依赖&#xff0c;要想执行第 i 项工作&#xff0c;你必须完成全部 j 项工作&#xff08; 0 < j < i&#xff09;。 你每天 至少 需要完成一项任务。工作计划的总难度是这 d 天每一…

JavaSE进阶(一)—— 面向对象进阶(static、单例、代码块、继承)

目录 一、static静态关键字 1. static是什么&#xff0c;static修饰成员变量的用法 2. 成员方法的分类 2.1 使用场景 3. static修饰成员方法的内存原理 4. static的注意事项[拓展] 二、static应用知识&#xff1a;工具类 1. 工具类是什么 2. 工具类的好处 3. 为什么工…

域名信息收集

被动信息收集 0x01 Certificate Transparency&#xff08;证书透明&#xff09; 证书透明度(Certificate Transparency)是证书授权机构的一个项目&#xff0c;证书授权机构会将每个SSL/TLS证书发布到公共日志中。一个SSL/TLS证书通常包含域名、子域名和邮件地址。查找某个域名…

Java进阶-字符串的使用

1.API 1.1API概述 什么是API ​ API (Application Programming Interface) &#xff1a;应用程序编程接口 java中的API ​ 指的就是 JDK 中提供的各种功能的 Java类&#xff0c;这些类将底层的实现封装了起来&#xff0c;我们不需要关心这些类是如何实现的&#xff0c;只需要…

PPT技能之描边字,要大要醒目别整没用的

文字仅仅加粗&#xff0c;还是不够明显&#xff0c;不妨用上描边字。不会Photoshop&#xff0c;不会PS&#xff0c;也可以做好看的描边字。 描边字&#xff0c;是在文字的边缘加上边框&#xff0c;让文字更醒目、突出。 你的关注&#xff0c;是我最大的动力&#xff01;你的转…

【K8s】基本存储、高级存储(PV和PVC)、配置存储

文章目录 背景一、基本存储1、EmptyDir2、HostPath3、NFS 二、高级存储1、认识PV和PVC2、PV3、PVC4、生命周期 三、配置存储1、ConfigMap2、 Secret 背景 程序运行在容器中&#xff0c;而容器的生命周期可能极其短暂&#xff0c;容器销毁&#xff0c;数据丢失&#xff0c;因此…