使用nginx和ffmpeg搭建HTTP FLV流媒体服务器(摄像头RTSP视频流->RTMP->http-flv)

news2024/11/25 15:54:57

名词解释

 

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)是两种用于实时流媒体传输的协议,它们有以下几个主要区别:

  1. 传输方式:RTSP使用TCP(可选择使用UDP)作为传输层协议,而RTMP只使用TCP。RTSP通过建立控制连接和数据连接分离的方式来实现对流媒体的控制和数据传输,而RTMP在单个连接上同时进行控制和数据传输。

  2. 功能和用途:RTSP主要用于流媒体的控制和会话管理,在播放、暂停、跳转等操作方面提供了更灵活的控制能力。RTMP则专注于实时的音视频数据传输和交互,适用于直播、视频聊天等场景。

  3. 平台支持:RTSP是一种开放的标准协议,广泛应用于多种平台和设备,包括PC、移动设备、智能电视等。RTMP最初由Adobe开发,尽管它也被广泛应用于许多平台,但在某些平台和设备上可能受到限制或需要特殊许可。

  4. 压缩和编码支持:RTMP支持广泛的音视频编码格式,包括H.264、AAC等。而RTSP在原始协议中并不支持压缩和编码,但可以与其他压缩协议(如RTP)结合使用来实现音视频数据的传输。

总的来说,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.gz

nginx编译和安装:
./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.js
                        hls 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是否能播放成功

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

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

相关文章

数据分析工具与技术

数据分析工具与技术 数据分析技术 数据分析工具 备选方案分析 一种对已识别的可选方案进行评估的技术,用来决定选择哪种方案 或使用何种方法来执行项目工作。 其他风险参数评估 为了方便未来分析和行动,在对单个项目风险进行优先级排序时&#xff0…

GO内存模型(同步机制)

文章目录 概念1. 先行发生 编译器重排同步机制init函数协程的创建channelsync 包1. sync.mutex2. sync.rwmutex3. sync.once atomic 参考文献 概念 1. 先行发生 The happens before relation is defined as the transitive closure of the union of the sequenced before and …

超详细-Vivado配置Sublime+Sublime实现Verilog语法实时检查

目录 一、前言 二、准备工作 三、Vivado配置Sublime 3.1 Vivado配置Sublime 3.2 环境变量添加 3.3 环境变量验证 3.4 Vivado设置 3.5 配置验证 3.6 解决Vivado配置失败问题 四、Sublime配置 4.1 Sublime安装Package Control 4.2 Sublime安装Verilog插件 4.3 安装语…

centos7中MySQL备份还原策略

目录 一、直接拷贝数据库文件 1.1在shangke主机上停止服务并且打包压缩数据库文件 1.2 在shangke主机上把数据库文件传输到localhost主机上(ip为192.168.33.157) 1.3在localhost主机上停止服务,解压数据库文件 1.4 在localhost主机上开启服务 1.5 测试 二、m…

利用@Excel实现复杂表头导入

EasyPoi导入 <a-upload name"file" :showUploadList"false" :multiple"false" :headers"tokenHeader" :action"importExcelUrl"change"handleImportExcel"><a-button type"primary" icon&quo…

【软件测试】如何选择回归用例

目录 如何在原始用例集中挑选测试用例 具体实践 总结 本文讨论一下在回归测试活动中&#xff0c;如何选择测试用例集。 回归测试用例集包括基本测试用例集&#xff08;原始用例&#xff09;迭代新增测试用例集&#xff08;修复故障引入的用例和新增功能引入的用例集&#xf…

洛必达法则和分部积分的应用之计算数学期望EX--概率论浙大版填坑记

如下图所示&#xff0c;概率论与数理统计浙大第四版有如下例题&#xff1a; 简单说就是&#xff1a;已知两个相互独立工作电子装置寿命的概率密度函数&#xff0c;将二者串联成整机&#xff0c;求整机寿命的数学期望。 这个题目解答中的微积分部分可谓是相当的坑爹&#xff0c;…

【1++的C++初阶】之适配器

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的C初阶】 文章目录 一&#xff0c;什么是适配器二&#xff0c;栈与队列模拟实现三&#xff0c;优先级队列四&#xff0c;reverse_iterator 一&#xff0c;什么是适配器 适配器作为STL的六大组…

【高阶数据结构】跳表

文章目录 一、什么是跳表二、跳表的效率如何保证&#xff1f;三、skiplist的实现四、skiplist跟平衡搜索树和哈希表的对比 一、什么是跳表 skiplist本质上也是一种查找结构&#xff0c;用于解决算法中的查找问题&#xff0c;跟平衡搜索树和哈希表的价值是 一样的&#xff0c;可…

