nginx搭建直播rtmp推流,httpflv拉流环境

news2024/9/23 15:28:26

背景

工作中发现挺多直播CDN在实现httpflv拉流时都没有使用http chunk编码,而是直接使用no-content-length的做法。所以想自己搭建一个直播CDN支持 http chunk编码。

环境搭建

系统环境  Ubuntu 18.04.4 LTS
软件  nginx-1.18.0
nginx扩展模块  nginx-http-flv-module

nginx-http-flv-modulex下载

git clone https://github.com/winshining/nginx-http-flv-module.git

nginx配置安装

./configure --add-module=/home/wanghao/worker/opensourcecode/nginx_module/nginx-http-flv-module
make -j 4 && make install
cd /usr/local/nginx/

nginx.conf配置文件

#user  nobody;
worker_processes  1;

events {
    worker_connections  1024;
}

http { ## http拉流的配置
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;
	
    server {
        listen       80;
        server_name  www.wawa.com;

        location /live {
            flv_live on;
        }
    }
}

rtmp {  ## rtmp推流的配置
    server {
        listen 1935;
        application myapp{
            live on;
            record off;
        }
    }
}

对于不知道文件长度的情况下(例如直播),nginx默认使用chunked_transfer_encoding来传输。 所以,配置文件中不用显示的去设置

Syntax:	 chunked_transfer_encoding on | off;
Default:chunked_transfer_encoding on;
Context: http, server, location

官方连接请点击

【免费分享】音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击788280672加群免费领取~

ffmepg推送本地文件到直播服务器

ffmpeg -re -i q00307z84wz.321002.1.ts -f flv rtmp://192.168.116.130:1935/myapp/123

q00307z84wz.321002.1.ts是一个5分钟的文件,则ffmpeg大概在5分钟后退出。

real    5m0.382s
user    0m22.750s
sys     0m8.141s

httpflv拉流

填写正确的IP地址端口和流ID后进行拉流

