写在前面
其实这个不全是python的实现的,主要实现由一款名为 FFmpeg 的软件工具实现,单用FFmpeg这款工具软件是可以实现视频格式的,但是这个工具只能在命令行下使用,所以使用起来会给人以 挺麻烦 的感觉。python中有一个os的模块,利用这个模块,可以在python程序中执行命令行中的命令。这样用python可以编写比较人性化的交互页面,这样只需要传入视频文件的原地址,做一些选择,就可以轻松的按自己的需求实现格式转换。
本文基于Windows下,用Pycharm进行程序编写。
FFmpeg工具软件
FFmpeg官网地址 https://www.ffmpeg/
FFmpeg下载地址 https://www.ffmpeg/download.html
这个工具好像可以实现各种音视频格式的转换,甚至可以从视频中提取音频。据说FFmpeg是很多视频播放器和转码工具的内核。( https://www.jianshu/p/7ed3be01228b )
使用方式,调用cmd命令行(可以通过Win+R搜索cmd,也可以通过Win+s搜索cmd),操作命令如下
ffmpeg -i 输入文件全路径 输出文件全路径
for example
ffmpeg -i C:\Users\Administrator\Desktop\wk.mp4 C:\Users\Administrator\Desktop\wk.mp3
没毛病,这是可以实现的,这样既可从.mp4视频文件中提取出音频,当然不同格式的视频转换也是可以实现。而且,FFmpeg的强大远不止于此,它可以从视频中截图、截取部分视频、合并视频、设置音频的码率……具体可以参考 https://www.ffmpeg/ffmpeg.html (英文的。。。)
python编程调用FFmpeg
使用python编程电泳FFmpeg实现格式转换。
# 导入os模块
import os
# 定义输入文件路径(其中r是转义字符,为了让 \ 不起作用)
path_in = r'C:\Users\Administrator\Desktop\wk.mp4'
# 定义输出文件路径
path_out = r'C:\Users\Administrator\Desktop\wk.mp3'
# 拼接cmd下的命令
cmd = 'ffmpeg -i '+path_in+' '+path_out
# 执行cmd命令
os.system(cmd)
程序的执行需要时间,但是这个过程不会在pycharm的控制台显示,当看到
就说明程序结束了。
python调用FFmpeg进阶
这里说的进阶是做个页面出来,调用“选择文件”的功能直接选择要转格式的文件,并指定要输出的目标地址。输出文件名默认是输入文件的名称,提交之后可以自动完成转换。效果大概是这样:
输入文件直接输入要转格式的文件,输出位置选择格式转换后的存放文件夹,目标格式通过键入的方式输入。
首先把转换格式的功能封装成函数,传入三个参数,输入文件、输出位置、和目标格式,在函数内拼接并执行命令。编写convert.py,代码如下
import os def convert(pin, pout, aim): # 获得文件名 fname = pin.split('/')[-1].split('.')[0] # 拼接命令 cmd = 'ffmpeg -i ' + pin + ' ' + pout+'/'+fname+'.'+aim # 执行命令 os.system(cmd)
编写窗口文件windows.py,代码如下
import tkinter as tk from tkinter.filedialog import * # tkinter下的文件处理模块 from video_format_convert.convert import convert # 点击“选择文件”按钮调用该功能 def selectFilePath(): path_ = askopenfilename(title='选择文件') # 选择文件的功能 pathin.set(path_) # 点击“选择文件夹”调用该功能 def selectDirecPath(): path_ = askdirectory(title='选择文件夹') # 选择文件夹的功能 pathout.set(path_) # 点击提交执行的功能 def executeit(): hint.set('converting . . .') convert(pathin.get(), pathout.get(), aimf.get()) hint.set('convert finished') # 生成窗口 window = tk.Tk() window.title('格式转换') window.geometry('450x300') # 格式转换label tk.Label(window, text='格式转换').place(x=200, y=10) # x是从左向右的偏移,y是从上向下的偏移 # 输入文件一行 pathin = tk.StringVar() # 定义变量 tk.Label(window, text='输入文件:').place(x=50, y=50) entry_pathin = tk.Entry(window, textvariable=pathin).place(x=160, y=50) # 输入框 btn_pathin = tk.Button(window, text='选择文件', command=selectFilePath).place(x=340, y=45) # 按钮 # 输出文件的一行 pathout = tk.StringVar() tk.Label(window, text='输出位置:').place(x=50, y=100) # 从左偏,从上偏 tk.Entry(window, textvariable=pathout).place(x=160, y=100) tk.Button(window, text='选择文件夹', command=selectDirecPath).place(x=335, y=95) # 目标格式的一行 aimf = tk.StringVar() tk.Label(window, text='目标格式:').place(x=50, y=150) # 从左偏,从上偏 tk.Entry(window, textvariable=aimf).place(x=160, y=150) # 提交按钮 tk.Button(window, text=' 提 交 ', command=executeit).place(x=200, y=190) # 提示区域 hint = tk.StringVar() hint.set('') tk.Label(window, textvariable=hint).place(x=190, y=240) # 不停的刷新显示 window.mainloop()
其实这里面还有很多有待提升的,比如“目标格式”的输入框可以做成下拉式的,把可选的格式提前写进程序里,通过选择而不是键入的方式会更加的便捷;在提交执行阶段因为执行需要时间,在执行期间画面会卡死,直到执行完成才会回复;画面卡死的问题倒是可以用 os.popen(‘命令’)替代,用这个函数会把格式转换的执行移到后台,这样从画面上显示程序已经完成了,实际上还在运行,能力有待加强 /手动尴尬
这里只是简单的写了一下,希望能抛砖引玉。
tkinter教程参考 https://morvanzhou.github.io/tutorials/python-basic/tkinter/
python调用FFmpeg再进阶
这个就看你自己发挥了,such as做一个做成一个后端系统,部署在你的机器上(或者你的服务器上)通过web页面进行访问。如果你还有其他的工具程序也可以放在这个后台上,通过选择调用自己写的不同工具,这样就做到了一劳永逸的效果。后来我把它封装成.exe可执行文件,参见 使用pyinstaller将Python程序封装成可执行文件