使用HLS協議連接nginx實現近實時流方式播放視頻


1. 流媒體

流媒體就是將視頻文件分成許多小塊兒,將這些小塊兒作為數據包通過網絡發送出去,實現一邊傳輸視
頻 數據 包一邊觀看視頻。

1.1 流式傳輸

在網絡上傳輸音、視頻信息有兩個方式:下載流式傳輸
下載:就是把音、視頻文件完全下載到本機后開始播放,它的特點是必須等到視頻文件下載完成方可播放,
播放等待時間較長,無法去播放還未下載的部分視頻。
流式傳輸:就是客戶端通過鏈接視頻服務器實時傳輸音、視頻信息,實現“邊下載邊播放”。
流式傳輸包括如下兩種方式:

1.1.2 順序流式傳輸

即順序下載音、視頻文件,可以實現邊下載邊播放,不過,用戶只能觀看已下載的視頻內容,無法快進到未
下載的視頻部分,順序流式傳輸可以使用Http服務器來實現,比如NginxApache等。

1.1.3 實時流式傳輸

實時流式傳輸可以解決順序流式傳輸無法快進的問題,它與Http流式傳輸不同,它必須使用流媒體服務器並
且使用流媒體協議來傳輸視頻,它比Http流式傳輸復雜。常見的實時流式傳輸協議有RTSPRTMPRSVP
等。

  1. 將原始的視頻文件通過編碼器轉換為適合網絡傳輸的流格式,編碼后的視頻直接輸送給媒體服務器。原始的視頻文件通常是事先錄制好的視頻,比如通過攝像機、攝像頭等錄像、錄音設備采集到的音視頻文件,體積較大,要想在網絡上傳輸需要經過壓縮處理,即通過編碼器進行編碼 。
  2. 媒體服務獲取到編碼好的視頻文件,對外提供流媒體數據傳輸接口,接口協議包括 :HTTPRTSPRTMP等 。
  3. 播放器通過流媒體協議與媒體服務器通信,獲取視頻數據,播放視頻。

2. 點播

2.1 點播方案

  1. 播放器通過 http協議從http服務器上下載視頻文件進行播放
    問題:必須等到視頻下載完才可以播放,不支持快進到某個時間點進行播放
  2. 播放器通過rtmp協議連接媒體服務器以實時流方式播放視頻
    使用rtmp協議需要架設媒體服務器,造價高,對於直播多采用此方案。
  3. 播放器使用HLS協議連接http服務器(NginxApache等)實現近實時流方式播放視頻
    HLS協議規定:基於Http協議,視頻封裝格式為ts,視頻的編碼格式為H264,音頻編碼格式為MP3AAC或者AC-3

2.2 什么是HLS

HLS的工作方式是:將視頻拆分成若干ts格式的小文件,通過m3u8格式的索引文件對這些ts小文件建立索引。一般10秒一個ts文件,播放器連接m3u8文件播放,當快進時通過m3u8即可找到對應的索引文件,並去下載對應的ts文件,從而實現快進、快退以近實時 的方式播放視頻。
IOSAndroid設備、及各大瀏覽器都支持HLS協議。

采用 HLS方案即可實現邊下載邊播放,並可不用使用rtmp等流媒體協議,不用構建專用的媒體服務器,節省成本。

3. 視頻編碼

3.1 視頻編碼格式

所謂視頻編碼方式就是指通過壓縮技術,將原始視頻格式的文件轉換成另一種視頻格式文件的方式視頻流傳輸中最為重要的編解碼標准有國際電聯的H.261H.263H.264,運動靜止圖像專家組的M-JPEG國際標准化組織運動圖像專家組的MPEG系列標准,此外在互聯網上被廣泛應用的還有Real-NetworksRealVideo微軟公司WMV以及Apple公司的QuickTime等。

