依舊是廢話多的一逼的前言:
還是因爲字幕組的事情而衍生出來的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
需要安裝 ffmpeg 、 MP4Box(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切片工具,我個人是覺得畫質損的還挺厲害的,有需要的自取吧。
參考資料:
- https://bitmovin.com/mp4box-dash-content-generation-x264/
- https://video.stackexchange.com/questions/17411/encoding-videos-for-mpeg-dash
- https://www.encoding.com/mpeg-dash/
- https://blog.einverne.info/post/2018/10/dash.html
- https://www.jackpu.com/mp4-huan-hls-huo-zhe-dash-jiao-cheng/
- https://blog.csdn.net/yue_huang/article/details/78466537
- https://www.cnblogs.com/chenfool/p/4273095.html
- https://www.perlmonks.org/?node_id=1190788