一、什麼是m3u8格式以及它的應用場景
m3u8是被廣泛應用於流媒體傳輸協議中的格式,是基於HTTP Live Streaming (HLS)協議的媒體播放列表文件格式。它可以存放多個媒體文件的路徑,以列表的形式保存,方便用戶在客戶端進行播放。因為HLS協議的優勢,m3u8格式現在已經在各大視頻網站應用廣泛。利用m3u8解析可以讓我們獲取到很多的視頻資源,為我們的學習和娛樂提供了極大的便利。
二、m3u8解析的原理
m3u8文件通過抓包可以獲取到,但網站都採取了加密的措施,常見的如通過URL參數加密,AES加密等。而實際上網站的視頻資源我們是可以獲取到的,只是需要通過m3u8解析將這些視頻資源組合起來。
在解析m3u8文件時,我們需要先用requests庫模擬請求並獲取m3u8文件的文本,接着我們可以解析m3u8文件,獲取其中每個ts文件的URL,下載這些ts文件併合併到一起,就可以獲得完整的視頻資源了。
import requests url = 'https://example.com/video.m3u8' m3u8_text = requests.get(url).text
三、實戰:m3u8視頻解析的實現
下面我們來看一下一個基本的m3u8視頻解析實現的代碼示例。
import requests
import os
headers = {
'Referer': 'https://example.com/',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36'
}
def download_m3u8_url(url):
'''
下載m3u8文件並解析出其中的TS文件URL
'''
m3u8_text = requests.get(url, headers=headers).text
ts_urls = [url.rsplit('/', 1)[0] + '/' + i for i in m3u8_text.split('\n') if i.endswith('.ts')]
return ts_urls
def download_m3u8(ts_urls, output_filename):
'''
合併下載TS文件,並保存為指定的文件名
'''
with open(output_filename, 'wb') as f:
for i, ts_url in enumerate(ts_urls, 1):
print(f'正在下載第{i}/{len(ts_urls)}個ts文件...')
ts_content = requests.get(ts_url, headers=headers).content
f.write(ts_content)
url = 'https://example.com/video.m3u8'
output_filename = 'output.mp4'
ts_urls = download_m3u8_url(url)
download_m3u8(ts_urls, output_filename)
四、應用擴展:通過FFmpeg將TS文件合併成MP4文件
上述的代碼我們已經可以通過m3u8解析獲取到視頻資源並下載到本地,但是這些ts文件並不是直接可以播放的,需要使用FFmpeg將其合併成MP4格式的文件。
import os
def merge_ts_to_mp4(ts_dirname, mp4_filename):
'''
將一個目錄下的所有ts文件合併成一個MP4文件
'''
os.chdir(ts_dirname)
ts_filenames = ' '.join([f'file \'{f}\'' for f in os.listdir() if f.endswith('.ts')])
os.system(f'ffmpeg -i \"{ts_filenames}\" -acodec copy -vcodec copy -f mp4 \"{mp4_filename}\"')
ts_dirname = 'ts_files'
mp4_filename = 'output.mp4'
merge_ts_to_mp4(ts_dirname, mp4_filename)
五、總結
m3u8解析可以讓我們獲取到很多的視頻資源,為我們的學習和娛樂提供了極大的便利。在解析m3u8文件時,我們需要先用requests庫模擬請求並獲取m3u8文件的文本,接着我們可以解析m3u8文件,獲取其中每個ts文件的URL,下載這些ts文件併合併到一起,就可以獲得完整的視頻資源了。當我們需要播放下載下來的ts視頻文件時,需要使用FFmpeg將其合併成MP4格式的文件。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/286727.html
微信掃一掃
支付寶掃一掃