python整合ffmpeg实现视频文件的批量转换
作者:zeeeitch 时间:2023-06-07 03:03:12
转换工具层出不穷,ffmpeg才是全能的转换工具,只是不支持图形操作。
没有关系,命令行方式,在freebsd/linux下直接来
我们的思路是,设定一个文件夹存放源视频文件,python读取该文件夹下的全部文件,并对文件通过ffmpeg进行分析,根据需要,修改目标文件的编码、分辨率等等,调用ffmpeg转换。
我这次的需求是,我家液晶电视只支持分辨来,长宽均小于720,编码只支持divx/xvid的avi文件,且fps只能小于25——多次实践,才总结出来的,电视说明书也没说!!
下面的程序将
/root//root2/video/origin
下存在的全部文件转换成液晶电视需要的avi格式电影
以下是最新的修改,引入了OptionParser 参数分析工具。能指定最大宽度,音视频编码,视频质量,原路径,目的路径,工作路径等
# coding=gb2312
import string
import os
import time
import re
import sys
from optparse import OptionParser
parser = OptionParser()
#parser.add_option("-i", "--input", dest="input",action="store_true",help="input x y for each file by user")
parser.add_option("-q", "--quality", dest="q",action="store",help="input xvid q arg",default="24")
parser.add_option("-v", "--vcodec", dest="vcodec",action="store",help="input video codec",default="x264")
parser.add_option("-n", "--noaudio", dest="an",action="store_true",help="no audio")
parser.add_option("-p", "--preset", dest="preset",action="store",help="",default="")
parser.add_option("-m", "--maxWidth", dest="maxWidth",action="store",help="input max width for output video",default="")
parser.add_option("-f", "--fileType", dest="fileType",action="store",help="",default="mp4")
parser.add_option("-o", "--ogg", dest="ogg",action="store_true",help="user ogg instead of aac",default="")
parser.add_option("-3", "--mp3", dest="mp3",action="store_true",help="user mp3 instead of aac",default="")
parser.add_option("-1", "--pad", dest="pad",action="store_true",help="pad to 16:9",default="")
parser.add_option("-s", "--src", dest="srcD",action="store",help="source dir",default="/usr/disk2/root/video/origin")
parser.add_option("-t", "--target", dest="targetD",action="store",help="target dir",default="/usr/disk2/root/video/ok")
parser.add_option("-w", "--workdir", dest="workdir",action="store",help="work dir",default="/root/root2/video")
(options, args) = parser.parse_args()
if options.srcD==None or options.srcD[0:1]=='-':
print 'srcD Err, quit'
exit()
if options.targetD==None or options.targetD[0:1]=='-':
print 'targetD Err, quit'
exit()
if options.fileType==None or options.fileType[0:1]=='-':
print 'fileType Err, quit'
exit()
if options.workdir==None or options.workdir[0:1]=='-':
print 'workdir Err, quit'
exit()
#遍历origin下的文件
for root,dirs,files in os.walk(options.srcD):
for name in files:
name= name.replace('[','''\[''')#对文件名中的[进行转义
newname =name[0: name.rindex('.')]
#运行一次ffmpeg,获取分辨率
(si, so, se) = os.popen3('cd '+options.workdir+';mkdir -p ffm; rm -f ffm/ffm.txt ; csh -c "(ffmpeg -i '+options.srcD+'/' +name+ ' >& ffm/ffm.txt)"; grep Stream ffm/ffm.txt')
t=so.readlines()
ti=0
for line in se.readlines() :
print line
width=0
height=0
reg='''^\s*Stream.*,\s*(\d+)x(\d+)(?: \[SAR|,)'''
#Stream #0.0: Video: RV40 / 0x30345652, 1020x572, 23 fps, 23 tbr, 23 tbn, 23 tbc
for line in t:
result = re.compile(reg).findall(line)
for c in result:
print name+' '+c[0] + 'x' + c[1]
width=string.atoi(c[0])
height=string.atoi(c[1])
if name[0:3]=='M2U' and width==720 and height==576:#m2U开头的,宽度是720x576的,是4:3存储16:9的,将其转换为16:9
width=1024
if width==0:
print 'error parsing width and height'
exit()
vc=''
qstr=''
astr=''
vpre=''
s=''
if options.maxWidth!='':
if width>string.atoi(options.maxWidth):
height = height * string.atoi(options.maxWidth) / width
width = string.atoi(options.maxWidth)
padStr=''
if options.pad==True:
if height*16/9 - width>10:#宽度不够
padStr=' -vf "pad='+str(height*16/9)+':'+str(height)+':'+str((height*16/9 - width)/2)+':0:black"'
elif width - height*16/9 >10:#高度不够
padStr=' -vf "pad='+str(width)+':'+str(width*9/16)+':0:'+str((width - height*16/9)/2)+':black"'
s=' -s '+str(width)+'x'+str(height)+padStr
print 'adjust',s
if options.preset!='':
vpre=' -vpre '+options.preset
if options.an==True:
astr=' -an'
elif options.ogg==True:
astr=' -acodec libvorbis -ar 44100 -ab 64K'
elif options.mp3==True:
astr=' -acodec libmp3lame -ar 44100 -ab 64K'
else:
astr=' -acodec libfaac -ar 44100 -ab 64K'
if options.vcodec=='vp8':
vc='libvpx'
qstr=" -qmin "+options.q+" -qmax "+options.q
elif options.vcodec=='x264':
vc='libx264'
qstr=" -crf "+options.q
elif options.vcodec=='xvid':
vc='libxvid'
qstr=" -qmin "+options.q+" -qmax "+options.q
cmd ='csh -c "' + "cd "+options.workdir+";touch ffm/output.log;(ffmpeg -y -i "+options.srcD+"/"+name+astr+" -vcodec "+vc+vpre+qstr+s+" -r 25 -threads 8 "+options.targetD+"/"+newname+"."+options.fileType + ' >>& ffm/output.log)"'
print cmd
#运行
(si, so, se) = os.popen3(cmd)
for line in se.readlines() :#打印输出
print line
for line in so.readlines() :#打印输出
print line
#print cmd,' finish'#再显示一次命令
来源:https://blog.csdn.net/zeeeitch/article/details/6864030
标签:python,ffmpeg,视频文件
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Python requests模块cookie实例解析
2023-11-18 15:44:56
详解用webpack把我们的业务模块分开打包的方法
2024-04-27 15:18:07
![](https://img.aspxhome.com/file/2023/5/135515_0s.png)
Perl操作系统环境变量的脚本代码
2022-12-27 12:17:22
第一篇初识bootstrap
2024-04-28 09:41:01
window.showModalDialog使用手册
2024-04-18 09:48:28
使用虚拟机在VirtualBox+openEuler上安装部署openGauss数据库
2024-01-21 22:45:53
![](https://img.aspxhome.com/file/2023/4/103454_0s.png)
javascript+css图片切换效果
2007-08-04 20:00:00
详解Python常用的魔法方法
2022-01-22 05:44:03
![](https://img.aspxhome.com/file/2023/9/130769_0s.png)
图文详解Python中模块或py文件导入(超详细!)
2023-01-13 01:41:13
![](https://img.aspxhome.com/file/2023/5/90565_0s.png)
Python部署web开发程序的几种方法
2023-08-24 06:30:32
让Python脚本暂停执行的几种方法(小结)
2021-08-16 21:34:49
Python编程图形库之Pillow使用方法讲解
2022-04-07 06:10:57
![](https://img.aspxhome.com/file/2023/5/80425_0s.png)
XML编程实例: ASP+XML打造留言本
2008-10-25 16:35:00
js注入 黑客之路必备!
2024-04-17 10:23:44
ASP用JAVASCRIPT脚本实现分页的办法
2007-10-30 13:18:00
python GUI库图形界面开发之PyQt5布局控件QVBoxLayout详细使用方法与实例
2022-10-12 11:37:27
![](https://img.aspxhome.com/file/2023/5/86595_0s.png)
使用python将请求的requests headers参数格式化方法
2021-06-12 07:22:49
php实现的简单检验登陆类
2023-11-22 06:13:33
python 列表元素左右循环移动 的多种解决方案
2023-06-15 06:21:45
![](https://img.aspxhome.com/file/2023/9/59649_0s.jpg)
python GUI库图形界面开发之PyQt5多行文本框控件QTextEdit详细使用方法实例
2023-10-09 05:33:38
![](https://img.aspxhome.com/file/2023/6/117546_0s.png)