FFmpeg+Nginx+RTMP/HLS 快速搭建直播网站
直播引言与实战效果直播原理与架构
项目简介
视频直播网站由三个部分构成:1.推流端 2.服务器 3.拉流端。
-
推流端用 ffmpeg 完成,
-
服务器由 NGINX+RTMP 模块完成,
-
拉流端使用 videojs/vlc 完成。
直播架构图
开发环境简介
-
推流端:系统:windows10 工具:ffmpeg
-
服务器:系统:centos7.8 工具:NGINX+RTMP
-
拉流端:系统:WINDOWS 10 工具:videojs/vlc
搭建 Nginx 直播服务器
服务器由 NGINX+RTMP 构成。 NGINX 是 HTTP 服务器,RTMP 是附加模块。 其中 NGINX 我选择的是用源码编译方式进行安装,因为这种方式可以自定义安装指定的模 块以及最新版本。
在我们准备好系统环境之后,我们就需要开始安装 Nginx 了,安装 Nginx 我们需要先把他的 依赖给安装,然后下载相关的源码进行编译,最后执行编译安装
安装 Nginx 依赖
在我们更新软件源完成之后,就可以安装 Nginx 等一些软件的依赖环境,执行的命令如 下所示
yum install -y gcc gcc-c++ autoconf pcre pcre-devel make automake yum install -y wget httpd-tools vim
下载源码
我 们 首 先 将 需 要 的 模 块 下 载 下 来 , 这 里 使 用 nginx-rtmp-module , 而 是 使 用 nginx-http-flv-module 来替代,因为后者是基于前者开发的,前者拥有的功能后者都有,后 者是国内的开发开发,有中文文档,所以就采用它了,首先将它下载下来并解压,执行的命 令如下所示
cd /opt wget https://github.com/winshining/nginx-http-flv-module/archive/master.zip
然后,解压:命令执行之后,返回的信息如下图所示
unzip master.zip
从上图中可以看出已经下载并解压完成, 接着我们还需要下载 nginx 本身的源码, 下载 Nginx 源码并解压的命令如下所示
wget http://nginx.org/download/nginx-1.17.6.tar.gz
然后解压:
tar -zxvf nginx-1.17.6.tar.gz
编译安装
接着我们进入编译安装环节,首先进入刚才解压的 nginx 目录当中,执行的命令如下所示 cd nginx-1.17.6 && ls 命令执行之后,返回的信息如下图所示
从上图中可以看到解压出来的目录结构,我们执行./configure 便可以配置编译参数,这个地 方我们需要将刚才下载的插件 nginx-http-flv-module 加入进来,执行的命令如下所示
./configure --add-module=../nginx-http-flv-module-master
命令执行之后,返回的信息如下图所示
在上图中可以看到准备编译已经完成,但在编译的过程当中有可能会出现一些意外因素, nginx 默认编译非常严格,只要遇到一些意外就会中断编译,因此我们将一些非致命的意外 设置为警告模式,执行命令如下所示
vim objs/Makefile
在当前文件夹下有一个 objs/Makefile 文件,我们将里面的-Werror 删除,用 vim 打开文件后如下所示
删除之后,保存并退出,接着就可以进行编译 Nginx 了,编译的过程稍微有点长,执行的命 令如下所示
make && make install
安装命令执行之后,返回的信息如下图所示
配置 rtmp 服务
在完成 Nginx 的安装之后,我们需要对 Nginx 进行一番配置,并启动 Nginx 服务
我们直接使用 vim 命令去编辑 Nginx 的配置文件,执行命令如下所示 vim /usr/local/nginx/conf/nginx.conf 预览 vim 命令执行之后,打开的编辑窗口如下所示
rtmp { server { listen 1935; chunk_size 4096; application live1{ live on; }application hls1{ live on; hls on; hls_path /usr/local/ngigx/html/hls1; } application vod { play /opt/video/vod; } } }
创建必要目录
mkdir -p /usr/local/nginx/html/hls1 mkdir -p /tmp/hls mkdir -p /opt/video/vod
参数说明
rtmp { #RTMP 服务 server { listen 1935; #//服务端口 chunk_size 4096; #//数据传输块的大小 application live1{ #这个是“直播” live on; #//视频文件存放位置。 }application hls1{ #这个是“HLS 直播” live on; #//视频文件存放位置。 hls on; hls_path /usr/local/ngingx/html/hls1; #注意:需要手工创建/tmp/hls 目录,mkdir -p /tmp/hls } application vod { #这个是“点播” play /opt/video/vod; #//视频文件存放位置。 } } }
验证配置
粘贴完成并保存之后,我们在终端执行 nginx -t 命令,来测试一下配置文件是否有异常,执 行命令如下所示
/usr/local/nginx/sbin/nginx -t
在上图中可以看出 Nginx 提示我们配置文件没有异常,说明我们配置没有语法错误,我们启 动一下 Nginx,执行命令如下所示:
/usr/local/nginx/sbin/nginx
浏览器测试访问
搭建 VLC,实战点播功能
VLC 播放器简介
1、VLC 播放器
VLC 支持多种常见音视频格式,支持多种流媒体传输协议,也可当做本地流媒体服务器 使用,功能十分强大。
官网下载地址:
VLC 多媒体播放器(最初命名为 VideoLAN 客户端)是 VideoLAN 计划的多媒体播放器。 它支持众多音频与视频解码器及文件格式,并支持 DVD 影音光盘,VCD 影音光盘及各类流 式协议。它也能作为 unicast 或 multicast 的流式服务器在 IPv4 或 IPv6 的高速网络连接下 使用。它融合了 FFmpeg 计
划的解码器与 libdvdcss 程序库使其有播放多媒体文件及加密 DVD 影碟的功能。
2、VLC media player
VLC 是一款自由、开源的跨平台多媒体播放器及框架,可播放大多数多媒体文件,以及 DVD、音频 CD、VCD 及各类流媒体协议。
VLC 的全名是 Video Lan Client,是一个开源的、跨平台的视频播放器。
VLC 支持大量的音视频传输、封装和编码格式,下面给出一个简要的不完整的列表
3、VLC 打开网络串流
播放内容如下所示
5 VLC 作为流媒体服务器
VLC 的功能很强大,它不仅仅是一个视频播放器,也可作为小型的视频服务器,更可 以一边播放一边转码,把视频流发送到网络上。
搭建 FFmpeg,实战直播推流
FFmpeg 搭建环境,实现推流、拉流
FFmpeg 搭建环境 :
下载地址:
http://www.ffmpeg.org/download.html
FFmpeg 本地文件推流
-re 已帧率方式推
-i 指定文件
-vcodec 视频编码
-acodec 音屏编码
-f 指定输出格式
ffmpeg -re -i zhang.mp4 -vcodec libx264 -acodec aac -f flv rtmp://81.69.46.175/hls1/test1
VLC 测试
http://81.69.46.175/hls1/test1.m3u8
可以看到产生了好多视频片段, test1.m3u8 中 存取了视频片段
win取消推流,使用rtmp协议拉流
FFmpeg 摄像头推流
ffmpeg -f dshow -i video="Integrated Camera" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f flv rtmp://81.69.46.175/hls1/test
FFmpeg 简介
ffmpeg 是一个跨平台的音视频处理库,为了跨平台那么就需要编译出适用于各个平台的 ffmpeg 库。 一般在 windows 平台下会进行 windows 开发和安卓开发,所以本文的目的就是在 windows 平台下编译用于 windows 和安卓使用的 ffmpeg 库 FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其
转化为流的开源计算机 程序。采用 LGPL 或 GPL 许可证。它提供了录制、转换以及流化音视频的完整解决方案。 它包含了非常先进的音频/视频编解码库 libavcodec,为了保证高可移植性和编解码质量, libavcodec 里很多 code 都是从头开发的。
FFmpeg 项目组成
FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程 序。它包括了领先的音/视频编码库 libavcodec 等。 libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解 码上下文结构 libavcodec:用于各种类型声音/图像编解码; libavutil:
包含一些公共的工具函数; libswscale:用于视频场景比例缩放、色彩映射转换; libpostproc:用于后期效果处理; 1. ffmpeg:该项目提供的一个工具,可用于格式转换、解码或电视卡即时编码等 2. ffsever:一个 HTTP 多媒体即时广播串流服务器; 3. ffplay:是一个简单的播放器,使用 ffmpeg 库解
析和解码,通过 SDL 显示
FFMPEG 组成
官网介绍 FFMPEG 是一个多媒体框架, 其包含了多个模块库:AVFormat,AVCodec,AVFilter,AVDevice,AVUtil 等, 并且提供了基于这些库的三个命令行工具: ffmpeg,ffplay,ffprobe。
使用 ffmpeg 的方式分为两种:
-
一种方式是直接使用 ffmpeg 提供的这三个命令行工具来进行多媒体处理;
-
另一种是使用 ffmpeg 封装的这些库进行二次开发。
FFmpeg 命令行
-
1) 列出支持的格式
-
2) 剪切一段媒体文件
-
3) 提取一个视频文件中的音频文件
-
4) 从 MP4 文件中抽取视频流导出为裸的 H264 数据
-
5) 视频静音,即只保留视频 -an ,,-vn
-
6) 使用 AAC 音频数据和 H264 视频生成 MP4 文件
-
7) 音频格式转换
-
8) 从 WAV 音频文件中到处 PCM 裸数据
-
9) 将一个 MP4 的文件转换为一个 GIF 动图
-
10) 使用一组图片生成 gif
-
11) 淡入效果器使用
-
12) 淡出效果器使用
-
13) 将两路声音合并,比如加背景音乐
-
14) 为视频添加水印效果
-
15) 视频提亮效果器
-
16) 视频旋转效果器的使用
-
17) 视频裁剪效果器的使用
-
18) 将一段视频推送到流媒体服务器上
-
19) 将流媒体服务器上的流 dump 到本地
-
20) 将两个音频文件以两路流的形式封装到一个文件中
搭建 Videojs,实战网络直播
第一,在本地 windows10 上安装 nginx(windows 版本的),
下载地址:http://nginx.org/
第二,video.js
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>demo</title> <link href="https://vjs.zencdn.net/7.0.3/video-js.css" rel="stylesheet"> </head> <body> <video id="myVideo" class="video-js vjs-default-skin vjs-big-play-centered" controls preload="auto" width="720" height="540" data-setup='{}'> <source id="source" type="application/x-mpegURL" src="http://192.168.0.104:8000/hls1/test.m3u8" > </video> </body> <script src="https://vjs.zencdn.net/7.0.3/video.js"></script> </html>
第三,修改 Ubuntu 上 Nginx 的配置文件
types{ application/vnd.apple.mpegurl m3u8; video/mp2t ts; FFmpeg+Nginx+RTMP/HLS 快速搭建直播网站 } expires -1; add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Headers X-Requested-With; add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
Python+FFmpeg,实战直播推流
创建 py 文件,调用 ffmpeg
import subprocess import time #ffmpeg 录屏:5 秒 ffmpeger=subprocess.Popen('ffmpeg -thread_queue_size 16 -f gdigrab -i desktop -s 1280x720 -vcodec libx264 -y test2.mp4', shell=True, stdin=subprocess.PIPE) time.sleep(5) ffmpeger.stdin.write('q'.encode("GBK")) ffmpeger.communicate() #ffmpeg 推流:rtmp ffmpeger = subprocess.Popen('ffmpeg -re -i d:/_movies/ande10.mp4 -vcodec libx264 -acodec aac -f flv rtmp://192.168.0.102:1935/hls1/test', shell=True, stdin=subprocess.PIPE)
参数说明:
-thread_queue_size 线程队列 16 缓存大小
-f gdigrab 桌面设备
-y 重名覆盖
直播添加权限认证
参考博客
https://www.cnblogs.com/zkfopen/p/11764127.html
配置说明文档
https://github.com/arut/nginx-rtmp-module/wiki/Directives