手機視頻點播系統搭建完整方案

技術選擇

服務器操做系統: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問題,查了不少資料,仍是花了我一週時間的。

相關文章
相關標籤/搜索