使用nginx和ffmpeg搭建HTTP FLV流媒体服务器(摄像头RTSP视频流->RTMP->http-flv)
名词解释
| |
RTSP (Real-Time Streaming Protocol) | 是一种网络协议,用于控制实时流媒体的传输。它是一种应用层协议,通常用于在客户端和流媒体服务器之间建立和控制媒体流的传输。RTSP允许客户端向服务器发送请求,如播放、暂停、停止、前进、后退等,以控制媒体流的播放和操作。RTSP可以与不同的传输协议(如RTP、TCP、UDP)结合使用,以实现实时的音视频流传输。它在视频监控、流媒体直播、视频会议等应用中广泛使用。 |
RTMP | RTMP(Real-Time Messaging Protocol)是一种用于实时数据传输的网络协议。它通常用于流媒体传输和实时通信应用程序。 RTMP 最初由Adobe开发,用于在Adobe Flash播放器和媒体服务器之间进行音视频传输。它使用TCP作为传输层协议,并支持实时音频、视频和数据的传输。 RTMP可以用于直播、视频会议、在线游戏等应用场景。通过RTMP,用户可以将音视频数据流从客户端上传到媒体服务器,然后其他用户可以通过相同的协议从媒体服务器上获取这些数据流。 |
RTSP和RTMP区别 | RTSP(Real-Time Streaming Protocol)和RTMP(Real-Time Messaging Protocol)是两种用于实时流媒体传输的协议,它们有以下几个主要区别:
总的来说,RTSP更注重流媒体的控制和会话管理,适用于需要灵活控制的场景;而RTMP更注重实时音视频数据传输和交互,适用于直播和实时通信等场景。选择使用哪种协议应根据具体需求和平台支持进行决策。 |
HTTP-FLV | HTTP-FLV是将流媒体数据先封装成FLV格式,然后通过HTTP协议传输给客户端,通过HTTP FLV的直播,这里使用了一个HTTP的协议约定,http 的content-length头字段如果不存在,则客户端就会一直接收数据,直到HTTP连接断开为止,其流程很简单,视频客户端发送HTTP请求,不带content-length头字段,服务器响应HTTP,并一直发送FLV的数据;客户端接收响应并一直接收数据直到连接断开。 |
Nginx | Nginx是一个广泛用于提供静态内容、代理和负载均衡的Web服务器。在这个场景中,Nginx用于接收RTSP流并通过HTTP向客户端提供服务 |
FFmpeg | FFmpeg是一个强大的开源多媒体框架,允许用户解码、编码、转码、复用、解复用、流式处理、过滤和播放各种类型的媒体文件。在这种情况下,FFmpeg用于解码RTSP流,并将其转码为FLV格式。 |
nginx-http-flv-module | 这是一个专门用于通过HTTP传输实时FLV(Flash Video)流的Nginx模块。它作为Nginx的插件,提供了以流式方式提供FLV文件所需的功能 |
整体是使用nginx搭建HTTP FLV流媒体服务器:
流程:摄像头rtsp视频流->rtmp->http-flv.
rtsp转为rtmp需要借助ffmpeg转化。
rtmp转为http-flv需要借助nginx转化。
nginx-http-flv-module是基于nginx-rtmp-module开发的,包含nginx-rtmp-module所有功能,因此不能nginx-rtmp-module同时安装,其编译安装步骤与nginx-rtmp-module类似
安装依赖库:
nginx编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装:
yum -y install gcc gcc-c++
nginx的http模块使用pcre来解析正则表达式,pcre-devel 是使用 pcre 开发的一个二次开发库,nginx需要依赖这两个库,执行如下命令:
yum install -y pcre pcre-devel
nginx使用zlib对http包的内容进行gzip,需要安装此库:
yum install -y zlib zlib-devel
nginx可能需要支持HTTPS,最好在系统中安装好openssl,一般系统自带,可通过如下命令确认:
openssl version
如果安装了会显示版本号,如果提示未安装,执行如下命令安装:
yum install -y openssl openssl-devel
nginx编译和安装
下载nginx:
wget http://nginx.org/download/nginx-1.21.6.tar.gz下载nginx模块HTTP FLV模块:
wget https://github.com/winshining/nginx-http-flv-module/archive/v1.2.10.tar.gz
或者是
https://github.com/winshining/nginx-http-flv-module.git
下载zip包也可以解压nginx和HTTP FLV模块:
tar -zxvf nginx-1.21.6.tar.gz
tar -zxvf v1.2.10.tar.gznginx编译和安装:
./configure --prefix=/usr/local/nginx --add-module=../nginx-http-flv-module-1.2.10
这里配置了–prefix,配置安装路径,不安装到默认路径,以便安装文件移植和卸载,可直接拷贝次目录下的文件到其他电脑运行如果目录不同,启动时通过-p指定目录即可。
make & makeinstall启动nginx,验证是否正确,执行命令(注意安装目录下的sbin/nginx):
/usr/local/nginx/sbin/nginx
打开浏览器输入:http://10.45.12.29/,注意ip为本机ip,显示如下内容,即表示安装成功
修改nginx相关配置支持HTTP FLV
在/home/wangdenuan/nginx/conf/nginx.conf文件中增加:
#user nobody;
worker_processes 1;#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;#pid logs/nginx.pid;events {worker_connections 1024;
}rtmp {server {listen 1935;chunk_size 4096;application myapp {live on;meta off;#为了兼容flvj.jshls on;hls_path /tmp/hls;hls_fragment 4;hls_playlist_length 30;record off;allow play all;}}
}http {include mime.types;default_type application/octet-stream;#log_format main '$remote_addr - $remote_user [$time_local] "$request" '# '$status $body_bytes_sent "$http_referer" '# '"$http_user_agent" "$http_x_forwarded_for"';#access_log logs/access.log main;sendfile on;#tcp_nopush on;#keepalive_timeout 0;keepalive_timeout 65;#gzip on;server {listen 80;server_name localhost;#charset koi8-r;#access_log logs/host.access.log main;location / {root html;index index.html index.htm;}location /hls{add_header Access-Control-Allow-Origin *;types {application/vnd.apple.mpegurl m3u8;video/mp2t ts;}alias /tmp/hls;expires -1;}location /flv {flv_live on;chunked_transfer_encoding on; #支持'Transfer-Encoding: chunked'方式回复add_header 'Access-Control-Allow-Origin' '*'; #添加额外的 HTTP 头add_header 'Access-Control-Allow-Credentials' 'true'; #添加额外的 HTTP 头}#error_page 404 /404.html;# redirect server error pages to the static page /50x.html#error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}}}其配置与RTMP配置增加了HTTP FLV的URI的配置。
配置完成后,执行:/home/wangdenuan/nginx/sbin/nginx -s reload,使得配置生效。
如果是多个rtmp地址
rtmp { # 第一个转流地址server { listen 1935; #监听的端口号application hik01 { #自定义的名字live on; } } # 第二个转流地址server { listen 1936; #监听的端口号application hik02 { #自定义的名字live on; } } # 第N个转流地址server { listen xxxx; #监听的端口号application xxxx { #自定义的名字live on; } }
}
安装ffmpeg
安装FFmpeg需要先安装其依赖:yasm
yum install yasm -y
# 获取
wget https://ffmpeg.org/releases/ffmpeg-4.1.tar.bz2
# 解压
tar -xvf ffmpeg-4.1.tar.bz2
# 查看
cd ffmpeg-4.1
# 编译
./configure
# 安装
make && make install如果make报错,并且和yasm相关,那就配置一下yasm的环境变量以上的在使用的过程中会报错,原因不支持libx264编解码,所以下面的会比较全面。
下载ffmpeg
官网下载linux版的ffmpeg,官网链接:https://ffmpeg.org/
点击 download 按钮,如下图所示:
点击 more releases 超级链接,如下图所示:
选择最新稳定版FFmpeg 5.0.1,点击 Download xz tarball 按钮,如下图所示:
上传ffmpeg到VMware虚拟机
使用xftp将源码包ffmpeg-6.0.tar.xz上传至linux虚拟机(本教程上传至/soft/ffmpeg目录)
解压ffmpeg压缩包
# cd /soft/ffmpeg # tar -xvf ffmpeg-6.0.tar.xz
安装gcc
# yum install -y gcc
安装yasm编译器
进入http://yasm.tortall.net/releases/Release1.3.0.html,下载yasm-1.3.0.tar.gz,上传至/soft/ffmpeg目录下
或者使用 wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
解压yasm
# tar -zxvf yasm-1.3.0.tar.gz
进入解压目录
# cd yasm-1.3.0
编译和安装
# ./configure # make # make install
查看安装结果
# yasm --version
安装nasm
下载:wget https://www.nasm.us/pub/nasm/releasebuilds/2.14.02/nasm-2.14.02.tar.gz
解压
# tar -xvf nasm-2.14.02.tar.gz
进入目录
# cd nasm-2.14.02
编译和安装
# ./configure # make && make install
查看安装结果
# nasm --version
安装libx264
https://code.videolan.org/videolan/x264/ 访问git,然后下载tar.gz
解压x264
# tar -xvf x264-master.tar.gz
进入解压目录
# cd x264-master
编译和安装
# ./configure --enable-shared # make && make install
查看安装结果
# x264 --version
安装ffmpeg
进入ffmpeg解压目录
# cd /soft/ffmpeg/ffmpeg-6.0
指定安装目录/soft/ffmpeg
# ./configure --enable-libx264 --enable-gpl --prefix=/soft/ffmpeg
安装
# make && make install
修改文件/etc/ld.so.conf
# vim /etc/ld.so.conf
添加两行:
/soft/ffmpeg/lib/ /usr/local/lib/
使修改的文件/etc/ld.so.conf
# ldconfig
查看安装结果
# ./ffmpeg -version
配置环境变量
# vim /etc/profile export PATH=$PATH:/soft/ffmpeg/bin
使环境变量生效
# source /etc/profile
查看ffmpeg版本
# ffmpeg -version
问题1 & 解决办法
执行编译ffmpeg(./configure --enable-libx264 --enable-gpl --prefix=/soft/ffmpeg)时,异常:
解决办法1: 下载pkg-config-0.29.2.tar.gz,地址:https://www.freedesktop.org/wiki/Software/pkg-config/
或者直接 wget http://pkgconfig.freedesktop.org/releases/pkg-config-0.29.2.tar.gz 解压压缩包
# tar zxvf pkg-config-0.29.2.tar.gz
进入解压目录
# cd pkg-config-0.29.2
编译与安装
# ./configure --with-internal-glib # make # make check # make install
查看安装结果
# pkg-config –-version
问题2 & 解决办法
安装ffmpeg后,执行 ./ffmpeg -version 时异常
解决办法2: 修改文件/etc/ld.so.conf
# vim /etc/ld.so.conf
添加两行:
/soft/ffmpeg/lib/ /usr/local/lib/
使修改的文件/etc/ld.so.conf生效
# ldconfig
编译之后查看目标文件的链接情况
# ldd ffmpeg
看到的结果是有几个库没有找到链接库文件, 显示xxx not found, 但是库文件是存在的。 见:解决办法2。
配置ffmpeg环境变量
# vim /etc/profile
在最后增加两行
export FFMPEG_HOME=/soft/ffmpeg/ffmpeg-6.0 export PATH=$PATH:$FFMPEG_HOME/bin
使配置生效
# source /etc/profile
启用ffmpeg进行推流
以下命令需要修改rtsp流地址,rtmp地址以服务器实际配置为准,其他命令暂时复制即可。
-rtsp_transport tcp 是将默认的udp协议转为tcp协议,可以一定程度上解决花屏(丢包)的问题。
# 命令
ffmpeg -rtsp_transport tcp -i [rtsp流地址] flv -r 25 -s 1920*1080 -an [转换后的rtmp流地址]
# 实例
ffmpeg -rtsp_transport tcp -i rtsp://admin:123456@192.168.00.00 -f flv -r 25 -s 1920*1080 -an rtmp://localhost:1935/hik01/
# 后台运行,在命令前加nohup,后加 &
nohup ffmpeg -rtsp_transport tcp -i rtsp://admin:123456@192.168.00.00 -f flv -r 25 -s 1920*1080 -an rtmp://localhost:1935/hik01/ &
打开命令提示行,输入如下ffmpeg命令,推送rtmp视频流到rtmp服务器,这里假设rtmp服务器IP为:10.45.12.29
ffmpeg -re -i rtsp://admin:zxm10@@@@10.45.12.141/h264/ch1/main/av_stream -vcodec libx264 -acodec aac -f flv rtmp://10.45.12.29:1935/myapp/mystream
后台运行
nohup ffmpeg -re -i rtsp://admin:zxm10@@@@10.45.12.141/h264/ch1/main/av_stream -vcodec libx264 -acodec aac -f flv rtmp://10.45.12.29:1935/myapp/mystream &
利用VLC等视频工具验证flv流是否可用,VLC下载可自行百度
用VLC播放如下串流:http://10.45.12.29/flv?port=1935&app=myapp&stream=mystream,验证HTTP FLV是否能播放成功
相关文章:

使用nginx和ffmpeg搭建HTTP FLV流媒体服务器(摄像头RTSP视频流->RTMP->http-flv)
名词解释 RTSP (Real-Time Streaming Protocol) 是一种网络协议,用于控制实时流媒体的传输。它是一种应用层协议,通常用于在客户端和流媒体服务器之间建立和控制媒体流的传输。RTSP允许客户端向服务器发送请求,如…...

揭秘APT团体常用的秘密武器——AsyncRAT
AsyncRAT 是 2019 年 1 月在 [GitHub](https://github.com/NYAN-x-CAT/AsyncRAT-C- Sharp)上开源的远控木马,旨在通过远程加密链接控制失陷主机,提供如下典型功能: 截取屏幕 键盘记录 上传/下载/执行文件 持久化 禁用 Windows Defender 关机/…...

Flutter Widget Life Cycle 组件生命周期
Flutter Widget Life Cycle 组件生命周期 视频 前言 了解 widget 生命周期,对我们开发组件还是很重要的。 今天会把无状态、有状态组件的几个生命周期函数一起过下。 原文 https://ducafecat.com/blog/flutter-widget-life-cycle 参考 https://api.flutter.dev/f…...

LeetCode面向运气之Javascript—第2600题-K件物品的最大和-94.68%
LeetCode第2600题-K件物品的最大和 题目要求 袋子中装有一些物品,每个物品上都标记着数字 1 、0 或 -1 。 四个非负整数 numOnes 、numZeros 、numNegOnes 和 k 。 袋子最初包含: numOnes 件标记为 1 的物品。numZeroes 件标记为 0 的物品。numNegOn…...

数学建模学习(4):TOPSIS 综合评价模型及编程实战
一、数据总览 需求:我们需要对各个银行进行评价,A-G为银行的各个指标,下面是银行的数据: 二、代码逐行实现 清空代码和变量的指令 clear;clc; 层次分析法 每一行代表一个对象的指标评分 p [8,7,6,8;7,8,8,7];%每一行代表一个…...

PHP之Smarty使用以及框架display和assign原理
一、Smarty的下载 进入Smarty官网下载,复制目录libs目录即可http://www.smarty.net/http://www.smarty.net/ 二、使用Smarty,创建目录demo,把libs放进去改名为Smarty 三、引入Smarty配置,创建目录,index.php文件配置 <?php…...

《TCP IP网络编程》第十一章
第 11 章 进程间通信 11.1 进程间通信的基本概念 通过管道实现进程间通信: 进程间通信,意味着两个不同的进程中可以交换数据。下图是基于管道(PIPE)的进程间通信的模型: 可以看出,为了完成进程间通信&…...

Folx Pro 5 最好用的Mac磁力链接BT种子下载工具
除了迅雷,还有哪个支持磁力链接下载?Mac电脑如何下载磁力链接?经常有小伙伴问老宅。今天,老宅给大家推荐Folx Pro For Mac,Mac系统超好用的磁力下载工具。 Folx是一款功能强大且易于使用的Mac下载管理器,并…...
Redis 数据库的高可用
文章目录 Redis 数据库的高可用一.Redis 数据库的持久化1.Redis 高可用概念2.Redis 实现高可用的技术2.1 持久化2.2 主从复制2.3 哨兵2.4 Cluster集群 3.Redis 持久化3.1 持久化的功能3.2 Redis 提供持久化的方式3.2.1 RDB 持久化3.2.2 AOF 持久化(append only file…...

elementPlus dialog组件设置可拖动,当内容高度大于视口高度拖动显示异常的解决办法
elementPlus UI的dialog弹框组件在设置了draggable属性后就可拖动弹框,但是当弹框的内容高度大于视口高度时去拖动弹框就会出现显示问题。 解决办法(修改源码) 去node_modules下面找到element-plus文件夹,按照以下路径修改onMou…...

亲测解决Git inflate: data stream error (incorrect data check)
Git inflate: data stream error (incorrect data check) error: unable to unpack… 前提是你的repository在github等服务器或者其他路径有过历史备份/副本,不要求是最新版本的,只要有就可能恢复你做的所有工作。 执行git fsck --full检查损坏的文件 在…...

Ansible 自动化运维工具
Ansible 简介 Ansible 自动化运维工具(机器管理工具)可以实现批量管理多台(成百上千)主机,应用级别的跨主机编排工具。现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点,Pubbet和Saltstac…...

node.js 爬虫图片下载
主程序文件 app.js 运行主程序前需要先安装使用到的模块: npm install superagent --save axios要安装指定版,安装最新版会报错:npm install axios0.19.2 --save const {default: axios} require(axios); const fs require(fs); const superagent r…...

VAE-根据李宏毅视频总结的最通俗理解
1.VAE的直观理解 先简单了解一下自编码器,也就是常说的Auto-Encoder。Auto-Encoder包括一个编码器(Encoder)和一个解码器(Decoder)。其结构如下: 自编码器是一种先把输入数据压缩为某种编码, 后仅通过该编…...

【LangChain】检索器之上下文压缩
LangChain学习文档 【LangChain】检索器(Retrievers)【LangChain】检索器之MultiQueryRetriever【LangChain】检索器之上下文压缩 上下文压缩 LangChain学习文档 概要内容使用普通向量存储检索器使用 LLMChainExtractor 添加上下文压缩(Adding contextual compression with an…...

uniapp 语音文本播报功能
最近uniapp项目上遇到一个需求 就是在接口调用成功的时候加上语音播报 , ‘创建成功’ ‘开始成功’ ‘结束成功’ 之类的。 因为是固定的文本 ,所以我先利用工具生成了 文本语音mp3文件,放入项目中,直接用就好了。 这里用到的工…...
腾讯云高IO型云服务器CPU型号处理器主频性能
腾讯云服务器高IO型CVM实例CPU处理器主频性能说明,高IO型云服务器具有高随机IOPS、高吞吐量、低访问延时等特点,适合对硬盘读写和时延要求高的高性能数据库等I/O密集型应用,腾讯云服务器网分享高IO型云服务器IT5和IT3的CPU处理器说明…...

【数据结构】实验八:树
实验八 树 一、实验目的与要求 1)理解树的定义; 2)掌握树的存储方式及基于存储结构的基本操作实现; 二、 实验内容 题目一:采用树的双亲表示法根据输入实现以下树的存储,并实现输入给定结点的双亲结点…...

kafka消费者api和分区分配和offset消费
kafka消费者 消费者的消费方式为主动从broker拉取消息,由于消费者的消费速度不同,由broker决定消息发送速度难以适应所有消费者的能力 拉取数据的问题在于,消费者可能会获得空数据 消费者组工作流程 Consumer Group(CG&#x…...

【驱动开发day4作业】
头文件代码 #ifndef __HEAD_H__ #define __HEAD_H__ typedef struct{unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPDR;unsigned int IDR;unsigned int ODR; }gpio_t; #define PHY_LED1_ADDR 0X50006000 #define PHY_LED2_ADDR 0X50007000 #…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...

力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...