首先我們要分清文件格式和編碼格式:
文件格式:是指.mp4.avi.rmvb等 這些不同擴展名的視頻文件的文件格式 ,視頻文件的內容主要包括視頻和音頻,其文件格式是按照一 定的編碼格式去編碼,並且按照該文件所規定的封裝格式將視頻、音頻、字幕等信息封裝在一起,播放器會根據它們的封裝格式去提取出編碼,然后由播放器解碼,最終播放音視頻。

音視頻編碼格式:通過音視頻的壓縮技術,將視頻格式轉換成另一種視頻格式,通過視頻編碼實現流媒體的傳輸。
比如:一個.avi的視頻文件原來的編碼是a,通過編碼后編碼格式變為b,音頻原來為c,通過編碼后變為d。

音視頻編碼格式各類繁多,主要有幾下幾類:

  • MPEG系列 (由ISO[國際標准組織機構]下屬的MPEG[運動圖象專家組]開發 )視頻編碼方面主要是Mpeg1vcd用的就是它)、Mpeg2DVD使用)、Mpeg4(的DVDRIP使用的都是它的變種,如:divxxvid等)、Mpeg4 AVC(正熱門);音頻編碼方面主要是MPEG Audio Layer 1/2MPEG Audio Layer 3(大名鼎鼎的mp3)、MPEG-2 AACMPEG-4 AAC等等。注意:DVD音頻沒有采用Mpeg的。
  • H.26X系列 (由ITU[國際電傳視訊聯盟]主導,側重網絡傳輸,注意:只是視頻編碼) 包括H.261H.262
    H.263H.263+H.263++H.264(就是MPEG4 AVC-合作的結晶)

目前最常用的編碼標准是視頻H.264,音頻AAC

3.2 FFmpeg 的基本使用

FFmpeg是一套可以用來記錄、轉換數字音頻、視頻,並能將其轉化為流的開源計算機程序。采用LGPLGPL許可證。它提供了錄制、轉換以及流化音視頻的完整解決方案。它包含了非常先進的音頻/視頻編解碼庫libavcodec,為了保證高可移植性和編解碼質量,libavcodec里很多code都是從頭開發的。

FFmpeg被許多開源項目采用,QQ影音、暴風影音、VLC等。
下載:FFmpeg

下載 :ffmpeg.zip,並解壓,本教程將ffmpeg解壓到D:\program\ffmpeg-20191229-e20c6d9-win64-static

ffmpeg配置到path環境變量中

檢測是否安裝成功

ffmpge -version

簡單的測試:
將一個.avi文件轉成mp4mp3gif等。
比如我們將test.avi文件轉成mp4,運行如下命令:

ffmpeg -i test.avi test.mp4

轉成mp3

ffmpeg -i test.avi test.mp3

轉成gif

ffmpeg -i lucene.avi lucene.gif

3.3 生成m3u8/ts文件

使用ffmpeg生成 m3u8的步驟如下(這里以avi格式為例,其他類似):

3.3.1 先將avi視頻轉成mp4

ffmpeg.exe ‐i  test.avi ‐c:v libx264 ‐s 1280x720 ‐pix_fmt yuv420p ‐b:a 63k ‐b:v 753k ‐r 18 .\test.mp4

下面把各參數意思大概講講,大概了解意思即可,不再此展開流媒體專業知識的講解。

  • -c:v 視頻編碼為x264x264編碼是H264的一種開源編碼格式。
  • -s 設置分辨率
  • -pix_fmt yuv420p:設置像素采樣方式,主流的采樣方式有三種,YUV4:4:4YUV4:2:2YUV4:2:0,它的作用是根據采樣方式來從碼流中還原每個像素點的YUV(亮度信息與色彩信息)值。
  • -b 設置碼率,-b:a-b:v分別表示音頻的碼率和視頻的碼率,-b表示音頻加視頻的總碼率。碼率對一個視頻質量有很大的作用。
  • -r:幀率,表示每秒更新圖像畫面的次數,通常大於24肉眼就沒有連貫與停頓的感覺了。

3.3.2 將mp4生成m3u8

