python+ffmpeg視訊轉碼轉格式

blxt發表於2021-04-17

本文轉發來自:blog.csdn.net/KH_FC/article/detail...

廢話

python目前自己也是在學習當中,對python也不是特別精通,寫視訊轉碼這個東西也是自己用的到,所以自己在查閱了一些資料後寫的這樣一個簡單工具,這個工具自己使用就可以了,用到正式環境還是有很多不足的,這個有一些不完善,也希望有懂python的大神可以給完善一下哦。廢話不多說了開整。

方法

一開始在想自己去寫一個視訊轉碼的工具的時候在想是用PHP寫還是用python寫,最後選擇python是因為在PHP中碰壁了,到現在也沒能解決那個問題,PHP寫完出現的BUG是在大視訊轉碼時會存在請求超時的問題,到現在也沒能解決到這個BUG,試過修改PHP配置檔案中的請求時間、快取等等一些方法都沒有解決,真的是快瘋掉了,後面再想辦法搞一下吧,後面就想著看看Python會不會有這個問題,結果真的沒這個問題。
既然是要寫思路當然是要考慮怎麼去進行視訊轉碼,一開始想的是用Flask框架,最後想想Flask框架最後還是要在網頁上訪問使用麻煩,不如直接使用windows框直接就轉碼,直接雙擊程式碼搞定多好。最後初步定下來的就是使用python中tkinter模組去弄,直接寫一個windows GUI他不香嘛。顯示方式有了,後面就是轉碼了,怎麼轉碼呢?查閱了很多的網站,最後決定採用FFmpeg轉碼工具,工具選好了後面就是寫程式碼的事情了。後面寫的過程中確實又出現了一些問題,就是選用ffmpeg模組還是呼叫ffmpeg程式呢?本人本身是網路工程師出身,所以對程式碼很敏感,遇到比較難的就會頭疼,我分別查了模組和程式的使用方法,模組我參考的是:【Python】ffmpeg模組處理視訊、音訊資訊這篇文章,說實話寫的真不錯,就是我看不懂,太深奧了,估計我再學幾年python就能看懂了,博主等我哈,千萬別刪文章。程式我是去官網上看的文件ffmpeg官網,這個倒是挺簡單的我倒是能看懂,也發現確實可以進行視訊轉碼,好了有了方法了那後面就是思路了。

思路

其實這個思路也是蠻簡單的,無非我想要的就是雙擊我寫的python程式碼就可以直接彈出一個windows視窗,然後我輸入原視訊地址或者路徑,然後輸入一個轉碼後的名字,然後再弄個轉碼按鈕不就直接可以轉碼了。沒問題思路清晰,下面就是直接開整。

python+tkinter製作視窗

首先我既然要去弄這個視窗,當然我們得知道tkinter這個模組怎麼用,下面我總結了一些簡單的用法
示例

import tkinter        #匯入Tkubter模組
test = tkinter.Tk()
test.mainloop()

執行結果:
在這裡插入圖片描述
這樣一個簡單的windows視窗就有了,tkinter模組用法有很多,這裡就不細說了,下面繼續說我們的轉碼。

首先就是先製作一個windwos視窗然後讓我輸入一些資訊,下面是我寫的windows視窗。

import tkinter as tk    #匯入tkinter模組,並起別名為tk

wind=tk.Tk()    #建立頂層控制元件wind
wind.geometry("800x400")    #設定視窗大小
wind.title("視訊轉碼")    #設定視窗標題

title_lab=tk.Label(wind,text="視訊轉碼",font="仿宋 20 bold")    #建立窗格標題內容,字型,顏色
title_lab.place(x=350,y=30)    #設定標題位置

textlab=tk.Label(wind, text="請輸入視訊地址:", font="仿宋 20 bold", fg="blue", width=20) #建立表單名字,並設定字型、顏色、大小
textlab.place(x=0,y=100)    #設定表單名字位置
text_entry=tk.Entry(wind, width=30,font="仿宋 20 bold")    #建立輸入的控制元件entry,也就是表單
text_entry.place(x=300,y=100)    #設定控制元件位置

mzlab=tk.Label(wind, text="請輸入新視訊名稱:", font="仿宋 20 bold",fg="blue", width=18)    #建立表單名字,並設定字型、顏色、大小
mzlab.place(x=0,y=200)    #設定表單名字位置
mz_entry=tk.Entry(wind, width=30,bg="white",font="仿宋 20 bold")    #建立輸入的控制元件entry,也就是表單
mz_entry.place(x=300,y=200)    #設定控制元件位置

btn=tk.Button(wind,text="提交", font="仿宋 20 bold", fg="blue", width=8)    #設定提交按鈕,並設定字型樣式、大小
btn.place(x=350,y=300)    #設定按鈕位置
wind.mainloop()    #視窗的訊息迴圈

最後效果圖:
在這裡插入圖片描述
顯示寫出來了,後面該弄功能了

