HLS(HTTP Live Streaming) 是Appale公司在2009年發佈的,能夠經過普通的web服務器進行分發的新型流媒體協議。html
HLS協議文件:http://tools.ietf.org/html/draft-pantos-http-live-streaming-07android
HLS提供一個m3u8列表,播放地址像這樣:http://IP[port]/[app]/live.m3u8,其實m3u8是一個ts的list,可是在這個list中要須要定義一些關鍵的參數,這些參數都有重要的意義。nginx
通常HLS中ts切片的視頻編碼使用H264,音頻編碼使用AAC。web
下面是一個m3u8列表中的內容算法
#EXTM3Ujson
#EXT-X-VERSION:3api
#EXT-X-MEDIA-SEQUENCE:64服務器
#EXT-X-TARGETDURATION:12app
#EXTINF:11.550ide
livestream-64.ts
#EXTINF:5.250
livestream-65.ts
#EXTINF:7.700
livestream-66.ts
#EXTINF:6.850
livestream-67.ts
有幾個關鍵的參數,這些參數在SRS的配置文件中都有配置項:
EXT-X-TARGETDURATION:全部切片的最大時長。有些Apple設備這個參數不正確會沒法播放。SRS會自動計算出ts文件的最大時長,而後更新m3u8時會自動更新這個值。用戶沒必要本身配置。
EXTINF:ts切片的實際時長,SRS提供配置項hls_fragment,但實際上的ts時長還受gop影響,詳見下面配置HLS的說明。
ts文件的數目:SRS可配置hls_window,指定m3u8中保存多少個切片,SRS會自動清理舊的切片。
livestream-67.ts:SRS會自動維護ts切片的文件名,在編碼器重推以後,這個編號會繼續增加,保證流的連續性。直到SRS重啓,這個編號才重置爲0。
譬如,每一個ts切片爲10秒,窗口爲60秒,那麼m3u8中會保存6個ts切片。
RTMP編碼器推流到SRS,視音頻編碼爲,視頻:H.264 音頻:AAC,其餘編碼的,能夠經過SRS進行直播轉碼後,輸出到SRS的其餘Vhost中,而後生成HLS
若是不是H264/AAC,則中止輸出HLS。
其餘配置查看conf目錄下的full.conf
vhost with-hls.srs.com {
hls {
#是否開啓HLS,on:開啓 off:關閉,默認是off
enabled on;
#單位秒,指定ts切片的最小長度。默認爲10
#ts文件長度 = max(hls_fragment, gop_size)
#若是ffmpeg中指定fps(幀速率)爲20幀/秒,gop爲200幀,那麼gop_size=gop/fps=10秒
#那麼實際ts的長度爲max(5,10) =10秒。這樣實際ts切片的長度就與設定的不一樣了。
hls_fragment 5;
#倍數,控制m3u8的EXT-X-TARGETDURATION值,EXT-X-TARGETDURATION(整數)值標明瞭切片的最大時長。
#m3u8列表文件中EXTINF的值必須小於等於EXT-X-TARGETDURATION的值。
#EXT-X-TARGETDURATION在m3u8列表文件中必須出現一次。
hls_td_ratio 1.5;
#倍數。純音頻時,當ts時長超過配置的ls_fragment乘以這個係數時就切割文件。例如,當ls_fragment是10秒,hls_aof_ratio是2.0時,對於純音頻,10s*2.0=20秒時就切割ts文件。
hls_aof_ratio 2.0;
#單位:秒,指定HLS窗口大小,即m3u8中ts文件的時長之和,超過總時長後,丟棄第一個m3u8中的第一個切片,直到ts的總時長在這個配置項範圍以內。即SRS保證:hls_window的值必須大於等於m3u8列表文件中全部ts切片時長的總和。
hls_window 60;
#hls錯誤策略
# ignore:當錯誤發生時,忽略錯誤並中止輸出hls(默認)
# disconnect:當發生錯誤時,斷開推流鏈接
# continue:當發生錯誤時,忽略錯誤並繼續輸出hls
hls_on_error ignore;
#hls存儲方式
# disk:把m3u8/ts寫到磁盤(默認)
# ram:發送m3u8/ts到內存,可是必須使用srs自帶的http server進行分發。
# both, disk and ram。
hls_storage disk;
#當hls寫到磁盤時,指定寫入的目錄。
hls_path ./objs/nginx/html;
#生成hls的m3u8文件的文件名,有一些變量可用於生成m3u8文件的文件名:
# [vhost],原始流來的vhost,好比rtmp://v.flyfn.com:1935/live/livestream,對應到srs中,vhost應是v.flyfn.com
# [app], 源rtmp流中的app,對應上面的播放地址中,爲live
# [stream],源rtmp流中的流名稱,對應上面播放地址中,爲livestream
#m3u8文件的絕對路徑爲[SRS_Path]/objs/nginx/html/[app]/[stream].m3u8
hls_m3u8_file [app]/[stream].m3u8;
#生成的ts文件的名稱,有許多的變量可用於生成ts文件的文件名:
#[vhost], the vhost of stream.
#[app], the app of stream.
#[stream], the stream name of stream.
#[2006], replace this const to current year.
#[01], replace this const to current month.
#[02], replace this const to current date.
#[15], replace this const to current hour.
#[04], repleace this const to current minute.
#[05], repleace this const to current second.
#[999], repleace this const to current millisecond.
#[timestamp],replace this const to current UNIX timestamp in ms.
#[seq], the sequence number of ts,順序號,0,1,2...n
#生成的ts文件的絕對路徑:[SRS_Path]/objs/nginx/html/[app]/[stream]-[seq].ts
#例如:[app]/[stream]/[2006][01]/[02]/[timestamp].ts生成的ts文件的絕對路徑是:
#[SRS_Path]/objs/nginx/html/[app]/[stream]/201505/15/1431619258.ts
hls_ts_file [app]/[stream]-[seq].ts;
#是否使用floor的方式生成hls ts文件的路徑。如實hls_ts_floor on; 使用timestamp/hls_fragment做爲[timestamp]變量,即[timestamp]=timestamp/hls_fragment,而且使用enahanced算法生成下一個切片的差值。
hls_ts_floor off;
#hls_entry_prefix: TS的base url。可選默認爲空字符串;非空時加在ts前面做爲base url。
#對於ts切片:live/livestream-0.ts
#若配置爲:hls_entry_prefix http://your-server;
#則最後的TS的URL是:http://your-server/live/livestream-0.ts
hls_entry_prefix http://your-server;
#內存hls的m3u8/ts掛載點。播放的時候到這個路徑下找m3u8和ts文件。播放路徑爲:http://your-server/[vhost]/[app]/[stream].m3u8
#若要支持內存分發HLS,即ts不寫磁盤。一、須要開啓SRS的http_server。二、修改 hls_storage ram;
hls_mount [vhost]/[app]/[stream].m3u8;
#默認的音頻編碼。當流的編碼改變時,會更新PMT/PAT信息;默認是aac,所以默認的PMT/PAT信息是aac;若是流是mp3,那麼能夠配置這個參數爲mp3,避免PMT/PAT改變。
hls_acodec aac;
#默認的視頻編碼。當流的編碼改變時,會更新PMT/PAT信息;默認是h264。若是是純音頻HLS,能夠配置爲vn,能夠減小SRS檢測純音頻的時間,直接進入純音頻模式。
hls_vcodec h264;
#是否刪除過時的ts切片,不在m3u8中就是過時。能夠關閉清除ts切片,實現時移和存儲,使用本身的切片管理系統。
hls_cleanup on;
#從notify服務器讀取數據的長度
hls_nb_notify 64;
#是否按gop切片,即等待到關鍵幀後開始切片。測試發現OS X和android上能夠不用按go切片。
hls_wait_keyframe on;
}
}
vhost v.flyfn.com {
http_hooks {
#當切片生成時,回調這兒url,使用POST回調。
#已json編碼格式POST。
# {
# "action": "on_hls",
# "client_id": 1985,
# "ip": "192.168.1.10", "vhost": "video.test.com", "app": "live",
# "stream": "livestream",
# "duration": 9.36, // in seconds
# "cwd": "/usr/local/srs",
# "file": "./objs/nginx/html/live/livestream/2015-04-23/01/476584165.ts",
# "url": "live/livestream/2015-04-23/01/476584165.ts",
# "m3u8": "./objs/nginx/html/live/livestream/live.m3u8",
# "m3u8_url": "live/livestream/live.m3u8",
# "seq_no": 100
# }
#下面是回調多個地址
on_hls http://127.0.0.1:8085/api/v1/hls http://localhost:8085/api/v1/hls;
#HLS通知,實現CDN預分發。
on_hls_notify http://127.0.0.1:8085/api/v1/hls/[app]/[stream][ts_url];
}
}
參考經過ffmpeg進行轉碼,轉碼的時候把視頻禁止掉就能夠了。