前言
盜版影視網站m3u8串流影片常伴隨將ts片段偽裝 bmp 、png或 jpg 等圖片類型,上傳到免費圖床,達到白嫖圖床目的,但這也導致ts無法使用ffmpeg進行合併成.mp4檔案,因此,我們需要一種方法來移除圖片數據,保留影片部分。
思路
通過觀察正常 TS 檔案與偽裝為圖片的 TS 檔案的二進制數據,可以發現 TS 影片片段的二進制數據在開始不久後通常包含關鍵字 “FFmpeg Service01w”。這一特性主要來自於大多數影片切割操作使用 FFmpeg 工具的結果。
一個標準的 TS 檔案通常以 0x47
作為開頭,每個封包大小為 188 字節,因此每隔 188 字節就會出現一次 0x47
。文章只說比較簡單,基於FFmpeg處理後TS檔案,我們可以從找到 “FFmpeg Service01w” 關鍵字的位置出發,向前回溯 25 個字節,即可準確定位到 TS 檔案的起始位置。當然,你也可以選擇其他方法,例如檢測 0x47
每個封包大小為188字節,會再出現0x47
的規律性,來切出完整TS檔案。
實作
這邊使用python實作,其他程式語言也可以用同樣原理處理,原理就如思路所寫進行處理就可以。
import os
ts_file_path = 'music_18a544d252da4fb497e43e04f3c3cce10.jpeg' # 偽裝圖片ts檔案
replace_data = None
with open(ts_file_path,"rb") as f:
data = f.read()
# 判斷是否有PNG包頭
if data.startswith(b'\211PNG\r\n\032\n'):
# 尋找FFmpeg Service01w位置,並且向前取得檔案開頭
index = data.find(b'FFmpeg\tService01w')
if index>=25:
replace_data = data[index-25:]
# 如果是有偽裝ts進行保存
if replace_data is not None:
with open("{}.ts".format("/".join(os.path.splitext(ts_file_path)[:-1])), "wb") as f:
f.write(replace_data)
print("ts偽裝移除完成")
else:
print("ts檔案沒有偽裝")
太神啦 感謝你 最近剛遇到這個問題
很高興可以幫助到您,後續有任何問題都可以提問喔
博主第二张图片不能正常显示了。
感謝提醒 剛已經重新上傳