服務器操做系統:windows 點播服務器:Nginx 轉碼和生成清單:ffmpeg 手機客戶端:ExoPlayer SDKhtml
Nginx和ffmpeg都是跨平臺的,應該也能夠在linux上搭建出來。 搭建視頻點播和直播系統使用的協議不同,視頻點播網站多數是基於http協議,而直播協議不少,好比rtsp和rtmp,其中rtmp是Adobe的私有協議。 視頻直播服務器可使用Live555,VLC(不僅是播放器,也能夠直播),DarwinStreamingSrvr5.5.5(Apple開源,只有5.5.5版本)不少軟件實現,多數都是開源跨平臺,也比較好用,客戶端若是是cs形式,那選擇vlc仍是不錯的,若是是bs形式,感受上videojs還不錯。 視頻點播服務器我選擇使用Nginx搭建,如何搭建後面講解,另外性能和併發上還沒測試過。單獨點播一個文件好比*.ts/.mp4都是配置一下就能夠實現,在vlc中也能正常播放。我在Android手機中播放器選擇了google的ExoPlayer,ExoPlayer是開源的而且支持HLS,Demo中的HLS示例都是Apple的.m3u8格式,上面簡單配置ExoPlayer播放不了, 因此我選擇基於Nginx搭建一個能夠點播m3u8格式的服務器,*.m3u8文件自己就是個節目清單。java
首先下載Nginx,網址:http://nginx.org/en/download.html 生成*.m3u8清單須要切片,開源有好用的是ffmpeg,下載ffmpeg網址:https://ffmpeg.org/download.htmllinux
解壓Nginx並配置,在html目錄下建立一個文件夾hls,而後修改nginx.conf文件,修改後的內容以下:android
location / { root html; index index.html index.htm; location ~ .flv { flv; } location ~ .mp4 { mp4; } #location ~* \.mp4$ { # root /movies/; #} location /hls { # Serve HLS fragments types { application/vnd.apple.mpegurl m3u8; video/mp2t ts; } #root /hls; add_header Cache-Control no-cache; } }
而後還須要修改mime.types文件,在application/zip zip;後加入nginx
application/x-mpegURL m3u8; application/vnd.apple.mpegurl m3u8;
在video/x-msvideo avi;後加入git
video/MP2T ts;
啓動Nginx,若是沒有錯誤的話服務器應該搭建好了,可是如今尚未播放的內容。找一個*.mp4文件,而後解壓剛下載的ffmpeg,用管理員身份啓動命令行窗口,進入ffmpeg的bin目錄下執行:github
ffmpeg -i *mp4 -hls_time 5 -hls_list_size 0 -c:v libx264 -c:a aac -strict -2 -f hls output.m3u8
這個時間可能會有點長,命令執行完後就把那些文件放到nginx的/html/hls目錄下。Ffmpeg的一些參數介紹一下(網上抄來的): -hls_time n: 設置每片的長度,默認值爲2。單位爲秒 -hls_list_size n:設置播放列表保存的最多條目,設置爲0會保存有所片信息,默認值爲5 -hls_wrap n:設置多少片以後開始覆蓋,若是設置爲0則不會覆蓋,默認值爲0.這個選項可以避免在磁盤上存儲過多的片,並且可以限制寫入磁盤的最多的片的數量 -hls_start_number n:設置播放列表中sequence number的值爲number,默認值爲0 注意:播放列表的sequence number 對每一個segment來講都必須是惟一的,並且它不能和片的文件名(當使用wrap選項時,文件名有可能會重複使用)混淆。windows
若是是*.ts文件你可能須要下面這樣,具體我也沒用過,有問題就搜一下吧。服務器
ffmpeg -i *.ts -c copy -map 0 -f segment -segment_list playlist.m3u8 -segment_time 10 output%03d.ts
生成ts文件:併發
A. ffmpeg -y -i <in file> -vcodec copy -acodec copy -vbsf h264_mp4toannexb <output file> B.. /segmenter -i out.ts -n 10 -p segmenter_test -m test.m3u8 -u
如今可使用vlc測試一下了:http://127.0.0.1/hls/output.m3u8
網站:http://wear.techbrood.com/guide/topics/media/exoplayer.html 源碼:https://github.com/google/ExoPlayer/ 一些參考能夠在github裏搜索:https://github.com/search?utf8=%E2%9C%93&q=exoplayer+hls
源碼導入到eclipse可能有點問題,查看一下mainfest裏面權限什麼的,修改一下Samples.java裏的HLS播放地址,加入http://127.0.0.1/hls/output.m3u8 播放以後可能沒有全屏的功能,我用的方法是修改playeractivity橫屏和全屏顯示。
<activity android:name=".PlayerActivity" android:launchMode="singleTask" android:screenOrientation="landscape" android:label="@string/app_name" > </activity>
在onCreate(Bundle savedInstanceState)中的setContentView(R.layout.player_activity)方法前加入下面兩行代碼:
requestWindowFeature(Window.FEATURE_NO_TITLE);//隱藏標題 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);//設置全屏
如今run一下app能夠看到全屏的播放效果了(我這個圖是手機截屏,其實全屏播放時沒有上面的藍色狀態欄)。
仍是挺簡單的吧?其實研究服務器搭建和Exoplayer問題,查了不少資料,仍是花了我一週時間的。