被禁?下載的釘釘直播回放如何下載搂鲫?
簡(jiǎn)介
m3U8 是 Unicode 版本的 M3U傍药,用 UTF-8 編碼。“M3U” 和 “M3U8” 文件都是蘋果公司使用的 HTTP Live Streaming(HLS) 協(xié)議格式的基礎(chǔ)拐辽,這種協(xié)議格式可以在 iPhone 和 Macbook 等設(shè)備播放拣挪。
M3U8是一種文件格式,通常用于指定多媒體播放列表俱诸。 它是一種文本文件菠劝,其中包含了媒體資源的URL地址,用于指導(dǎo)播放器在特定順序和時(shí)間間隔內(nèi)加載和播放這些資源睁搭。
原理
將完整的視頻拆分成多個(gè) .ts 視頻碎片赶诊,.m3u8 文件詳細(xì)記錄每個(gè)視頻片段的地址。視頻播放時(shí)园骆,會(huì)先讀取 .m3u8 文件舔痪,再逐個(gè)下載播放 .ts 視頻片段锌唾。
常用于直播業(yè)務(wù),也常用該方法規(guī)避視頻竊取的風(fēng)險(xiǎn)晌涕。加大視頻竊取難度。
總結(jié)起來(lái)重窟,M3U8是一種用于指定流媒體播放列表的文件格式,常用于HLS流媒體傳輸協(xié)議中亲族。
需要注意的一點(diǎn)是:M3U8文件是一種文本文件,可以使用文本編輯器創(chuàng)建和編輯可缚。
視頻播放的過(guò)程
現(xiàn)在的視頻網(wǎng)站采用的是流媒體傳輸協(xié)議霎迫,就是將一段視頻切成無(wú)數(shù)個(gè)小段,這幾個(gè)小段就是ts格式的視頻文件帘靡,一段一段的網(wǎng)站上播放知给。
這樣做的好處是觀看更加流暢,因?yàn)樗麜?huì)根據(jù)網(wǎng)絡(luò)狀況自動(dòng)切換視頻的清晰度描姚,在網(wǎng)絡(luò)狀況不穩(wěn)定的情況下涩赢,對(duì)保障流暢播放非常有幫助。
我們可以了解下轩勘,一個(gè)視頻播放的全過(guò)程筒扒。
1.服務(wù)器采集編碼傳輸視頻到切片器 2.切片器對(duì)視頻創(chuàng)建索引文件,并且切割成n個(gè)ts文件 3.這2個(gè)文件傳輸?shù)絟ttp服務(wù)器上 4.網(wǎng)站/客戶端根據(jù)索引文件查找http服務(wù)器上的ts文件绊寻,連續(xù)播放這n個(gè)ts文件花墩,就可以了悬秉。
所以我們可以知道,索引文件非常重要冰蘑,索引文件里面存儲(chǔ)著ts文件的網(wǎng)絡(luò)url鏈接和泌,網(wǎng)站需要拿到索引文件,去按照url鏈接下載在http服務(wù)器中的ts文件祠肥,類似于爬蟲武氓。
拿到了ts文件之后,本身這些ts文件就是原視頻中的一小段視頻仇箱,所有ts文件下載順序播放县恕,就完成了整個(gè)視頻的播放。
而索引文件就是m3u8文件工碾。
現(xiàn)在大部分視頻網(wǎng)站傳輸都是采用這種方法弱睦,所以百姓,也就是說(shuō)渊额,如果你在觀看網(wǎng)頁(yè)視頻的時(shí)候,能夠弄到加載該視頻的m3u8文件垒拢,那么再配合一些工具求类,就能下載該視頻了椿猎。
如何拿到視頻的m3u8文件呢犯眠?
貓抓插件
一個(gè)chrome插件筐咧,是一個(gè)非常有名的嗅探插件量蕊。
我們看網(wǎng)頁(yè)版bilibili
而網(wǎng)頁(yè)版優(yōu)酷則使用貓抓嗅探不到任何東西,可是打開network缩滨,可以手動(dòng)拿到.m3u8的鏈接。
我把該鏈接復(fù)制出來(lái)瓦灶,url,可以拿到是一個(gè)m3u8的文件。
m3u8如何下載巧娱?
拿到了含有.m3u8的鏈接后撮胧,如何下載下來(lái)視頻呢芹啥?
網(wǎng)上有很多提取工具
在線提取工具:http://blog.luckly-mjw.cn/tool-show/m3u8-downloader/index.html
N_m3u8DL-CLI-SimpleG 一個(gè).exe后綴的window系統(tǒng)的軟件
軟件使用也很簡(jiǎn)單墓怀,打開N_m3u8DL-CLI-SimpleG.exe文件,首先設(shè)置視頻下載之后的位置钓账,其次把m3u8地址復(fù)制進(jìn)去梆暮,選擇下方的合并后刪除分片,最后點(diǎn)擊go就可以了治专。
點(diǎn)擊go之后泪蔫,會(huì)出現(xiàn)命令行窗口铣揉,等待下載就可以了
- 夸克
但是這些都是針對(duì)沒(méi)有任何版權(quán)的視頻下載的逛拱。
現(xiàn)在的各大視頻網(wǎng)站全部都做了加密朽合,比如虎課曹步,一個(gè)設(shè)計(jì)學(xué)習(xí)的收費(fèi)網(wǎng)站,m3u8文件中使用了AES-128加密俊柔,是對(duì)每個(gè)切片進(jìn)行了加棉竹捉。這個(gè)加密方式目前我還沒(méi)有解密出來(lái)。
不過(guò)我要下載的是釘釘?shù)闹辈セ胤啪笳桑@個(gè)群內(nèi)回放雖然設(shè)置了不允許下載,但是我通過(guò)它的m3u8文件轧坎,發(fā)現(xiàn)每一個(gè)切片可以單獨(dú)下載下來(lái)蜜氨,并且可以我試驗(yàn)了 5個(gè)切片可以合并成一個(gè)短視頻飒炎,并且可以正確播放赤赊,于是思路來(lái)了:把所有切片下載下來(lái)抛计,然后使用TS助手合并就好了。
各大視頻網(wǎng)站用的啥
- 愛(ài)奇藝是.f4v饭弓,也有mp4
- 騰訊視頻,播放電視劇之前的廣告都是一段一段的.mp4
- B站是.m4s
- 釘釘是m3u8
- 虎課是m3u8 AES-128 加密的
-
優(yōu)酷 .m3u8
ffmpeg命令
爬取完視頻發(fā)現(xiàn)都是一系列的ts文件。而且都是幾百KB的視頻片段刘急,.ts 全名叫:MPEG Transport Stream叔汁,它是一個(gè)萬(wàn)能的多媒體容器据块,可以裝下音頻、視頻折剃、字幕另假。有時(shí)我們需要將.ts文件轉(zhuǎn)換為其他更加廣泛被支持的格式,比如mp4格式怕犁,這樣就可以在各種設(shè)備上播放和分享边篮。
通常各種ts合成工具都是使用到ffmpeg命令進(jìn)行合成的,下面我來(lái)介紹下直接使用ffmpeg命令進(jìn)行合成奏甫。
- 下載ffmpeg:
brew install ffmpeg
- 單個(gè)文件轉(zhuǎn)換格式:
ffmpeg -i yourfilename.ts output.mp4
- 少量多個(gè)文件合成一個(gè)視頻文件
直接寫文件名戈轿,文件之間使用 | 隔開
ffmpeg -i "concat:1.ts|2.ts|3.ts|4.ts|.5.ts|" -c copy output.mp4
- 大量多個(gè)文件合成一個(gè)視頻文件
需要將多個(gè).ts文件名路徑保存再一個(gè)txt文檔中,而且格式必須一致凶杖,不能有中文杈湾,比如:file.txt文件浮驳,格式如下:file '文件路徑'
4.1 新建file.txt文檔:
file '/Users/hehe/Downloads/1702548298_1223480927_1.ts'
file '/Users/hehe/Downloads/1702548298_1517382547_2.ts'
file '/Users/hehe/Downloads/1702548298_150341039_3.ts'
注意:這里必須是單引號(hào),雙引號(hào)會(huì)報(bào)錯(cuò)。
4.2 執(zhí)行FFmpeg命令
# -safe 0: 防止Operation not permitted
ffmpeg -f concat -safe 0 -i file.txt -c copy out.mp4
有時(shí)使用上面的命令會(huì)出現(xiàn)如下錯(cuò)誤: alformed AAC bitstream detected: use the audio bitstream filter 'aac_adtstoasc' to fix it ('-bsf:a aac_adtstoasc' option with ffmpeg)
原因:
音頻數(shù)據(jù)是AAC流煤痕,在解碼時(shí)需要ADTS(Audio Data Transport Stream)頭部,不管是容器封裝還是流媒體历谍,沒(méi)有這個(gè)例驹,一般都是不能播放的。
改為輸入下面的命令即可解決:
ffmpeg -f concat -safe 0 -i file.txt -c:v copy -c:a copy -bsf:a aac_adtstoasc output.mp4
- 拆分文件
ffmpeg -ss 00:00:00.0 -to 00:00:10.0 -accurate_seek -i origin.mp4 -c copy -avoid_negative_ts 1 seg1.mp4
備注:
ffmpeg -ss 視頻開始時(shí)間 -to 視頻結(jié)束時(shí)間 -accurate_seek -i 要剪切的視頻名稱 -c copy -avoid_negative_ts 1 剪切完成保存名稱
視頻播放
- 采用RTMP協(xié)議傳輸?shù)臄?shù)據(jù)滩愁,經(jīng)過(guò)解協(xié)議操作后,輸出FLV格式的數(shù)據(jù)裁良。
概念引入
我相信音視頻大家每天都會(huì)接觸妹孙,從快播到愛(ài)奇藝懦傍,從B站再到抖音稍味,我們的腳步從未停下。
從上邊的介紹醉者,我們可以提取對(duì)視頻的兩種應(yīng)用場(chǎng)景:
本地播放。先保存為文件,再使用本地播放器播放
在線觀看。在線觀看又分為 直播(直播即實(shí)時(shí)視頻锅移,只要終端接收流就從那一刻開始)和 點(diǎn)播(點(diǎn)播即編輯好的視頻文件猴伶,存放在服務(wù)區(qū)或云上,被觀眾任意觀看)
上邊這兩種應(yīng)用場(chǎng)景栖忠,對(duì)于技術(shù)實(shí)現(xiàn)上來(lái)說(shuō)有什么區(qū)別呢崔挖?
對(duì)于本地播放,每個(gè)視頻都有自己的格式( .MP4庵寞,.RMVB, .AVI )等狸相,這些格式代表的是 封裝格式。簡(jiǎn)稱視頻格式捐川,也稱為 容器 脓鹃。為了統(tǒng)一口徑,本文統(tǒng)一稱 視頻封裝格式 古沥。何為封裝格式瘸右?就是把視頻數(shù)據(jù)和音頻數(shù)據(jù)打包成一個(gè)文件的規(guī)范。僅僅靠看文件的后綴岩齿,很難能看出具體使用了什么視音頻編碼標(biāo)準(zhǔn)太颤。總的來(lái)說(shuō)盹沈,不同的封裝格式之間差距不大龄章,各有優(yōu)劣。
在線觀看其實(shí)是一種視頻協(xié)議。也就是只有在有網(wǎng)絡(luò)時(shí)通過(guò)瀏覽器或者移動(dòng)端APP才能看到的視頻做裙。常見(jiàn)的直播流協(xié)議有:RTMP岗憋、RTSP、HTTP 等锚贱;常見(jiàn)的點(diǎn)播協(xié)議有:MP4仔戈、FLV、HLS 等拧廊。在連接視頻協(xié)議時(shí)监徘,除了音視頻頻流和metadata之外,可能還會(huì)攜帶播放的信令卦绣。
也有文章會(huì)把 視頻協(xié)議 歸入 視頻封裝格式耐量。這么分類也有其道理:視頻協(xié)議 和 視頻封裝格式 都同時(shí)攜帶了音視頻和metadata,以及協(xié)議/格式需要的其他信息滤港。以 FFMpeg
為例廊蜒,并不區(qū)分視頻格式和視頻協(xié)議;但是 GStreamer
的話溅漾,還時(shí)需要指定 視頻協(xié)議山叮,但是不區(qū)分視頻封裝格式。
為什么會(huì)有視頻編碼
對(duì)于我們?nèi)粘K吹降膱D形圖像視頻而言添履,其最終通過(guò)計(jì)算機(jī)屁倔,通過(guò)顯示器呈現(xiàn)給我們的數(shù)據(jù)實(shí)際上是對(duì)應(yīng)于屏幕上一個(gè)一個(gè)的點(diǎn),我們稱之為像素暮胧,而這種像素格式一般來(lái)講就是 RGB 格式锐借。RGB 想必大家并不陌生,其就是與自然界的三原色而對(duì)應(yīng)往衷。我們知道钞翔,紅綠藍(lán)三色的值在計(jì)算機(jī)中比較常用的表示方法是用 0-255 之間的一個(gè)數(shù)字來(lái)表示,那么表示紅色在計(jì)算機(jī)中就需要 1 bytes 的空間席舍,那么一個(gè)像素如果含有 RGB 三個(gè)分量乱投,那么其就需要占用 3 bytes球凰。
假設(shè)一張 1920 * 1080 大小的圖片沉馆,其占用的字節(jié)數(shù)是 1920 * 1080 * 3 個(gè) bytes囤躁,大約 5 MB。不知道大家是否知道視頻的本質(zhì)是什么福铅,姑且解釋一下萝毛,我們通過(guò)計(jì)算機(jī)看到的任何動(dòng)態(tài)的東西,其本質(zhì)就是一些靜止的圖片滑黔,當(dāng)這些圖片在單位時(shí)間內(nèi)的數(shù)量比較大時(shí)珊泳,人眼將會(huì)看到其是連續(xù)動(dòng)作的鲁冯,一般這個(gè)臨界值大概在 25 左右。那么也就是說(shuō)一個(gè)視頻的本質(zhì)是每秒鐘大于 25 的一些圖片序列的集合色查。
假設(shè)我們有一個(gè) 1920 * 1080 大小,時(shí)長(zhǎng) 2 個(gè)小時(shí)的電影撞芍。我們不妨算一下其數(shù)據(jù)量的大小秧了,每秒鐘的圖片張數(shù)姑且按 25 算,1920 * 1080 * 3 * 25 * 2 * 60 * 60序无,大約是 463 個(gè)G验毡。而互聯(lián)網(wǎng)的流量,是需要傳播的帝嗡,假設(shè)這一個(gè)視頻要從 internet 內(nèi)的 A 傳送到 B晶通,463 個(gè) G 的帶寬是什么概念。因此哟玷,我們便有了視頻的編碼狮辽,而所謂編碼,其本質(zhì)就是將數(shù)據(jù)壓縮巢寡,進(jìn)而減少帶寬或存儲(chǔ)空間的占用喉脖。
因此,他日若有人問(wèn)你抑月,編碼是干什么的树叽,你便可以回答:壓縮。這也是本專欄討論的核心內(nèi)容谦絮。
視頻播放器原理
既然有了編碼题诵,那么就會(huì)有對(duì)應(yīng)的解碼。視頻在傳輸過(guò)程中經(jīng)過(guò)媒體服務(wù)器可能發(fā)生再次編碼和解碼层皱,但是無(wú)論如何性锭,在用戶的播放器內(nèi)部還是需要解碼才能觀看,這里服務(wù)器編解碼我們暫時(shí)不談奶甘,主要來(lái)看看大家所熟悉的播放器編碼實(shí)現(xiàn)原理篷店。
視頻播放器播放一個(gè)互聯(lián)網(wǎng)上的視頻文件,需要經(jīng)過(guò)以下幾個(gè)步驟:
解協(xié)議
解封裝
解碼視音頻
視音頻同步
如果播放本地文件則不需要解協(xié)議臭家,為以下幾個(gè)步驟:
解封裝
解碼視音頻
視音頻同步
它們的過(guò)程如圖所示:
[圖片上傳失敗...(image-6c467a-1703560162450)]
1. 解協(xié)議
解協(xié)議的作用疲陕,就是將流媒體協(xié)議的數(shù)據(jù),解析為標(biāo)準(zhǔn)的相應(yīng)的封裝格式數(shù)據(jù)钉赁。視音頻在網(wǎng)絡(luò)上傳播的時(shí)候蹄殃,常常采用各種流媒體協(xié)議,例如HTTP你踩,RTMP诅岩,或是MMS等等讳苦。這些協(xié)議在傳輸視音頻數(shù)據(jù)的同時(shí),也會(huì)傳輸一些信令數(shù)據(jù)吩谦。這些信令數(shù)據(jù)包括對(duì)播放的控制(播放鸳谜,暫停,停止)式廷,或者對(duì)網(wǎng)絡(luò)狀態(tài)的描述等咐扭。解協(xié)議的過(guò)程中會(huì)去除掉信令數(shù)據(jù)而只保留視音頻數(shù)據(jù)。例如滑废,采用RTMP協(xié)議傳輸?shù)臄?shù)據(jù)蝗肪,經(jīng)過(guò)解協(xié)議操作后,輸出FLV格式的數(shù)據(jù)蠕趁。
2. 解封裝
解封裝的作用薛闪,就是將輸入的封裝格式的數(shù)據(jù),分離成為音頻流壓縮編碼數(shù)據(jù)和視頻流壓縮編碼數(shù)據(jù)俺陋。封裝格式種類很多豁延,例如MP4,MKV倔韭,RMVB术浪,TS,F(xiàn)LV寿酌,AVI等等胰苏,它的作用就是將已經(jīng)壓縮編碼的視頻數(shù)據(jù)和音頻數(shù)據(jù)按照一定的格式放到一起。例如醇疼,F(xiàn)LV格式的數(shù)據(jù)硕并,經(jīng)過(guò)解封裝操作后,輸出H.264編碼的視頻碼流和AAC編碼的音頻碼流秧荆。
3.解碼
解碼的作用倔毙,就是將視頻/音頻壓縮編碼數(shù)據(jù),解碼成為非壓縮的視頻/音頻原始數(shù)據(jù)乙濒。音頻的壓縮編碼標(biāo)準(zhǔn)包含AAC陕赃,MP3,AC-3等等颁股,視頻的壓縮編碼標(biāo)準(zhǔn)則包含H.264么库,MPEG2,VC-1等等甘有。解碼是整個(gè)系統(tǒng)中最重要也是最復(fù)雜的一個(gè)環(huán)節(jié)诉儒。通過(guò)解碼,壓縮編碼的視頻數(shù)據(jù)輸出成為非壓縮的顏色數(shù)據(jù)亏掀,例如YUV420P忱反,RGB等等泛释;壓縮編碼的音頻數(shù)據(jù)輸出成為非壓縮的音頻抽樣數(shù)據(jù),例如PCM數(shù)據(jù)温算。
4. 視音頻同步
視音頻同步的作用怜校,就是根據(jù)解封裝模塊處理過(guò)程中獲取到的參數(shù)信息,同步解碼出來(lái)的視頻和音頻數(shù)據(jù)米者,并將視頻音頻數(shù)據(jù)送至系統(tǒng)的顯卡和聲卡播放出來(lái)韭畸。
音視頻原始數(shù)據(jù)格式和編解碼標(biāo)準(zhǔn)
4.1 音頻的原始數(shù)據(jù)格式和編解碼標(biāo)準(zhǔn)
音頻的原始數(shù)據(jù)格式主要有如下幾種:
- PCM 格式
音頻的編解碼標(biāo)準(zhǔn)主要有如下幾種:
MP3
AAC
AC-3
4.2 視頻的原始數(shù)據(jù)格式和編解碼標(biāo)準(zhǔn)
視頻的原始數(shù)據(jù)格式主要有如下幾種:
YUV 格式
RGB 格式
視頻的編解碼標(biāo)準(zhǔn)主要有如下幾種:
H.264
H.265
MPEG2
這些原始數(shù)據(jù)格式和編解碼標(biāo)準(zhǔn)初次看是有點(diǎn)陌生,但接觸多了蔓搞,也就逐漸熟悉了,先以掌握主流的編解碼標(biāo)準(zhǔn)為主随橘,這里也只是列出了其中一部分而已喂分。
擴(kuò)展
流媒體傳輸協(xié)議
常用的流媒體協(xié)議主要有HTTP漸進(jìn)下載和基于RTSP/RTP的實(shí)時(shí)流媒體協(xié)議兩類。在流式傳輸?shù)膶?shí)現(xiàn)方案中机蔗,一般采用HTTP/TCP來(lái)傳輸控制信息蒲祈,而用RTP/UDP來(lái)傳輸實(shí)時(shí)多媒體數(shù)據(jù)。
數(shù)據(jù)壓縮原理
壓縮原理其實(shí)很簡(jiǎn)單萝嘁,就是找出那些重復(fù)出現(xiàn)的字符串梆掸,然后用更短的符號(hào)代替,從而達(dá)到縮短字符串的目的牙言。比如酸钦,有一篇文章大量使用"中華人民共和國(guó)"這個(gè)詞語(yǔ),我們用"中國(guó)"代替咱枉,就縮短了 5 個(gè)字符卑硫,如果用"華"代替,就縮短了 6 個(gè)字符蚕断。事實(shí)上欢伏,只要保證對(duì)應(yīng)關(guān)系,可以用任意字符代替那些重復(fù)出現(xiàn)的字符串亿乳。本質(zhì)上硝拧,所謂"壓縮"就是找出文件內(nèi)容的概率分布,將那些出現(xiàn)概率高的部分代替成 更 短 的 形 式 葛假。 所 以 障陶, 內(nèi) 容 越 是 重 復(fù) 的 文 件 , 就 可 以 壓 縮 地 越 小 桐款。 比 如 咸这,“ABABABABABABAB"可以壓縮成"7AB”。
相應(yīng)地魔眨,如果內(nèi)容毫無(wú)重復(fù)媳维,就很難壓縮酿雪。極端情況就是,遇到那些均勻分布的隨機(jī)字符串侄刽,往往連一個(gè)字符都?jí)嚎s不了指黎。比如,任意排列的 10 個(gè)阿拉伯?dāng)?shù)字(5271839406)州丹,就是無(wú)法壓縮的醋安;再比如,無(wú)理數(shù)(比如 π)也很難壓縮墓毒。
一些有名的算法: