被禁?下載的釘釘直播回放如何下載?
簡(jiǎn)介
m3U8 是 Unicode 版本的 M3U,用 UTF-8 編碼?!癕3U” 和 “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文件,類似于爬蟲(chóng)。
拿到了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)酷則使用貓抓嗅探不到任何東西,可是打開(kāi)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)單,打開(kāi)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
image.png
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è)視頻文件
直接寫文件名,文件之間使用 | 隔開(kāi)
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 視頻開(kāi)始時(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í)視頻,只要終端接收流就從那一刻開(kāi)始)和 點(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ù)(比如 π)也很難壓縮。
一些有名的算法:
