rtmp直播

技术要求:nginx+nginx-rtmp+ffmpeg+VLC
跟着大佬走的:
传送门
准备工作:

首先需要一台公网ip的服务器

这是使用天翼云的弹性云主机:免费试用1个月
天翼云官网
在这里插入图片描述
点击关机,更多里面选择重置密码,

默认用户名为root

使用xshell连接

弹性ip:xx.xx.xx.xx

root 密码
在这里插入图片描述
创建目录:mkdir rtmp

切换目录

使用winSCP软件上传rtmp源码文件,下载nginx:

wget http://nginx.org/download/nginx-1.8.0.tar.gz

解压:tar -xvf nginx-1.8.0.tar.gz
cd nginx-1.8.0/

安装依赖库
yum -y install pcre-develyum -y install openssl openssl-devel
# 注释:add-module=自己的nginx-rtmp目录 --with-http_ssl_module
./configure --add-module=../nginx-rtmp-module-master --with-http_ssl_module

在这里插入图片描述

	# 编译makemake install
# 启动nginx:cd /usr/local/nginx/sbin./nginx

nginx默认使用的是80端口,开放防火墙
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
天翼云后台开放安全组:80 0.0.0.0/0
但其实这里的80端口是不能使用的,除非备案!!!
天翼云服务器的80、443、8080端口均需要备案才能访问,其他端口是开放的
修改nginx的端口为8090

cd /usr/local/nginx/confvi nginx.conf

在这里插入图片描述


重启nginxsudo pkill -9 nginx./nginx查看nginx端口是否是8090sudo netstat -anp | grep nginx

在这里插入图片描述

关闭防火墙
首先,您需要打开终端并以root用户身份登录。

然后,使用以下命令停止firewalld服务,并禁用防火墙服务
sudo systemctl stop firewalld
sudo systemctl disable firewalld
# 接下来,您可以使用以下命令来检查是否已成功停止防火墙服务。
sudo systemctl status firewalld

天翼云后台添加安全组:
在这里插入图片描述

出来了:
在这里插入图片描述

添加rtmp配置

cd /usr/local/nginx/confvi nginx.conf
rtmp {server {listen 1935;chunk_size 4000;application live {live on;}}
}
# 重启nginx
sudo pkill -9 nginx
cd /usr/local/nginx/sbin
./nginx

推流测试

下载ffmpeg源码包
window电脑配置环境变量(path)
在这里插入图片描述
使用ffmpeg推流
用gitbash打开,桌面有一个video.mp4 ,推流到ip为36.111.171.xx.xx(自己的):1935/live/流id(叫test也行,只是拉流也需要同名流id才能拉取成功)

 ffmpeg -re -i video.mp4 -f flv rtmp://36.111.171.36:1935/live/s1

在这里插入图片描述

拉流测试

电脑端拉流测试

使用VLC软件进行拉流,win11环境拉取服务器视频

点击媒体:选择打开网络串流,输入rtmp://36.111.xx.xx:1935/live/s1
在这里插入图片描述

安卓手机拉流测试

下载安卓版VLC软件:点击更多->新建文件串流->输入
rtmp://36.111.xx.xx:1935/live/s1
在这里插入图片描述

项目实战demo:

创建一个uniapp项目,创建一个后缀为.nvue的文件
将代码里面的data中的url,src中的ip换为自己的。

