Python整合FFmpeg实现视频文件的批量转换
转换工具层出不穷,ffmpeg才是全能的转换工具,只是不支持图形操作。
没有关系,命令行方式,在freebsd/linux下直接来
我们的思路是,设定一个文件夹存放源视频文件,Python读取该文件夹下的全部文件,并对文件通过ffmpeg进行分析,根据需要,修改目标文件的编码、分辨率等等,调用ffmpeg转换。
我这次的需求是,我家液晶电视只支持分辨来,长宽均小于720,编码只支持divx/xvid的avi文件,且fps只能小于25——多次实践,才总结出来的,电视说明书也没说!!
下面的程序将
- /root//root2/video/origin
- # coding=gb2312
- import string
- import os
- import time
- import re
- import sys
- if len(sys.argv) < 2:
- print 'please input q'
- sys.exit()
- #遍历origin下的文件
- for root,dirs,files in os.walk('/root//root2/video/origin'):
- for name in files:
- name= name.replace('[','''''\[''')#对文件名中的[进行转义
- newname =name[0: name.rindex('.')]
- #运行一次ffmpeg,获取分辨率
- (si, so, se) = os.popen3('cd /root//root2/video;mkdir -p ffm; rm -f ffm/ffm.txt ; csh -c "(ffmpeg -i origin/' +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
- #如果带3个参数,最后两个就是最终高宽
- if len(sys.argv)>3:
- width=string.atof(sys.argv[2])
- height=string.atof(sys.argv[3])
- reg="^\s*Stream.*,\s*(\d+)x(\d+),"
- #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]
- #液晶电视高宽不能超过720
- if len(sys.argv)<=3:
- width=string.atof(c[0])
- height=string.atof(c[1])
- if width>720:
- height=height*720/width
- width=720
- if height>720:
- width=width*720/height
- height=720
- width=int(round(width))
- height=int(round(height))
- print 'new:',width,'x',height
- break
- #生成命令,mp3+xvid avi
- cmd ='csh -c "' + "cd /root//root2/video;touch ffm/output.log;(ffmpeg -y -i origin/"+name+" -acodec libmp3lame -ar 44100 -ab 64K -vcodec libxvid -qmin "+sys.argv[1]+" -qmax "+sys.argv[1]+" -r 25 -s "+str(width)+"x"+str(height)+" -aspect "+str(width)+":"+str(height)+" -threads 0 -f avi ./ok/xvid/"+newname+".avi" + ' >>& 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'#再显示一次命令
相关推荐
dingwun 2020-11-16
wangdaren 2020-08-15
wqiaofujiang 2020-07-05
PGzxc 2020-07-04
ShoppingChen 2020-06-25
cherayliu 2020-06-17
83096129 2020-06-08
83096129 2020-06-08
PGzxc 2020-06-01
ShoppingChen 2020-05-29
cherayliu 2020-05-11
ShoppingChen 2020-05-11
83096129 2020-05-10
PGzxc 2020-05-07
cherayliu 2020-04-27
cherayliu 2020-04-11