返回顶部

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 支持多种常见音视频格式,支持多种流媒体传输协议,也可当做本地流媒体服务器 使用,功能十分强大。

官网下载地址:

https://www.videolan.org/

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  

 

posted @ 2020-12-08 10:35  Crazymagic  阅读(3856)  评论(0编辑  收藏  举报