m3u8

被禁?下載的釘釘直播回放如何下載?

簡(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文件,就可以了。

image.png

所以我們可以知道,索引文件非常重要,索引文件里面存儲(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è)非常有名的嗅探插件。


image.png

我們看網(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)上有很多提取工具

軟件使用也很簡(jiǎn)單,打開(kāi)N_m3u8DL-CLI-SimpleG.exe文件,首先設(shè)置視頻下載之后的位置,其次把m3u8地址復(fù)制進(jìn)去,選擇下方的合并后刪除分片,最后點(diǎn)擊go就可以了。

image.png

點(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)行合成。

  1. 下載ffmpeg:brew install ffmpeg
  2. 單個(gè)文件轉(zhuǎn)換格式:ffmpeg -i yourfilename.ts output.mp4
  3. 少量多個(gè)文件合成一個(gè)視頻文件
    直接寫文件名,文件之間使用 | 隔開(kāi)
    ffmpeg -i "concat:1.ts|2.ts|3.ts|4.ts|.5.ts|" -c copy output.mp4
  4. 大量多個(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
  1. 拆分文件
    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站再到抖音,我們的腳步從未停下。

image.png

從上邊的介紹,我們可以提取對(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 的一些圖片序列的集合。

image.png

假設(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ù)(比如 π)也很難壓縮。

一些有名的算法:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 簡(jiǎn)介 M3U8 是 Unicode 版本的 M3U,用 UTF-8 編碼。"M3U" 和 "M3U8" 文件都是蘋...
    Whyn閱讀 246,938評(píng)論 6 123
  • 本文講述的是iOS相關(guān)的下載實(shí)現(xiàn)方式。 大綱 1.前言 M3U8簡(jiǎn)介 2. M3U8文件格式 擴(kuò)展M3U指令 頂級(jí)...
    尼古拉斯_小巍閱讀 2,194評(píng)論 0 2
  • 1. M3U 協(xié)議解析 ??M3U8文件是指UTF-8編碼格式的M3U文件。M3U文件是記錄了一個(gè)索引純文本文件,...
    starmier閱讀 14,188評(píng)論 0 6
  • m3u8文件信息總結(jié) 最近在做視頻下載,本地播放功能的時(shí)候,發(fā)現(xiàn)的問(wèn)題,先筆記記錄一下 開(kāi)發(fā)思路 (1) 在線解析...
    不要虛度美好的時(shí)光閱讀 13,329評(píng)論 0 3
  • M3U本質(zhì)上說(shuō)不是音頻文件,它是音頻文件的列表文件,是純文本文件。你下載下來(lái)打開(kāi)它,播放軟件并不是播放它,而是根據(jù)...
    Siriusforever閱讀 2,548評(píng)論 0 1

友情鏈接更多精彩內(nèi)容