ffmpeg ‐i  test.mp4   ‐hls_time 10 ‐hls_list_size 0  ‐hls_segment_filename
./hls/test_%05d.ts ./hls/test.m3u8
  • -hls_time 設置每片的長度,單位為秒
  • -hls_list_size n: 保存的分片的數量,設置為0表示保存所有分片
  • -hls_segment_filename :段文件的名稱,%05d表示5位數字
    生成的效果是:將test.mp4視頻文件每10秒生成一個ts文件,最后生成一個m3u8文件,m3u8文件是ts的索引文件。

經測試可以使用potplayer播放test.m3u8

3.4 碼率的設置

碼率又叫比特率即每秒傳輸的bit數,單位為bps(Bit Per Second),碼率越大傳送數據的速度越快。
碼率的計算公式是:文件大小(轉成bit)/ 時長(秒)/1024 = kbps 即每秒傳輸千位數
例如一個1M的視頻,它的時長是10s,它的碼率等於

1*1024*1024*8/10/1024 = 819Kbps

碼率設置到多少才能達到最好,通過根據個人的經驗或參考一些視頻網台給出的參考,下圖是優酷對碼率的要求:

如果要將視頻上傳到優酷則必須按照上面的要求,如果是自己搭建視頻服務器,碼率設置不易過大,最終達到的視
頻清晰度滿足業務需求即可。

4. 播放器

4.1 技術選型

視頻編碼后要使用播放器對其進行解碼、播放視頻內容。在web應用中常用的播放器有flash播放器、H5播放器或瀏覽器插件播放器,其中以flashH5播放器最常見。

flash播放器:缺點是需要在客戶機安裝Adobe Flash Player播放器,優點是flash播放器已經很成熟了,並且瀏覽器對flash支持也很好。

H5播放器:基於h5自帶video標簽進行構建,優點是大部分瀏覽器支持H5,不用再安裝第三方的flash播放器,並且隨着前端技術的發展,h5技術會越來越成熟。


4.2 video.js

本項目采用H5播放器,使用Video.js開源播放器。
Video.js是一款基於HTML5世界的網絡視頻播放器。它支持HTML5Flash視頻,它支持在台式機和移動設備上播放視頻。這個項目於2010年中開始,目前已在40萬網站使用。
官方地址:http://videojs.com/

下載video.js

Video.jshttps://github.com/videojs/video.js
videojs-contrib-hlshttps://github.com/videojs/videojs-contrib-hls#installation
videojs-contrib-hls是播放hls的一個插件)
使用文檔:http://docs.videojs.com/tutorial-videojs_.html

5. 開始配置nginx

正常使用video.js播放視頻是通過一個網頁,用戶通過瀏覽器打開網頁去播放視頻,網頁和視頻都從web服務器請求,通常視頻的url地址使用單獨的域名。

下面配置是nginx服務器的配置

worker_processes  1;


events {
    worker_connections  1024;
}

http {
    
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen 80;
        server_name localhost;

        # 視頻目錄
        location /video/ {
            alias  D:/test/video/;
        }
    }
}

6. 編寫測試頁面video.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <title>視頻播放</title>
    <link href="./videojs/video-js.css" rel="stylesheet">
</head>
<body>
<video id=example-video width=800 height=600 class="video-js vjs-default-skin vjs-big-play-centered" controls poster="http://127.0.0.1/video/add.jpg">
    <source
            src="http://127.0.0.1/video/test.m3u8"
            type="application/x-mpegURL">
</video>
<input type="button" onClick="switchvideo()" value="switch"/>

<script src="./videojs/video.js"></script>
<script src="./videojs/videojs-contrib-hls.js"></script>
<script>
    var player = videojs('example-video');
    //player.play();

    function switchvideo(){
        player.src({
            src: 'http://127.0.0.1/video/test.m3u8',
            type: 'application/x-mpegURL',
            withCredentials: true
        });
        player.play();
    }
</script>

</body>
</html>
    

7. 測試

demo 地址

鏈接:https://share.weiyun.com/5FOQLhs 密碼:9a5tyf


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM