前段時間,有朋友找我幫忙,自述其手機上使用UC瀏覽器,緩存的電影有近千個,手機存儲不夠了,想把這些電影轉存到PC機上,並且將其轉換為Mp4文件。小事情,安排!
一、分析情況,確定方案。
首先連接手機,將手機上的UCDownloads/VideoData文件夾中的全部文件及文件夾拷貝到電腦上,進行分析。
先看一下手機上緩存的文件格式,是很多個m3u8格式文件和一些文件夾。經查,發現這種文件並不是傳統意義上的視頻文件,更像是一個索引文件,就像是一本書的目錄一樣的東西,視頻內容保存在那些文件夾中,是很多個有序號的文件。
m3u8文件可以用普通的文本編輯工具進行編輯,其中詳細的標簽解釋,在網上有很多詳細的文章,這里就不啰嗦了。在m3u8文件中,最有用的就是視頻列表。如下:
從文件內容中可以很明顯看出,視頻片段的地址是手機上的路徑,這就排除了直接使用格式工廠等軟件進行轉換的模式,因為文件較多,不適合手動修改路徑,所以初步確定先使用python編寫腳本,逐個修改文件中的路徑信息,使用相對地址,即直接將原路徑中的“”/storage/emulated/0/UCDownloads/VideoData//“替換掉即可。完成替換后,再使用格式工廠等軟件進行格式轉換。
二、批量修改文件中的路徑
初步思路:1、建一個列表,存放影片文件夾中所有的m3u8文件路徑。2、循環列表,打開每一個m3u8文件,逐行進行修改,並將修改后的結果保存到原文件中。(注:m3u8文件較小,可以采用這種方法,但一般情況下不建議使用,可以考慮采用中間文件或保存到新文件后,再刪除舊文件的方法)
這里用到了os模塊中的幾條命令:一是os.listdir(),列出當前文件夾或指定文件夾下所有的文件及文件夾。二是os.path.splitext( ),分割指定路徑的文件名和擴展名部分。
直接看代碼吧!
import os m3u8list=[] #讀取當前目錄下所有的m3u8文件。 for fn in os.listdir(): if os.path.splitext(fn)[1]!='.m3u8': continue m3u8list.append(fn) #逐個修改m3u8文件中的路徑,將“/storage/emulated/0/UCDownloads/VideoData//”替換為空。 old_text1="/storage/emulated/0/UCDownloads/VideoData//" old_text2="/storage/emulated/0/UCDownloads/VideoData/" for mfile in m3u8list: file_data='' with open(mfile,"r",encoding="utf-8") as f: for line in f: if old_text1 in line: line=line.replace(old_text1,'') if old_text2 in line: line=line.replace(old_text2,'') file_data+=line with open(mfile,'w',encoding="utf-8") as f: f.write(file_data)
三、格式轉換
通過上邊的操作,將m3u8文件中原來的路徑,全部轉換為了電腦中的相對路徑,使用迅雷影音等播放器已經能夠播放這些視頻了,但朋友要求將其轉換為mp4文件,剛開始的思路是利用格式工廠等軟件進行轉換,省事省力,結果在使用格式工廠轉換時,出現錯誤,提示無法轉換沒有擴展名的文件,感覺格式工廠類的軟件應該有類似的設置,但沒有耐心去找,直接轉變思路,利用python調用ffmpeg程序進行格式轉換。
簡單說一下ffmpeg,它 是視頻處理最常用的開源軟件。功能強大,用途廣泛,大量用於視頻網站和商業軟件,也是許多音頻和視頻格式的標准編碼/解碼實現。(格式工廠應該就是用的ffmpeg)
1、到https://github.com/BtbN/FFmpeg-Builds/releases下載ffmpeg程序,選擇那個static 版本,這個靜態庫版本 里面有3個exe: ffmpeg.exe, ffplay.exe, ffprobe.exe,每個exe體積很大,因為相關的dll已經被編譯到exe 里面去了。作為工具而言此版本就可以滿足我們的需求。
2、下載后,直接解壓縮,並將文件路徑添加到系統PATH中,在命令行窗口運行
ffmpeg -version
看到此屏幕顯示,表示FFmpeg就可以正常使用了。
3、使用ffmpge轉換視頻格式的方法
一般使用命令
ffmpeg -i inputfile.m3u8 outfile.mp4
即可完成轉換,但是文件夾中視頻沒有擴展名,所以必須告訴它,忽略擴展名的問題,要加上參數:-allowed_extensions ALL,大致意思是允許所有的擴展名,也就同時允許了沒有擴展名的情況。
另外,為了提高轉換速度,還要對配置文件進行設置。要加上-preset ultrafast參數。
不多說,直接上代碼:
#調用FFMPEG,逐個進行轉換,參數一,忽略文件類型。參數二,轉換后文件名。 #這里因為不需要返回值,只需知道是否轉換成功,所以使用了subprocess模塊中的call命令,來調用ffmpeg程序。
errlist=[] for mfile in m3u8list: subname = mfile.split('.') output_path = subname[0] + "_new.mp4" commcode="ffmpeg -allowed_extensions ALL -i "+mfile+' -preset ultrafast '+output_path ret=subprocess.call(commcode,shell=True) if ret==0: print (mfile+'is ok') else: errlist.append(mfile) print (errlist)