python+ffmpeg,批量轉換手機中的m3u8文件


  前段時間,有朋友找我幫忙,自述其手機上使用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) 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM