python+ffmpeg视频转码转格式
廢話
python目前自己也是在學(xué)習(xí)當(dāng)中,對python也不是特別精通,寫視頻轉(zhuǎn)碼這個(gè)東西也是自己用的到,所以自己在查閱了一些資料后寫的這樣一個(gè)簡單工具,這個(gè)工具自己使用就可以了,用到正式環(huán)境還是有很多不足的,這個(gè)有一些不完善,也希望有懂python的大神可以給完善一下哦。廢話不多說了開整。
方法
一開始在想自己去寫一個(gè)視頻轉(zhuǎn)碼的工具的時(shí)候在想是用PHP寫還是用python寫,最后選擇python是因?yàn)樵赑HP中碰壁了,到現(xiàn)在也沒能解決那個(gè)問題,PHP寫完出現(xiàn)的BUG是在大視頻轉(zhuǎn)碼時(shí)會(huì)存在請求超時(shí)的問題,到現(xiàn)在也沒能解決到這個(gè)BUG,試過修改PHP配置文件中的請求時(shí)間、緩存等等一些方法都沒有解決,真的是快瘋掉了,后面再想辦法搞一下吧,后面就想著看看Python會(huì)不會(huì)有這個(gè)問題,結(jié)果真的沒這個(gè)問題。
既然是要寫思路當(dāng)然是要考慮怎么去進(jìn)行視頻轉(zhuǎn)碼,一開始想的是用Flask框架,最后想想Flask框架最后還是要在網(wǎng)頁上訪問使用麻煩,不如直接使用windows框直接就轉(zhuǎn)碼,直接雙擊代碼搞定多好。最后初步定下來的就是使用python中tkinter模塊去弄,直接寫一個(gè)windows GUI他不香嘛。顯示方式有了,后面就是轉(zhuǎn)碼了,怎么轉(zhuǎn)碼呢?查閱了很多的網(wǎng)站,最后決定采用FFmpeg轉(zhuǎn)碼工具,工具選好了后面就是寫代碼的事情了。后面寫的過程中確實(shí)又出現(xiàn)了一些問題,就是選用ffmpeg模塊還是調(diào)用ffmpeg程序呢?本人本身是網(wǎng)絡(luò)工程師出身,所以對代碼很敏感,遇到比較難的就會(huì)頭疼,我分別查了模塊和程序的使用方法,模塊我參考的是:【Python】ffmpeg模塊處理視頻、音頻信息這篇文章,說實(shí)話寫的真不錯(cuò),就是我看不懂,太深?yuàn)W了,估計(jì)我再學(xué)幾年python就能看懂了,博主等我哈,千萬別刪文章。程序我是去官網(wǎng)上看的文檔ffmpeg官網(wǎng),這個(gè)倒是挺簡單的我倒是能看懂,也發(fā)現(xiàn)確實(shí)可以進(jìn)行視頻轉(zhuǎn)碼,好了有了方法了那后面就是思路了。
思路
其實(shí)這個(gè)思路也是蠻簡單的,無非我想要的就是雙擊我寫的python代碼就可以直接彈出一個(gè)windows窗口,然后我輸入原視頻地址或者路徑,然后輸入一個(gè)轉(zhuǎn)碼后的名字,然后再弄個(gè)轉(zhuǎn)碼按鈕不就直接可以轉(zhuǎn)碼了。沒問題思路清晰,下面就是直接開整。
python+tkinter制作窗口
首先我既然要去弄這個(gè)窗口,當(dāng)然我們得知道tkinter這個(gè)模塊怎么用,下面我總結(jié)了一些簡單的用法
【示例】
執(zhí)行結(jié)果:
這樣一個(gè)簡單的windows窗口就有了,tkinter模塊用法有很多,這里就不細(xì)說了,下面繼續(xù)說我們的轉(zhuǎn)碼。
首先就是先制作一個(gè)windwos窗口然后讓我輸入一些信息,下面是我寫的windows窗口。
import tkinter as tk #導(dǎo)入tkinter模塊,并起別名為tkwind=tk.Tk() #建立頂層控件wind wind.geometry("800x400") #設(shè)置窗口大小 wind.title("視頻轉(zhuǎn)碼") #設(shè)置窗口標(biāo)題title_lab=tk.Label(wind,text="視頻轉(zhuǎn)碼",font="仿宋 20 bold") #創(chuàng)建窗格標(biāo)題內(nèi)容,字體,顏色 title_lab.place(x=350,y=30) #設(shè)置標(biāo)題位置textlab=tk.Label(wind, text="請輸入視頻地址:", font="仿宋 20 bold", fg="blue", width=20) #創(chuàng)建表單名字,并設(shè)置字體、顏色、大小 textlab.place(x=0,y=100) #設(shè)置表單名字位置 text_entry=tk.Entry(wind, width=30,font="仿宋 20 bold") #建立輸入的控件entry,也就是表單 text_entry.place(x=300,y=100) #設(shè)置控件位置mzlab=tk.Label(wind, text="請輸入新視頻名稱:", font="仿宋 20 bold",fg="blue", width=18) #創(chuàng)建表單名字,并設(shè)置字體、顏色、大小 mzlab.place(x=0,y=200) #設(shè)置表單名字位置 mz_entry=tk.Entry(wind, width=30,bg="white",font="仿宋 20 bold") #建立輸入的控件entry,也就是表單 mz_entry.place(x=300,y=200) #設(shè)置控件位置btn=tk.Button(wind,text="提交", font="仿宋 20 bold", fg="blue", width=8) #設(shè)置提交按鈕,并設(shè)置字體樣式、大小 btn.place(x=350,y=300) #設(shè)置按鈕位置 wind.mainloop() #窗口的消息循環(huán)最后效果圖:
顯示寫出來了,后面該弄功能了
ffmpeg轉(zhuǎn)碼
在寫功能之前首先得學(xué)習(xí)ffmpeg怎么用,不然的話功能也寫不出來
1. ffmpeg工具軟件
首先我們需要下載ffmpeg工具,下面是下載地址,下載的速度還算比較快,如果有覺的下載慢的,可以私聊我,我把軟件包發(fā)給大家或者直接在我的資源里面下載也行
FFmpeg官網(wǎng)地址: https://www.ffmpeg.org/
FFmpeg下載地址: https://www.ffmpeg.org/download.html
2. 使用方法
語法:
ffmpeg -i 源文件路徑及文件名稱 轉(zhuǎn)碼后文件路徑及名稱示例:
ffmpeg -i D:\test\abc.flv D:\test\abc.mp4實(shí)現(xiàn)就是這么簡單,建議大家現(xiàn)在系統(tǒng)命令行中先測試下這個(gè)工具,看看能不能達(dá)到大家的要求,大家要是想了解ffmpeg的全部用法可以去官網(wǎng)文檔上面查看
python調(diào)用ffmpeg
其實(shí)相當(dāng)簡單,只需要在python導(dǎo)入OS模塊就可以了,下面直接上代碼
import os dir = os.getcwd() #獲取當(dāng)前文件路徑,因?yàn)槲疫@里把ffmpeg工具放到了代碼路徑,所以需要獲取一下當(dāng)前路徑,這個(gè)根據(jù)大家實(shí)際情況寫 dir2 = '/windows-ffmpeg/x64/ffmpeg.exe' #ffmpeg具體位置 ff = dir+dir #組合路徑 result = eval(repr(ff).replace('\\','/')) #轉(zhuǎn)換反斜杠為斜杠,因?yàn)楂@取到的路徑是反斜杠的,需要轉(zhuǎn)換成斜杠,轉(zhuǎn)換后會(huì)發(fā)現(xiàn)是雙斜杠,所以需要下面再轉(zhuǎn)換下 ff = result.replace('//','/') #雙斜杠轉(zhuǎn)為但斜杠 cmd = ff +' -i '+'D:\test\abc.flv' +' -c copy ' + 'D:\test\abc.mp4' #寫需要執(zhí)行的命令 os.system(cmd) #執(zhí)行系統(tǒng)命令,也就是進(jìn)行轉(zhuǎn)碼OK,執(zhí)行上面代碼直接進(jìn)行轉(zhuǎn)碼,這里需要注意的是路徑位置一定要對哦!
窗口有了,功能有了,那后面就是拼接了
成果
廢話不多說直接上結(jié)果:
import tkinter as tk import oswind=tk.Tk() wind.geometry("800x400") wind.title("視頻轉(zhuǎn)碼") title_lab=tk.Label(wind,text="視頻轉(zhuǎn)碼",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)#下面是引用了一個(gè)執(zhí)行轉(zhuǎn)碼的方法,并聲明執(zhí)行結(jié)果 def getTextInput(): lianjie = text_entry.get()mz = mz_entry.get()mz = mz + '.mp4'ff = '/windows-ffmpeg/x64/ffmpeg.exe'ff1 = os.getcwd()ff = ff1+ffresult = eval(repr(ff).replace('\\','/'))ff = result.replace('//','/')cmd = ff +' -i '+lianjie+' -c copy '+mzif os.system(cmd) == 0: #判斷執(zhí)行結(jié)果并進(jìn)行轉(zhuǎn)碼test1=tk.Tk() test1.geometry("200x100") test1.title("") title_lab=tk.Label(test1,text="視頻轉(zhuǎn)碼成功",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="視頻轉(zhuǎn)碼失敗",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文件的話會(huì)出現(xiàn)兩個(gè)窗口,一個(gè)是用來輸入信息的窗口一個(gè)是用來顯示報(bào)錯(cuò)信息的窗口,這個(gè)工具有待完善,希望有會(huì)python的大神可以完善下
注意:這個(gè)工具需要注意的是如果你不想改代碼直接用的話,就直接把ffmpeg工具和你的代碼文件放到一起,還有如果你不寫轉(zhuǎn)碼后文件路徑默認(rèn)會(huì)保存到存放代碼文件的地方
源代碼上傳到了我的資源里面,資源地址:https://download.csdn.net/download/KH_FC/16719873
總結(jié)
以上是生活随笔為你收集整理的python+ffmpeg视频转码转格式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个优秀活跃的视频转码项目分享
- 下一篇: 读取视频文件python-opencv