一、引言
老猿之所以學習和研究Moviepy的使用,是因為需要一個將視頻轉成動畫的工具,當時在網上到處搜索查找免費使用工具,結果找了很多自稱免費的工具,但轉完GIF後都會在動畫中打上對應工具的顯著廣告或Logo,根本沒法將轉換後的動畫發布。如是想到了萬能的Python,就找到了moviepy,沒費多少時間就搞定了,因此萌發了學習和研究Moviepy的興趣。本文利用前面介紹的知識來開發一個windows下圖形化的視頻轉GIF或圖片的工具。
二、背景知識介紹
1、視頻轉gif或圖片會用到《moviepy音視頻剪輯:視頻剪輯基類VideoClip的屬性及方法詳解》、《moviepy音視頻剪輯:視頻剪輯基類VideoClip詳解》介紹的write_images_sequence和write_gif方法,具體內容在此就不贅述了;2、圖形化工具開發會用到專欄《使用PyQt開發圖形界面Python應用》或《PyQt入門知識》的知識;3、打包生成exe會用到《PyQt(Python+Qt)學習隨筆:windows下使用pyinstaller將PyQt文件打包成exe可執行文件》介紹的方法進行打包;4、程序的框架與《PyQt+moviepy音視頻剪輯實戰1:多視頻合成順序播放或同屏播放的視頻文件》、《PyQt+moviepy音視頻剪輯實戰2:實現一個剪裁視頻文件精華內容留存工具》或《PyQt+moviepy音視頻剪輯實戰1:多個音視頻合成順序播放或同屏播放的視頻文件實現詳解》、《PyQt+moviepy音視頻剪輯實戰2:一個剪裁視頻文件精華內容留存工具的實現》相同。
三、圖形界面設計
本程序的界面框架除了主界面之外的部分都是復用《PyQt+moviepy音視頻剪輯實戰1:多個音視頻合成順序播放或同屏播放的視頻文件實現詳解》、《PyQt+moviepy音視頻剪輯實戰1:多視頻合成順序播放或同屏播放的視頻文件》的公用框架。
主界面如下:
四、代碼實現
4.1、主界面類及構造方法
class mainWin(QtWidgets.QMainWindow,ui_mainWin.Ui_MainWindow): def __init__(self): super().__init__() self.setupUi(self) self.initValues() self.initSignalAndSlots() self.initPublicFrame()1234567894.2、槽和信號連接方法initSignalAndSlots
def initSignalAndSlots(self): self.btn_choiceSrc.clicked.connect(self.chooseFile) self.videoFile.textChanged['QString'].connect(self.fileNameInputed) self.btn_choiceDest.clicked.connect(self.chooseFile) self.action2Gif.triggered.connect(self.convert) self.action2Img.triggered.connect(self.convert)12345674.3、視頻轉換方法
def convertByMoviepy(self,srcFile,destFile,toGif): destFileName,destFileType = destFile.rsplit('.',1) if toGif: destFileType = '.gif' else: destFileType = '.jpg' destFile = destFileName+destFileType print("convertUseMoviepy start:",srcFile,'-->',destFile) try: start = int(self.startPos.text().strip(' \r\n\t')) end = int(self.endPos.text().strip(' \r\n\t')) vfps = int(self.fps.text()) except Exception as e: print("輸入了非法的數字字符,不能轉換:",e) return try: if end: if start>end: print("指定視頻開始位置大於結束位置,不能轉換") return cache = mpe.VideoFileClip(srcFile).subclip(start, end) else:cache = mpe.VideoFileClip(srcFile) except Exception as e: info = f"視頻文件無法讀取,可能是因為格式不支持:{e}" print(info) print("任務無法執行!") return if vfps<1 or vfps>30:vfps = 2 if not toGif: imgCount = len(str(vfps*(end-start+1)))+1 format = f"_%0{imgCount}d" destFileFormat = destFileName +format+ destFileType fileFormat = '_'+'X'*imgCount destFileFormatName = destFileName +fileFormat+ destFileType try: if toGif: cache.write_gif(destFile,fps=vfps) else: cache.write_images_sequence(destFileFormat,vfps) except Exception as e: if toGif: print(f"視頻{srcFile}轉換gif失敗:", e) else: print(f"視頻{srcFile}轉換圖片失敗:", e) else: if toGif: print(f"視頻{srcFile}轉換gif成功,結果保存在{destFile}中") else: print(f"視頻{srcFile}轉換圖片成功,結果保存在{destFileFormatName}中") cache.close()五、運行界面
5.1、初始主界面
5.2、進行視頻轉換的運行過程界面
這是從F:\video\zbl1.mp4視頻轉成一系列圖片輸出,每秒取一幀圖片保存,每個圖片的名字是輸出文件名加序號再加後綴的形式,如zbl1_09.jpg,第一張序號為0,即zbl1_00.jpg,序號的長度根據生成圖片的視頻需要生成的文件數來決定,超過100個就是3位、超過1000個就是4位…。
六、打包成windows執行文件
使用《PyQt(Python+Qt)學習隨筆:windows下使用pyinstaller將PyQt文件打包成exe可執行文件》介紹的方法進行打包。
老猿的工程包含了兩個公共框架目錄,因此打包使用如下命令:
pyinstaller video2Gif.py -w -p F:\coffeDog\loadApp2 -p F:\coffeDog\captureStdout2>log.txt注意:moviepy的包必須使用《關於moviepy打包報錯AttributeError: module audio/video.fx.all has no attribute fadein、crop文章的糾錯和抄襲》修改了的文件,否則打包執行會報錯。
在win7、win10上可運行的可執行程序包已經上傳到百度雲,大家可以下載下來長期免費使用。具體下載地址為百度網盤。
連結:https:///s/1UNaA2UqQBoxx-v8rCIPDhA
提取碼:yh2d
選擇該連結下的:視頻轉圖片和動畫工具V2.0.rar即可,下載後解壓到指定目錄後,選擇exe文件直接執行即可。不過使用該工具會自動打開老猿的博客請大家點讚,敬請大家支持,謝謝。
注意:
百度雲上分享的《咖啡狗免費工具軟體共享空間》下的不同軟體安裝時必須解壓到不同目錄,如果解壓到同一目錄可能有衝突導致不能正常運行,但解壓後遵循如下要求可以將其聚合到同一個目錄:
放置到同一目錄的不同軟體的版本必須相同,版本為壓縮文件名中VX.X標註;聚合拷貝時除拷貝執行文件外,還有resource目錄必須拷貝,如果resource目錄下有相同文件名可以覆蓋;聚合拷貝exe文件和resource目錄及其下文件到其他已解壓工具目錄後,源目錄可以刪除。更多moviepy的介紹請參考《PyQt+moviepy音視頻剪輯實戰文章目錄》或《moviepy音視頻開發專欄》。
更多內容請大家到CSDN官網「老猿Python」博客或「老猿Python」微信公眾號上查看。