一、什麼是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-tw/n/286727.html