Nginx 搭建DASH服務器

Nginx 搭建DASH服務器

1.DASH播放器
(圖1.players.akamai)

好久沒有寫博客了,新年這幾天也一直荒廢,最近開始準備畢業設計,需要用到DASH來做動態碼率傳輸。至於什麼是DASH,這裏不再贅述,可以參考Dash相關領域知識總結,再給一個DASH播放器akamai,方便大家直觀地感受下DASH。本文要分享的內容爲搭建一個自己的DASH服務器,內容比較簡單,主要涉及一些工具的使用。


使用FFMpeg獲得不同分辨率視頻

首先是ffmpeg的安裝,可以參考我之前的博客,Linux 下ffmpeg的安裝 。推薦使用安裝包的形式,自己源碼編譯可能耗時較久,而且會遇上各種依賴問題。

安裝好ffmpeg後,我們便可以使用該工具對原始視頻進行處理,以得到不同分辨率和碼率的視頻。這也是DASH的最intuitional最精華的思想所在,針對不同的網絡狀況,選擇最合適的視頻,達到較好的播放效果,至於如何選擇,這個是自適應算法的話題了,這裏暫且不表。

ffmpeg -i panda.mp4 -s 320x180 -c:v libx264 -b:v 500k -g 90 -an panda_video_320x180_500k.mp4

使用上面這條命令對原始視頻進行處理,其中涉及好幾個參數,解釋一下:

參數 含義
-i 表示輸入的文件
-s 使用的幀大小
-c:v 使用的codec(不知道怎麼翻譯,大概是編碼器的意思)
-b:v 使用的碼率
-g 圖像組大小(GOP length)
-an 記成audio no吧,不要編碼audio

以上命令參考了Making Your Own Simple MPEG-DASH Server 得到第一個視頻後,“依葫蘆畫瓢”,改變參數,得到剩下的幾個視頻。

這是供參考的參數設置:

ffmpeg -i panda.mp4 -s 320x180 -c:v libx264 -b:v 500k -g 90 -an panda_video_320x180_500k.mp4
ffmpeg -i panda.mp4 -s 640x360 -c:v libx264 -b:v 750k -g 90 -an panda_video_640x360_750k.mp4
ffmpeg -i panda.mp4 -s 640x360 -c:v libx264 -b:v 1000k -g 90 -an panda_video_640x360_1000k.mp4
ffmpeg -i panda.mp4 -s 1280x720 -c:v libx264 -b:v 1500k -g 90 -an panda_video_1280x720_1500k.mp4

注意到我們只編碼了視頻,而沒有編碼音頻,這是因爲在DASH中我們需要將音視頻分開進行處理。所以下一步就是音頻處理,仍然是用ffmpeg

ffmpeg -i panda.mp4 -c:a aac -b:a 128k -vn panda_audio_128k.mp4
解釋下各個參數

參數 含義
-i 表示輸入的文件
-c:a 使用的codec
-b:a 使用的碼率
-vn 記成video no吧,不要編碼video

敲了這麼多命令,終於完成了第一步(其實完全可以寫個shell腳本來完成),接着進行下一步。


使用mp4dash生成dash切片及mpd文件

這裏我最先參考了Making Your Own Simple MPEG-DASH Server 中的做法,用mp4box來作切片,這個工具自己之前用過,不陌生。把mp4box處理得到的文件傳到服務器後,滿懷期待打開播放器,放不出來,控制檯看看錯誤,

“Failed to load http://**/manifest.mpd: No ‘Access-Control-Allow-Origin’ header is present on the requested “.

然後各種搜索,按照提示在Nginx配置中添加了CORS支持還是不行,無奈換用另外一個工具bento4的mp4dash.

先在官網 下載bento4,Linux有編譯好的供下載,當然也可以下載源碼自己編譯。這裏我們選擇編譯好的版本。

下載好後我們需要用到的兩個小工具都在

/your_bento4_dir/bin

中,一個是mp4fragment,另外一個就是mp4dash了。使用的方法是先用mp4fragment來將視頻fragment(怎麼知道自己的視頻是否已經fragment處理?運行mp4dash來處理視頻,如果沒有的話,會提示),然後用mp4dash來進行下一步處理,直接放官網的說明吧

Once you have fragmented MP4 files to work with as input, you can generate a DASH presentation, including an MPD and media files or media segments. For single-bitrate streaming, a single MP4 file is required. For multi-bitrate streaming, you will need a set of MP4 files that have been encoded with closed GOPs (Group Of Pictures) with equal durations. Also, the audio tracks in all the files should be encoded with the same parameters. Once you have your input files, you can use the mp4dash tool to automatically generate the DASH MPD and optionally split the MP4 file into individual file segments.

最後一句話最關鍵,大概意思就是把之前那些文件全部交給mp4dash,它自動幫你把剩下的活兒全乾了,超貼心。

mp4dash命令大概是這樣的:

mp4dash panda_1280x720_1500k_f.mp4 panda_640x360_750k_f.mp4 panda_640x360_1000k_f.mp4 panda_320x180_500k_f.mp4 panda_audio_128k_f.mp4

使用默認參數就可以了。

然後在output文件夾中,生成了

audio
stream.mpd
video

下一步要做的工作就是把這些東西全部上傳到服務器中。


上傳文件至服務器

在完成了上面的工作後,使用ftp工具將生成的文件上傳到web服務器的根目錄中(就是放index.html的那個地方),打開播放器,填好mpd文件的位置,點擊“load”,
播放測試
(圖2:播放測試)

視頻正常播放,圖片2下方的曲線顯示視頻buffer大小隨着視頻碼率變化的情況。


“紫薇,等等”

就在我點擊保存,準備發佈這篇博客的時候,我發現我漏掉了重要的一點,那就是我其實是修改過nginx的配置的,如果不修改配置的話,會怎麼樣呢?

於是

mv /usr/local/nginx/conf/nginx.conf nginx_backup2.conf #把現在用的配置備份
mv /usr/local/nginx/conf/nginx_backup.conf nginx.conf #把原來的備份還原

然後

nginx -t #檢查配置
nginx -s reload #重載配置

再次嘗試播放,

“Failed to load http://**/video/video/avc1/1/init.mp4: No ‘Access-Control-Allow-Origin’ header is present on the requested resource. Origin ‘http://players.akamai.com’ is therefore not allowed access.”

無法正常播放,所以是需要這個配置的,具體是在你的nginx配置文件中添加

location /
{
add_header Access-Control-Allow-Methods “GET,OPTIONS,POST,HEAD,P UT,DELETE”;
add_header Accept-Ranges “bytes”;
add_header Access-Control-Allow-Origin “*”;
add_header Access-Control-Expose-Headers “Content-Lengrh,Content -Range,Date,Server,Transfer-Encoding,origin,range,x-goog-meta-foo1”;
}

其他web服務器的設置可能會差異,具體可以參考HTTP訪問控制(CORS)

具體是怎麼回事大家可以看看參考鏈接中的解釋,才疏學淺,我就不展開了(捂臉,我不是個好博主)。

reference

1.Dash相關領域知識總結
2.Linux 下ffmpeg的安裝
3.Making Your Own Simple MPEG-DASH Server
4.mp4dash
5.HTTP訪問控制(CORS)
5 6.panda 視頻:密碼: cp92

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章