# curl -L -v "http://192.168.116.130/live?port=1935&app=myapp&stream=123" -o 1.flv
*   Trying 192.168.116.130...
* TCP_NODELAY set
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0* Connected to 192.168.116.130 (192.168.116.130) port 80 (#0)
> GET /live?port=1935&app=myapp&stream=123 HTTP/1.1
> Host: 192.168.116.130
> User-Agent: curl/7.58.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: nginx/1.18.0
< Date: Fri, 03 Jul 2020 13:49:52 GMT
< Content-Type: video/x-flv
< Transfer-Encoding: chunked
< Connection: keep-alive
< Expires: -1
<
{ [449 bytes data]
100 1068k    0 1068k    0     0    97k      0 --:--:--  0:00:10 --:--:--  117k

可以在响应头中看到使用了http chunk协议,且没有content-length

< Transfer-Encoding: chunked

继续修改nginx.conf,关闭http chunk编码

location /live {
    flv_live on;
    chunked_transfer_encoding off;
}

使用curl拉流测试

# curl -L -v "http://192.168.116.130/live?port=1935&app=myapp&stream=123" -o 1.flv
*   Trying 192.168.116.130...
* TCP_NODELAY set
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0* Connected to 192.168.116.130 (192.168.116.130) port 80 (#0)
> GET /live?port=1935&app=myapp&stream=123 HTTP/1.1
> Host: 192.168.116.130
> User-Agent: curl/7.58.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: nginx/1.18.0
< Date: Fri, 03 Jul 2020 13:59:43 GMT
< Content-Type: video/x-flv
< Connection: keep-alive
< Expires: -1
* no chunk, no close, no size. Assume close to signal end
<
{ [1504 bytes data]
100  668k    0  668k    0     0    98k      0 --:--:--  0:00:06 --:--:--  112k

可以看到已经没有 "Transfer-Encoding: chunked" 的响应头部了,仔细观察,输出了一行英文

* no chunk, no close, no size. Assume close to signal end

no size 就是没有content-length
no chunk 就是没有 Transfer-Encoding: chunked
Assume close to signal end 可以理解为直播服务器主动关闭socket就代表直播流结束了
但是HTTP协议标准是content-length和Transfer-Encodinge二选一,所以no-centent-length的方案是非标准的。
继续深入发现"Connection: keep-alive",一般在直播场景Connection都是close。 HTTP1.1默认使用keep-alive的方式,但是客户端可以在请求的头部中指定使用http短链接的方式。

root@PF1YTXHH-ZTB:/storage/log_live# curl -L -H "Connection:Close" -v "http://192.168.116.130/live?port=1935&app=myapp&stream=123" -o 1.flv
*   Trying 192.168.116.130...
* TCP_NODELAY set
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0* Connected to 192.168.116.130 (192.168.116.130) port 80 (#0)
> GET /live?port=1935&app=myapp&stream=123 HTTP/1.1
> Host: 192.168.116.130
> User-Agent: curl/7.58.0
> Accept: */*
> Connection:Close     # 客户端指定使用close的方式
>
< HTTP/1.1 200 OK
< Server: nginx/1.18.0
< Date: Tue, 07 Jul 2020 13:14:43 GMT
< Content-Type: video/x-flv
< Connection: close   # 服务端也返回了close
< Expires: -1
<
{ [1637 bytes data]
100  236k    0  236k    0     0  89583      0 --:--:--  0:00:02 --:--:-- 89583^C

测试其他直播APP

通过adb logcat抓取快手,斗鱼,虎牙等头部直播APP的日志后,找到拉流地址,自己本地用curl拉流也是发现有挺多流都是
no-content-length,Google下得知,使用这种非标准的no-centengt-length的原因是实现简单。

未完成事项

在拉流http chunk流的时候,使用tcpdump抓包,wireshark分析后,均没有看到http chunk协议,与网上其他教程不符合。还需要再探索下。

tcpdump -i lo host 192.168.116.130  -nnvv -w live2.pcap

因为拉流端和nginx服务器同一台机器,则从本地环回口拉取(lo)抓包,192.168.116.130是本地的内网IP。

原文链接 nginx搭建直播rtmp推流,httpflv拉流环境 - 掘金

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

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

相关文章

数据湖Iceberg、Hudi和Paimon比较

1.社区发展现状 项目Apache IcebergApache HudiApache Paimon开源时间2018/11/62019/1/172023/3/12LicenseApache-2.0Apache-2.0Apache-2.0Github Watch1481.2k70Github Star5.3k4.9k 1.7k Github Fork1.9k2.3k702Github issue(Open)898481263Github issue(closed)20542410488…

使用yolo-seg模型实现自定义自动动态抠图

yolov8导航 如果大家想要了解关于yolov8的其他任务和相关内容可以点击这个链接&#xff0c;我这边整理了许多其他任务的说明博文&#xff0c;后续也会持续更新&#xff0c;包括yolov8模型优化、sam等等的相关内容。 YOLOv8&#xff08;附带各种任务详细说明链接&#xff09; …

【MySQL】多表操作、事务、索引

MySQL MYSQL 多表设计 一对多插入测试数据外键约束(物理外键)使用逻辑外键 MYSQL 多表设计 一对一表结构 MYSQL 多表设计 多对多 MYSQL 多表设计 一对多 建表语句 员工表 CREATE TABLE tb_emp (id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT ID,username VARCHAR(20) N…

10大数据恢复软件可以帮助您恢复电脑数据

您可能会非常紧张&#xff0c;因为知道有人意外地从您的硬盘驱动器中删除了您的宝贵数据&#xff08;甚至使用 ShiftDelete 从回收站中删除&#xff09;&#xff0c;并且您确实需要这些数据&#xff0c;并且没有其他备份源可以在其中找到这些数据。不要担心&#xff0c;保持冷静…

Unity中URP实现水体效果(水的深度)

文章目录 前言一、搭建预备场景1、新建一个面片&#xff0c;使其倾斜一个角度&#xff0c;来模拟水底和岸边的效果2、随便创建几个物体&#xff0c;作为与水面接触的物体3、再新建一个面片&#xff0c;作为水面 二、开始编写水体的Shader效果1、新建一个URP基础Shader2、把水体…

编译GCC native编译器的几点启示

启示 编译 GCC native compiler按照官方介绍并不难 步骤见后面实践脚本&#xff0c;以及官方编译指南链接 GCC编译器编译其它程序组件时&#xff0c;会优先使用自身携带的库&#xff0c;例如&#xff0c;常用的自带库&#xff0c;libgcc_s.so、libstdc 如果部署环境与编译要求…

思维导图教你如何学会计算机组成原理

02 给你一张知识地图&#xff0c;计算机组成原理应该这么学 了解了现代计算机的基本硬件组成和背后最基本的冯诺依曼体系结构&#xff0c;我们就可以正式进入计算机组成原理的学习了。在学习一个一个零散的知识点之前&#xff0c;我整理了一份学习地图&#xff0c;好让你对将要…

目标跟踪之KCF详解

High-Speed Tracking with Kernelized Correlation Filters 使用内核化相关滤波器进行高速跟踪 大多数现代跟踪器的核心组件是判别分类器&#xff0c;其任务是区分目标和周围环境。为了应对自然图像变化&#xff0c;此分类器通常使用平移和缩放的样本补丁进行训练。此类样本集…

第三篇:CamX日志打印系统

第三篇:CamX日志打印系统 高通camx的日志主要分2大模块,UMD (user mode driver) 和KMD( kerner mode driver),也就是用户层和kernel层日志。 下面就来看下这2大块日志debug的时候该如何设置? 一、UDM日志 高通camx camera debug日志格式如下: CamX: [][] : . 例子:Ca…

【C++】类与对象—— 初始化列表 、static 静态成员、

类与对象 1 再谈构造函数1.1 构造函数体赋值1.2 初始化列表语法&#xff1a;建议&#xff1a;初始化顺序&#xff1a;注意&#xff1a; 1.3 explicit关键字 2 static 静态成员2.1 概念2.2 声明成员变量2.3 使用类的静态成员2.4 定义静态成员总结 Thanks♪(&#xff65;ω&#…

提高自定义词汇表上的 RAG 性能

原文地址&#xff1a;improve-rag-performance-on-custom-vocabulary Code&#xff1a;Improve RAG performance on custom vocabulary.ipynb 2024 年 2 月 9 日 糟糕的检索系统会导致混乱、沮丧和幻觉。 新的嵌入模型比以往更加强大。我们根据 MTEB 等基准对其进行了全面评…

go 1.18 不同目录package引用问题

go 1.18开始使用module了 不同的package在vs code中引用的话 需要先开启 是Go1.11版本之后 推出的版本管理工具 有点类似java的 maven工具 可以引入依赖使用 go env -w GO111MODULEon 先把这个打开 然后在创建的vs code工作目录下 执行 module gomdoule module 模块名 会生…

前后端分离Vue+nodejs校园论坛bbs系统x450z

开发语言 node.js 框架&#xff1a;Express 前端:Vue.js 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;VScode本论文拟采用计算机技术设计并开发的论坛bbs系统&#xff0c;主要是为用户提供服务。使得用户可以在系统上查看帖子信息、签到积分等…

unity hub (第一部)初学配置

1、安装Unity Hub 2、设置中文 3、安装编辑器 4、新建项目 5、新建完成后进入编辑器 6、 编辑器设置中文 editPreferencesLanguages选择中文

数学建模资料分享

1. 往年各赛题的优秀论文 可以用来参考一下论文是怎么写的。参考论文的结构&#xff0c;格式&#xff0c;思路等等。 链接&#xff1a;https://pan.baidu.com/s/1WG2t4-x9MjtaSgkq4ue5AQ?pwdnlzx 提取码&#xff1a;nlzx --来自百度网盘超级会员V4的分享 2.论文模板 链接&a…

学习JAVA的第二天(基础)

目录 基本概念 关键字 class关键字 字面量 练习 变量 定义格式 变量使用 数据类型 基本数据类型 标识符 命名规则 键盘录入 1.导包 2.创建对象 3.接受数据 运算符 算术运算符 练习 隐式转换&#xff08;自动类型提升&#xff09; 强制转换 自增自减运算符 …

众安保险基于Apache SeaTunnel的生产应用实践

*> 文&#xff5c;曾力 众安保险大数据开发高级专家 编辑整理&#xff5c; 曾辉* 前言 众安保险从2023年4月就开始了数据集成服务的预研工作&#xff0c;意在通过该服务解决当前数据同步场景下的两大痛点&#xff0c;服务化能力薄弱和无分布式同步能力。我们对多种开源数据…

【Java程序设计】【C00291】基于Springboot的网上图书商城(有论文)

基于Springboot的网上图书商城&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的网上图书商城 本系统分为系统功能模块、管理员功能模块以及卖家功能模块。 系统功能模块&#xff1a;在系统首页可以查看首页、图书…

社区志愿者齐心协力,为社区居民营造温馨和谐环境

近日&#xff0c;在我们的社区里&#xff0c;一场温暖而有力的力量正在悄然兴起。一群热心居民自发组织成为社区志愿者团队&#xff0c;积极投身于服务社区的各项活动中&#xff0c;为居民们营造了一个温馨和谐的生活环境。 在每个周末的清晨&#xff0c;志愿者们早早地聚集在社…

匿名+有名管道

管道 相关概念 4种情况 正常情况&#xff0c;如果管道没有数据&#xff0c;读端陷入等待&#xff0c;直到有数据才能唤醒正常情况&#xff0c;如果管道被写满&#xff0c;写端陷入等待&#xff0c;直到有空间才能唤醒写段关闭&#xff0c;读端一直读取&#xff0c;read返回0…