壓制DASH格式視頻(MP4轉MPEG-DASH)

依舊是廢話多的一逼的前言:

還是因爲字幕組的事情而衍生出來的XJB折騰。煞筆B站一天到晚下架視頻所以乾脆這邊直接搭網頁在線播,然而又因爲存放視頻源的服務器在海外山溝溝而國內網絡環境複雜,所以有些地方加載速度不太好。一些從B站過來的大概是把這邊黨B站使了在這邊狂刷屏卡看得我火氣都上來了(。)尼瑪卡去日自家網絡運營商啊是我的問題麼!(滾)就爲了這麼幾個視頻,買國內服務器一點也不現實好麼,還要備案還要公安局拍人頭照實名還要等20多天,這輩子都不會做的!!要刷屏抱怨的請付我錢買服務器幫我去備案謝謝!

唯一能做的努力大概就是吧視頻格式跳轉一下。原本是直接播放MP4的,跳轉進度時需要緩衝,現在琢磨着改用DASH串流技術看看效果。(說實話原視頻才80多M啊!以後大視頻怎麼辦喲)。

後記:搞完後才發現然蘋果IOS不認Dash格式播放(其它系統都沒問題ry… )所以最終選擇Dash和HLS雙開。效果還是挺明顯的。

我是在 vultr 家 1CPU、1024RAM、25GB SSD 的服務器上搞得,系統是 Linux Ubuntu 18.04 x64
工具是FFmpeg和MP4Box,使用Cloudoki/mp4-to-mpegdash這個腳本進行壓制,怎麼簡單怎麼來 = = …
這次就不在hostsolutions.ro上折騰了一方面內核太老,一方面沒備份,搞壞把別的數據弄沒了就不好玩了。


首先是轉載的MP4、HLS和DASH視頻的播放體驗比較

MP4

頭文件較大,邊下邊緩存,起播相對HLS和DASH慢一些;拖動時間軸播放時,需要一定的時間緩存;市場上大多數的瀏覽器客戶端均能夠播放,播放成功率高。
拖動時間軸播放時,仍然需要下載整個頭文件,耗費流量大,建議用在短視頻處理的場景。

HLS

對視頻進行切片,按切片播放,緩存小起播快;拖動時間軸到任意時間播放時,可以快速定位到對應的切片進行播放,響應快。
整體占用小,播放一個切片只下載一個切片內容;對於低碼率的視頻場景,因封裝代價高導致流量占用相對較高。

DASH

對視頻進行切片,按切片播放,緩存小起播快;拖動時間軸到任意時間播放時,可以快速定位到對應的切片進行播放,響應快。
流量佔用小。

丟個別人寫的介紹:https://www.bilibili.com/read/cv855111/
其餘的可以看本文最下放的參考消息。我也不是研究這方面的毛都不懂就不多嘴了。


用到的是這個Github上的這個腳本 Cloudoki/mp4-to-mpegdash
需要安裝 ffmpegMP4Box(gpac) 以及Perl的XML::Simple
網上說的安裝步驟一大堆但 Ubuntu 18.04這邊操作好像不用這麼麻煩了

sudo apt-get install ffmpeg
sudo apt-get install gpac
apt install aptitude
aptitude install libxml-simple-perl

下載腳本

git clone https://github.com/Cloudoki/mp4-to-mpegdash 

運行腳本

cd mp4-to-mpegdash 
perl transcode.pl 目標視頻地址目錄/視頻名字.mp4
Experimental push on scalar is now forbidden at transcode.pl line 68, near "};"
Experimental push on scalar is now forbidden at transcode.pl line 72, near "$high_representation;"
Experimental push on scalar is now forbidden at transcode.pl line 80, near "};"
Execution of transcode.pl aborted due to compilation errors.

如果如上方報錯就說明push指令過時了需要我們手動改一下 transcode.pl 腳本

腳本第68行 push $base_manifest->{Period}->{AdaptationSet}->[0]->{Representation}, $manifest->{Period}->{AdaptationSet}->{Representation};
改成 push @{ $base_manifest->{Period}->{AdaptationSet}->[0]->{Representation} }, $manifest->{Period}->{AdaptationSet}->{Representation} };

腳本第72行 push $base_manifest->{Period}->{AdaptationSet}->[0]->{Representation}, $high_representation;
改成 push @{ $base_manifest->{Period}->{AdaptationSet}->[0]->{Representation} }, $high_representation;

腳本第80行 push $base_manifest->{Period}->{AdaptationSet}, $manifest->{Period}->{AdaptationSet};
改成 push @{ $base_manifest->{Period}->{AdaptationSet} }, {$manifest->{Period}->{AdaptationSet} ;

輸出的視頻有不同的分辨率寬度,可以根據自己的情況在腳本中刪減進行調整

my $versions = [ '320', '640', '720', '1280', '1920', '2560' ]; 

附帶一個使用ffmpeg切片生成HLS M3U8的方法

ffmpeg -y -i 視頻名字.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 視頻名字.ts

按10秒切片,可以自行修改

ffmpeg -i 視頻名字.ts -c copy -map 0 -f segment -segment_list playlist.m3u8 -segment_time 10 視頻名字%03d.ts

以上非二壓沒有涉及更改分辨率比特率等操作,沒有深入研究有需要的可以去官網查查。下面附帶一個用ffmpeg進行二壓的M3U8切片工具,我個人是覺得畫質損的還挺厲害的,有需要的自取吧。


參考資料:



发表评论