<template><view><!-- 音视频播放 --><video id="myVideo" :src="src"@error="videoErrorCallback" :danmu-list="danmuList" enable-danmu danmu-btn controls></video><!-- 音视频录制 --><live-pusher id='livePusher' ref="livePusher" class="livePusher" :url="url"mode="SD" :muted="false" :enable-camera="true" :auto-focus="true" :beauty="1" whiteness="2"aspect="9:16" @statechange="statechange" @netstatus="netstatus" @error = "error"></live-pusher><!-- <button class="btn" @click="start">开始推流</button><button class="btn" @click="pause">暂停推流</button><button class="btn" @click="resume">resume</button><button class="btn" @click="stop">停止推流</button><button class="btn" @click="snapshot">快照</button><button class="btn" @click="startPreview">开启摄像头预览</button><button class="btn" @click="stopPreview">关闭摄像头预览</button><button class="btn" @click="switchCamera">切换摄像头</button> --></view>
</template><script>export default {data() {return {url:'rtmp://36.111.171.36:1935/live/s1',src:'rtmp://36.111.171.36:1935/live/s1'// url:'rtmp://192.168.74.128:1935/live/s1',// src:'rtmp://192.168.74.128:1935/live/s1'}},onReady() {// 注意:需要在onReady中 或 onLoad 延时this.context = uni.createLivePusherContext("livePusher", this);this.start();},methods: {statechange(e) {console.log("statechange:" + JSON.stringify(e));},netstatus(e) {console.log("netstatus:" + JSON.stringify(e));},error(e) {console.log("error:" + JSON.stringify(e));},start: function() {this.context.start({success: (a) => {console.log("livePusher.start:" + JSON.stringify(a));}});},close: function() {this.context.close({success: (a) => {console.log("livePusher.close:" + JSON.stringify(a));}});},snapshot: function() {this.context.snapshot({success: (e) => {console.log(JSON.stringify(e));}});},resume: function() {this.context.resume({success: (a) => {console.log("livePusher.resume:" + JSON.stringify(a));}});},pause: function() {this.context.pause({success: (a) => {console.log("livePusher.pause:" + JSON.stringify(a));}});},stop: function() {this.context.stop({success: (a) => {console.log(JSON.stringify(a));}});},switchCamera: function() {this.context.switchCamera({success: (a) => {console.log("livePusher.switchCamera:" + JSON.stringify(a));}});},startPreview: function() {this.context.startPreview({success: (a) => {console.log("livePusher.startPreview:" + JSON.stringify(a));}});},stopPreview: function() {this.context.stopPreview({success: (a) => {console.log("livePusher.stopPreview:" + JSON.stringify(a));}});}}}
</script><style></style>

运行到安卓手机
在这里插入图片描述
效果:下面在推流,上面在拉流,

由于网络传输,拉流的视频会有延时(直播)
在这里插入图片描述
完结撒花!!!码字不易,点个赞再走啦

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

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

相关文章

Web AP—BOM 浏览器对象模型

代码下载 BOM BOM&#xff08;Browser Object Model&#xff09;即浏览器对象模型&#xff0c;它提供了独立于内容而与浏览器窗口进行交互的对象&#xff0c;其核心对象是 window。 BOM 由一系列相关的对象构成&#xff0c;并且每个对象都提供了很多方法与属性。 BOM 缺乏标…

EasyExcel入门介绍及工具类,网络下载excel

前言&#xff1a;在这里分享自己第一次使用EasyExcel并且编写工具类&#xff0c;且在接口中支持excel文件下载的一系列流程&#xff0c;包含所有前后端&#xff08;JSJAVA&#xff09;完整代码&#xff0c;可以根据自己需要自行提取&#xff0c;仅供参考。 一.引入EasyExcel依赖…

十、flume的安装

1.解压 2.改名 3.修改权限 4.编辑环境变量并source export FLUME_HOME/usr/local/flume export PATH$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HIVE_HOME/bin:$HBASE_HOME/bin:$SQOOP_HOME/bin:$PIG_HOME/bin:$FLUME_HOME/bin 5.配置 6.查看版本 7.启动Hadoo…

vue2.x项目从0到1(七)之用户权限

此章节偏理论知识 对于小一点的项目 比如说角色都是平级的 那我们直接像之前 vue2.x项目从0到1&#xff08;二&#xff09;之后台管理侧边栏&#xff08;动态渲染路由以及高亮&#xff09;_vue动态渲染侧边栏_关忆北_的博客-CSDN博客这样渲染就行了 但是一旦项目大了 …

云曦暑期学习第六周——kali

1.熟悉网络配置 一般来说虚拟机有三种网络模式&#xff1a; NAT (网络地址转换模式)Bridged (桥接模式)Host-Only&#xff08;主机模式&#xff09; nat模式&#xff1a; 虚拟系统会通过宿主机的网络来访问外网。而这里的宿主机相当于有两个网卡&#xff0c;一个是真实网卡…

3分钟了解Android中稳定性测试

一、什么是Monkey Monkey在英文里的含义是猴子&#xff0c;在测试行业的学名叫“猴子测试”&#xff0c;指的是没有测试经验的人甚至是根本不懂计算机的人&#xff08;就像一只猴子&#xff09;&#xff0c;不需要知道程序的任何用户交互方面的知识&#xff0c;给他一个程序&a…

sed替换命令

用sed编辑流时&#xff0c;最强大的命令莫过于它的替换命令。它有许多参数选项&#xff0c;可以完成诸多复杂的工作。 1. 替换命令的语法 sed [address-range|pattern-range] s/original-string /replacement-string/[substitute-flags] inputfile 注意&#xff0c;上面的换…

【2023年11月第四版教材】《第6章-项目管理概论》(第二部分)

《第6章-项目管理概论》&#xff08;第二部分&#xff09; 3 项目经理的角色3.1 项目经理的影响力范围3.2 项目经理领导力风格 4 价值驱动的项目管理知识体系4.1 开发生命周期类型 5 五大过程组6 五个过程组和十大知识领域 3 项目经理的角色 3.1 项目经理的影响力范围 范围影…

Spring Boot配置文件

文章目录 配置文件的作用配置文件的格式properties 配置文件说明yml 配置文件说明yml进阶使用 Spring Boot读取配置文件设置不同环境的配置文件总结 配置文件的作用 Spring Boot 配置文件在应用程序开发中起着非常重要的作用&#xff0c;它们用于定义应用程序的行为、组件和依…

Ganache 本地测试网远程连接

文章目录 前言1. 安装Ganache2. 安装cpolar3. 创建公网地址4. 公网访问连接5. 固定公网地址 前言 Ganache 是DApp的测试网络&#xff0c;提供图形化界面&#xff0c;log日志等&#xff1b;智能合约部署时需要连接测试网络。 Ganache 是一个运行在本地测试的网络,通过结合cpol…

窗口函数大揭秘!轻松计算数据累计占比,玩转数据分析的绝佳利器

上一篇文章《如何用窗口函数实现排名计算》中小编为大家介绍了窗口函数在排名计算场景中的应用&#xff0c;但实际上窗口函数除了可以进行单行计算&#xff0c;还可以在每行上打开一个指定大小的计算窗口&#xff0c;这个计算窗口可以由SQL中的语句具体指定&#xff0c;大到整个…

Servlet+JDBC实战开发书店项目讲解第七篇:模拟支付

ServletJDBC实战开发书店项目讲解第七篇&#xff1a;模拟支付 概述 在本篇文章中&#xff0c;我们将使用Servlet和JDBC来完成书店项目中的模拟支付功能。我们将介绍实现思路、后端代码设计以及前端代码设计&#xff0c;并通过代码实现订单支付成功&#xff0c;并实现查看未付…

AI极客日报0822 - AI创作是否应该有版权?

&#x1f440;AI 日报合集 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; 人工智能系统依法享有版权吗&#xff1f;这位法官给出了肯定的答案。让我们开始吧。 今日看点&#xff1a; 一位联邦法官明确表示&#xff0c;AI创作的艺术品没有版权&#xff01;中国&#xff0c…

PySide6学习笔记--基础环境的安装配置

PySide6介绍 QT官方发布Qt6.0之后&#xff0c;紧接着于2020年12月10日发布了PySide 6&#xff0c;对应C版的Qt6。从PySide6开始&#xff0c;PySide的命名也会与Qt的大版本号保持一致。需要注意的是使用PySide6开发的程序在默认情况下&#xff0c;不兼容Windows7系统&#xff0c…

测试框架pytest教程(4)运行测试

运行测试文件 $ pytest -q test_example.py 会运行该文件内test_开头的测试方法 该-q/--quiet标志使输出保持简短 测试类 pytest的测试用例可以不写在类中&#xff0c;但如果写在类中&#xff0c;类名需要是Test开头&#xff0c;非Test开头的类下的test_方法不会被搜集为用…

初识微服务

我们在曾经最常见的就是所谓的单体架构&#xff0c;但是由于网民越来越多&#xff0c;单体架构已经逐渐的被淘汰出去&#xff0c;所以我们在单体架构的基础上提出了微服务&#xff0c;它提倡将单一应用程序划分成一组小的服务&#xff0c;服务之间互相协调、互相配合&#xff0…

PCB布线必看系列之三W原则!! !

三W原则是指Wiring&#xff08;连线&#xff09;,Worship&#xff08;供电&#xff09;,Waste&#xff08;浪费&#xff09; 一、Wiring原则 Wiring连线是电路板上的信号传输线路&#xff0c;包括信号线&#xff0c;功率线&#xff0c;地线 布线注意原则&#xff1a; 1.信号…

vue 使用nvm控制node 版本,随意切换 node 版本

1.nvm 下载安装 https://github.com/coreybutler/nvm-windows/releases 找自己版本 1.安装版本 nvm list available // 查看所有node 版本 nvm install 版本号 // 安装指定版本号2.nvm 列表展示 nvm list //展示所有版本号3.nvm 切换环境 nvm use 版本号 // 切换版本4.…

python模块 — pip包管理工具

pip是Python语言中最常用的包管理工具之一&#xff0c;可以用于安装、卸载、查看和升级第三方模块。 下面是关于pip的一些常用命令&#xff1a; 1、安装模块 pip install <module_name> 2、卸载模块 pip uninstall <module_name> 3、查看所有已安装模块 pip…

redis7高级篇3 亿级别数据量的统计分析

一 亿级别统计分类 1.1 统计分类 1.聚合统计&#xff1a;统计多个集合聚合的结果&#xff0c;也就是多个集合之间交并差的统计。 2.排序统计&#xff1a;在需要展示最新列表&#xff0c;排行榜等场景时&#xff0c;如果数据更新频繁或者需要分页时&#xff0c;建议使用zset12…