ffmpeg轉碼

在寫功能之前首先得學習ffmpeg怎麼用,不然的話功能也寫不出來

1. ffmpeg工具軟體

首先我們需要下載ffmpeg工具,下面是下載地址,下載的速度還算比較快,如果有覺的下載慢的,可以私聊我,我把軟體包發給大家或者直接在我的資源裡面下載也行
FFmpeg官網地址: www.ffmpeg.org/
FFmpeg下載地址: www.ffmpeg.org/download.html

2. 使用方法

語法:

ffmpeg -i 原始檔路徑及檔名稱 轉碼後檔案路徑及名稱

示例:

ffmpeg -i D:\test\abc.flv    D:\test\abc.mp4

實現就是這麼簡單,建議大家現在系統命令列中先測試下這個工具,看看能不能達到大家的要求,大家要是想了解ffmpeg的全部用法可以去官網文件上面檢視

python呼叫ffmpeg

其實相當簡單,只需要在python匯入OS模組就可以了,下面直接上程式碼

import os
dir = os.getcwd()    
#獲取當前檔案路徑,因為我這裡把ffmpeg工具放到了程式碼路徑,所以需要獲取一下當前路徑,這個根據大家實際情況寫
dir2 = '/windows-ffmpeg/x64/ffmpeg.exe'    #ffmpeg具體位置
ff = dir+dir    #組合路徑
result = eval(repr(ff).replace('\\','/'))
#轉換反斜槓為斜槓,因為獲取到的路徑是反斜槓的,需要轉換成斜槓,轉換後會發現是雙斜槓,所以需要下面再轉換下
ff = result.replace('//','/')    #雙斜槓轉為但斜槓
cmd = ff +' -i '+'D:\test\abc.flv' +' -c copy ' + 'D:\test\abc.mp4'
#寫需要執行的命令
os.system(cmd)    #執行系統命令,也就是進行轉碼

OK,執行上面程式碼直接進行轉碼,這裡需要注意的是路徑位置一定要對哦!
視窗有了,功能有了,那後面就是拼接了

成果

廢話不多說直接上結果:

import tkinter as tk
import os

wind=tk.Tk()    
wind.geometry("800x400")    
wind.title("視訊轉碼")    

title_lab=tk.Label(wind,text="視訊轉碼",font="仿宋 20 bold")
title_lab.place(x=350,y=30)    

textlab=tk.Label(wind, text="請輸入視訊地址:", font="仿宋 20 bold", fg="blue", width=20)
textlab.place(x=0,y=100)
text_entry=tk.Entry(wind, width=30,font="仿宋 20 bold")    
text_entry.place(x=300,y=100)    

mzlab=tk.Label(wind, text="請輸入新視訊名稱:", font="仿宋 20 bold",fg="blue", width=18)
mzlab.place(x=0,y=200)
mz_entry=tk.Entry(wind, width=30,bg="white",font="仿宋 20 bold")
mz_entry.place(x=300,y=200)

#下面是引用了一個執行轉碼的方法,並宣告執行結果
def getTextInput():    
    lianjie = text_entry.get()
    mz = mz_entry.get()
    mz = mz + '.mp4'
    ff = '/windows-ffmpeg/x64/ffmpeg.exe'
    ff1 = os.getcwd()
    ff = ff1+ff
    result = eval(repr(ff).replace('\\','/'))
    ff = result.replace('//','/')
    cmd = ff +' -i '+lianjie+' -c copy '+mz

    if os.system(cmd) == 0:     #判斷執行結果並進行轉碼
        test1=tk.Tk()    
        test1.geometry("200x100")    
        test1.title("")    
        title_lab=tk.Label(test1,text="視訊轉碼成功",font="仿宋 20 bold")    
        title_lab.place(x=0,y=0)    
        test1.mainloop()
    else:
        test2=tk.Tk()    
        test2.geometry("200x100")    
        test2.title("")    
        title_lab=tk.Label(test2,text="視訊轉碼失敗",font="仿宋 20 bold")    
        title_lab.place(x=0,y=0)    
        test2.mainloop()

btn=tk.Button(wind,text="提交", font="仿宋 20 bold", fg="blue", width=8,command=getTextInput)    #將資訊提交給上面的getTextInput方法
btn.place(x=350,y=300)
wind.mainloop()

雙擊python檔案的話會出現兩個視窗,一個是用來輸入資訊的視窗一個是用來顯示報錯資訊的視窗,這個工具有待完善,希望有會python的大神可以完善下
在這裡插入圖片描述
在這裡插入圖片描述
注意:這個工具需要注意的是如果你不想改程式碼直接用的話,就直接把ffmpeg工具和你的程式碼檔案放到一起,還有如果你不寫轉碼後檔案路徑預設會儲存到存放程式碼檔案的地方
原始碼上傳到了我的資源裡面,資源地址:download.csdn.net/download/KH_FC/1...

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章