如何搭建直播平台rtmp推流

背景

工作中发现挺多直播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
复制代码

官方连接请点击

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  CurrentDload  Upload   Total   Spent    Left  Speed0     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  CurrentDload  Upload   Total   Spent    Left  Speed0     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  CurrentDload  Upload   Total   Spent    Left  Speed0     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。

如何搭建直播平台rtmp推流相关推荐

  1. 如何从零开始搭建直播平台,从flash时代的rtmp到过渡期的flv和webrtc的未来以及简单聊聊webassmbly

    前言 在2020年12月flash正式落幕之后,流媒体领域是否有新的技术替代?有没有较为成熟的整体方案?市面上的直播/流媒体平台都在使用哪些方案?有没有通用又简单快速的搭建方案?不同的方案在行业内部也 ...

  2. 怎么搭建直播平台,直播环境搭建该怎样做?

    怎么搭建直播平台,直播环境搭建该怎样做? 目录 环境准备 ●Centos系统安装:请查看我的另一篇博客Java后端之路(六)安装Linux系统 ●git安装(系统如果没有的话):www.cnblogs ...

  3. 搭建直播平台,你需要先知道这些

    搭建直播平台,你需要先知道这些 一.直播知识小科普 一个典型的直播流程:录制->编码->网络传输(推流->服务器处理->CDN分发)->解码->播放 IPB:一种常 ...

  4. 在线直播源码搭建直播平台的后端

    在线直播源码搭建直播平台的后端 后端项目初始化 1.全局安装express脚手架 额,这个应该是属于准备工作的.给忘记了,那就凑合放在这里吧,别打我,我知道错了,但我就是不改[狗头保命] cnpm i ...

  5. 如何搭建直播平台?直播平台搭建需要注意什么?...

    过去的一年成为了直播行业的分水岭,头部直播平台已然占有了市场上绝大多数的用户流量,直播行业进入了真正意义上的平稳发展时期.而面对垂直细分领域的用户流量,很多人还是想要尝试搭建直播平台进行运营的.那么, ...

  6. Android如何来搭建直播平台

    Android如何来搭建直播平台 目录 环境准备 ●Centos系统安装:请查看我的另一篇博客Java后端之路(六)安装Linux系统 ●git安装(系统如果没有的话):www.cnblogs.com ...

  7. 如何搭建直播平台?直播平台搭建需要注意什么?

    过去的一年成为了直播行业的分水岭,头部直播平台已然占有了市场上绝大多数的用户流量,直播行业进入了真正意义上的平稳发展时期.而面对垂直细分领域的用户流量,很多人还是想要尝试搭建直播平台进行运营的.那么, ...

  8. Android平台RTMP推流或轻量级RTSP服务(摄像头或同屏)编码前数据接入类型总结

    很多开发者在做Android平台RTMP推流或轻量级RTSP服务(摄像头或同屏)时,总感觉接口不够用,以大牛直播SDK为例 (Github) 我们来总结下,我们常规需要支持的编码前音视频数据有哪些类型 ...

  9. 利用nginx搭建搭建直播平台中视频点播、直播、HLS服务器

    利用nginx搭建搭建直播平台中视频点播.直播.HLS服务器 nginx的服务器的搭建 安装nginx的依赖库 <span style="color:#000000"> ...

最新文章

  1. 计算机二级公共基础知识2017,2017年计算机二级公共基础知识基础试题
  2. rpm包时遇到Header V3 DSA signature: NOKEY时解决办法
  3. [转载] 在网页中拖放和停靠div的例子
  4. pythonrange函数用法_python range()函数详细用法
  5. ubuntu 操作记录
  6. new函数的底层实现
  7. HDU2521 反素数【因子数量+打表+水题】
  8. 游戏开发之使用类封装动态数组(vector)(C++基础)
  9. Rust导出Python/Node.js可用的DLL库
  10. linux oracle ojdbc,Maven无法下载Oracle驱动ojdbc的解决方式
  11. 矩阵与矩阵的转置相乘
  12. 汉澳Sinox2014X64server高级桌面服务器版操作系统发布
  13. Windows API大全
  14. Omise携手i2c促进东南亚发卡现代化和加速发卡能力提升
  15. 基于WEB的网上在线图书商城
  16. WP博客几款好看的图片类模板分享
  17. 大数据技术与应用实训心得_大数据心得体会
  18. Oracle HR 样例用户的建立 10g,11g均可
  19. mysql(十)条件语句、循环语句、动态执行SQL语句
  20. 大唐波斯将军 机器人_波斯帝国被阿拉伯所灭,末代王子三次求助大唐,为何唐朝没有出兵...

热门文章

  1. 计算机科学与技术报告的前沿应用领域,计算机科学与技术的应用领域简述论文.doc...
  2. C语言程序设计学习笔记:P5-循环控制
  3. 非易失性数据库系统存储与恢复方法
  4. 做自媒体短视频,做好了这8点,你每天也可以收益200+
  5. 回顾显示技术历史,展望强大的QD MiniLED显示屏技术
  6. Android Studio 提示Please select android sdk
  7. 网易严选商城小程序全栈开发,域名备案中近期上线(mpvue+koa2+mysql)
  8. scp远程服务器拷贝到远程服务器
  9. 海贝音乐播放后出现android,海贝音乐支持安卓IOS_音频HiFi-中关村在线
  10. 浅谈大规模k8s集群关于events的那些坑