使用nginx搭建HTTP FLV流媒体服务器

转载自:https://blog.csdn.net/water1209/article/details/128708318,原博主写得特别好,示例不仅从摄像头到web都体现了,还把hls和http-flv也示范了,尊重原创,请给予原博主多点关注。

使用nginx搭建HTTP FLV流媒体服务器

1 HTTP FLV简介

前文已经介绍了RTSP、RTMP、HLS的流媒体协议,还有一种比较常见的流媒体协议HTTP FLV,其兼具RTMP的实时性及HLS的网络适应性的优点,在很多点直播领域广泛应用。网上有人总结了HTTP FLV、RTMP、HLS的对比,如下表所示:

协议名HTTP FLVRTMPHLS
传输方式HTTPTCPHTTP
视频封装格式flvchunk(rtmp header+body(tag body))TS
视频时延
数据格式连续音视频流连续音视频流TS切片文件
web无插件播放支持,通过flv.js不支持,需要flash插件支持,直接HTML5的video标签即可播放
防火墙或代理穿透支持不支持支持

其中当前直播流域用的最广泛的是RTMP和HTTP-FLV,因为其非常低的视频时延,可做到1s左右,本文介绍HTTP FLV的流媒体服务搭建方式,有关FLV格式文章,参照:https://blog.csdn.net/water1209/article/details/128562747
HTTP-FLV是将流媒体数据先封装成FLV格式,然后通过HTTP协议传输给客户端,通过HTTP FLV的直播,这里使用了一个HTTP的协议约定,http 的content-length头字段如果不存在,则客户端就会一直接收数据,直到HTTP连接断开为止,其流程很简单,视频客户端发送HTTP请求,不带content-length头字段,服务器响应HTTP,并一直发送FLV的数据;客户端接收响应并一直接收数据直到连接断开。
有关HLS、RTMP、FLV通过nginx搭建相关协议的流媒体服务器的文章,公众号壹零仓,发送nginx,查看相关文章

2 HTTP FLV流媒体服务搭建

nginx-http-flv-module是基于nginx-rtmp-module开发的,包含nginx-rtmp-module所有功能,因此不能nginx-rtmp-module同时安装,其编译安装步骤与nginx-rtmp-module类似,如下:

  1. 安装依赖库:
    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

  2. 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

  • 解压nginx和HTTP FLV模块:
    tar -zxvf nginx-1.21.6.tar.gz
    tar -zxvf v1.2.10.tar.gz

  • nginx编译和安装:
    ./configure --prefix=/home/wangdenuan/nginx --add-module=../nginx-http-flv-module-1.2.10
    这里配置了–prefix,配置安装路径,不安装到默认路径,以便安装文件移植和卸载,可直接拷贝次目录下的文件到其他电脑运行如果目录不同,启动时通过-p指定目录即可。
    make&makeinstall

  • 启动nginx,验证是否正确,执行命令(注意安装目录下的sbin/nginx):
    /home/wangdenuan/nginx/sbin/nginx
    打开浏览器输入:http://10.45.12.29/,注意ip为本机ip,显示如下内容,即表示安装成功
    1

  1. 修改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 live {
                        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,使得配置生效。

3 结果验证

  • 在PC机上安装ffmpeg,具体安装方式可百度

  • 找一个可播放的RTSP地址,通过vlc播放器验证rtsp地址播放是否正常,这里以rtsp://admin:zxm10@@@@10.45.12.141/h264/ch1/main/av_stream为例:
    在这里插入图片描述

  • 打开命令提示行,输入如下ffmpeg命令,推送rtmp视频流到rtmp服务器,这里假设rtmp服务器IP为:10.45.12.29
    ffmpeg -i rtsp://admin:zxm10@@@@10.45.12.141/h264/ch1/main/av_stream -vcodec copy -acodec copy -f flv rtmp://10.45.12.29:1935/live/test
    ffmpeg推流命令成功后,出现如下图所示界面:
    4

  • 用vlc播放如下串流:rtmp://10.45.12.29:1935/live/test,验证是否rtmp拉流成功:
    在这里插入图片描述

  • 用VLC播放如下串流:http://10.45.12.29/hls/test.m3u8,验证HLS是否能够播放成功:
    在这里插入图片描述

  • 用VLC播放如下串流:http://10.45.12.29/flv?port=1935&app=live&stream=test,验证HTTP FLV是否能播放成功
    在这里插入图片描述

要通过websocket将海康rtsp视频流转换为http-flv格式并传输到前端,可以使用以下步骤: 1. 在C++中使用popen()函数调用ffmpeg指令,将输出流重定向到管道中。 ```cpp #include <cstdio> #include <cstdlib> int main() { FILE* pipe = popen("ffmpeg.exe -i rtsp://ip_address:port/stream_url -c:v copy -c:a aac -f flv -", "r"); // 替换为你的rtsp流地址 if (!pipe) { std::cerr << "Failed to execute ffmpeg command." << std::endl; return -1; } // 从管道中读取输出流并处理 char buffer[1024]; while (fgets(buffer, sizeof(buffer), pipe) != NULL) { // 处理输出流,例如打印或保存到文件中 } // 关闭管道 pclose(pipe); return 0; } ``` 在上述代码中,我们使用了popen()函数来执行ffmpeg指令,并将输出流重定向到管道中。管道可以通过读取文件来操作,因此我们可以使用fgets()函数从管道中读取输出流并进行处理。 2. 在C++中使用websocket库来实现websocket服务器,并将ffmpeg的输出流发送到前端。 ```cpp #include <iostream> #include <websocketpp/server.hpp> #include <websocketpp/config/asio_no_tls.hpp> typedef websocketpp::server<websocketpp::config::asio> server; int main() { // 创建websocket服务器 server ws_server; // 设置websocket服务器的回调函数 ws_server.set_message_handler([&ws_server](websocketpp::connection_hdl hdl, server::message_ptr msg) { // 接收来自前端的信息并处理 }); // 连接到ffmpeg的输出流 FILE* pipe = popen("ffmpeg.exe -i rtsp://ip_address:port/stream_url -c:v copy -c:a aac -f flv -", "r"); if (!pipe) { std::cerr << "Failed to execute ffmpeg command." << std::endl; return -1; } // 从管道中读取输出流并发送到前端 char buffer[1024]; while (fgets(buffer, sizeof(buffer), pipe) != NULL) { // 将buffer作为websocket消息发送到前端 ws_server.send("websocket connection", buffer, websocketpp::frame::opcode::binary); } // 关闭管道 pclose(pipe); return 0; } ``` 在上述代码中,我们使用了websocketpp库来创建websocket服务器,并将ffmpeg的输出流发送到前端。我们首先创建了一个websocket服务器,并设置了服务器的回调函数。当接收到来自前端的消息时,回调函数将会被调用,并进行相应的处理。接着,我们使用popen()函数连接到ffmpeg的输出流,并从管道中读取输出流。每当从管道中读取到数据时,我们就将该数据作为websocket消息发送到前端。 需要注意的是,上述代码仅为示例代码,实际应用中可能需要进行更多的配置和优化,例如设置websocket服务器的端口、协议、缓冲区大小等。另外,由于websocket协议可以使用多种编码方式,因此在前端进行解码时需要根据实际情况选择正确的编码方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值