直播引言與實戰效果直播原理與架構
項目簡介
視頻直播網站由三個部分構成: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