Windows环境Docker安装

目录 安装Docker Desktop的步骤 Docker Desktop 更新WSL WSL 的手动安装步骤 Windows PowerShell 拉取&#xff08;Pull&#xff09;镜像 查看已下载的镜像 输出"Hello Docker!" Docker Desktop是Docker官方提供的用于Windows的图形化桌面应用程序&#xff0c…

区间预测 | MATLAB实现QRBiLSTM双向长短期记忆神经网络分位数回归多输入单输出区间预测

区间预测 | MATLAB实现QRBiLSTM双向长短期记忆神经网络分位数回归多输入单输出区间预测 目录 区间预测 | MATLAB实现QRBiLSTM双向长短期记忆神经网络分位数回归多输入单输出区间预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 区间预测 | MATLAB实现QRBiLSTM…

odoo16 用好计量单位中的激活功能

odoo16 用好计量单位中的激活功能 根据国内常用&#xff0c;把不常用的单位去除&#xff0c;删除不了&#xff0c;提示已用&#xff0c;其实不用删除&#xff0c;每个单位后有个激活功能&#xff0c;选一下就可以了&#xff0c;显示成整洁的界面了 第一次用时&#xff0c;小伙伴…

解决spring cloud 中使用spring security全局异常处理器失效

写auth认证模块实现忘记密码与注册功能时&#xff0c;用异常抛出&#xff0c;全局异常处理器无法捕获。 无法进行异常捕捉 解决方案&#xff1a;使用WebSecurityConfigurerAdapter.configure中http实现自定义异常&#xff1a; EnableWebSecurity EnableGlobalMethodSecurity(…

87、springcloud核心组件及其作用

spring Eureka: 服务注册与发现 注册:&#xff1a;每个服务都向Eureka登记自己提供服务的元数据&#xff0c;包括服务的ip地址、端口号、版本号、通信协议等 eureka将各个服务维护在了一个服务清单中 (双层Map&#xff0c;第一层key是服务名&#xff0c;第二层key是实例名&…

macOS 源码编译 qpress

╰─➤ git clone https://github.com/PierreLvx/qpress.git ╰─➤ cd qpress ╰─➤ make g -O3 -o qpress -x c quicklz.c -x c qpress.cpp aio.cpp utilities.cpp -lpthread -Wall -Wextra -Werror ╰─➤ sudo make install …

Vue--》打造个性化医疗服务的医院预约系统(三)

今天开始使用 vue3 + ts 搭建一个医院预约系统的前台页面,因为文章会将项目的每一个地方代码的书写都会讲解到,所以本项目会分成好几篇文章进行讲解,我会在最后一篇文章中会将项目代码开源到我的GithHub上,大家可以自行去进行下载运行,希望本文章对有帮助的朋友们能多多关…

Java基础小知识(待续)

类型转换、ASCII码、除法取余、三元表达式 long x 100;//int->long自动类型转换&#xff08;隐式) 1&#xff0e;特点:代码不需要进行特殊处理&#xff0c;自动完成。2&#xff0e;规则:数据范围从小到大。double y 2.5F;//2.5 float->double自动类型转换&#xff08…

pyqt5-Ctrl+鼠标滚轮实现文本区文字大小调整

技术简介 在 PyQt5 中&#xff0c;你可以使用 QTextEdit 的 wheelEvent 方法和 QKeyEvent 的 key() 方法来检测 Ctrl 键和鼠标滚轮事件&#xff0c;从而实现按下 Ctrl 键并滚动鼠标滚轮时&#xff0c;调整 QTextEdit 的字体大小。 这个示例中&#xff0c;我们创建了一个窗口&am…

模板方法模式(java)

目录 结构 案例 代码实现 抽象类 具体子类 测试类 优缺点 优点 缺点 结构 模板方法&#xff08;Template Method&#xff09;模式包含以下主要角色&#xff1a; 抽象类&#xff08;Abstract Class&#xff09;&#xff1a;负责给出一个算法的轮廓和骨架。它由一个模板…

基于SPDK-vhost的云原生Kubevirt虚拟化存储IO的优化方案

摘要 本文主要介绍针对云原生kubernetes虚拟化IO的应用场景&#xff0c;在Kubevirt中引入SPDK-vhost的支持&#xff0c;来加速虚机中IO存储性能。同时基于Intel开源的Workload Service Framework[1]平台集成部署一套端到端虚拟化IO的应用场景做基本的性能对比测试。 云原生Kube…