Python整合FFmpeg实现视频文件的批量转换


转换工具层出不穷,ffmpeg才是全能的转换工具,只是不支持图形操作。

没有关系,命令行方式,在freebsd/linux下直接来

我们的思路是,设定一个文件夹存放源视频文件,python读取该文件夹下的全部文件,并对文件通过ffmpeg进行分析,根据需要,修改目标文件的编码、分辨率等等,调用ffmpeg转换。

我这次的需求是,我家液晶电视只支持分辨来,长宽均小于720,编码只支持divx/xvid的avi文件,且fps只能小于25——多次实践,才总结出来的,电视说明书也没说!!

下面的程序将

  1. /root//root2/video/origin  
下存在的全部文件转换成液晶电视需要的avi格式电影
  1. # coding=gb2312  
 
  1. import string  
  2. import os   
  3. import time  
  4. import re  
  5. import sys  
  6.   
  7. if len(sys.argv) < 2:   
  8.     print 'please input q'  
  9.     sys.exit()   
  10. #遍历origin下的文件   
  11. for root,dirs,files in os.walk('/root//root2/video/origin'):   
  12.     for name in files:  
  13.         name= name.replace('[','''''\[''')#对文件名中的[进行转义   
  14.         newname =name[0: name.rindex('.')]        
  15.           
  16.         #运行一次ffmpeg,获取分辨率   
  17.         (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')   
  18.         t=so.readlines()   
  19.         ti=0  
  20.         for line in se.readlines() :  
  21.             print line  
  22.               
  23.         width=0  
  24.         height=0  
  25.           
  26.         #如果带3个参数,最后两个就是最终高宽   
  27.         if len(sys.argv)>3:  
  28.             width=string.atof(sys.argv[2])  
  29.             height=string.atof(sys.argv[3])  
  30.   
  31.         reg="^\s*Stream.*,\s*(\d+)x(\d+),"  
  32.  #Stream #0.0: Video: RV40 / 0x30345652, 1020x572, 23 fps, 23 tbr, 23 tbn, 23 tbc   
  33.         for line in t:  
  34.             result = re.compile(reg).findall(line)  
  35.   
  36.             for c in result:  
  37.                 print name+' '+c[0] + 'x' + c[1]  
  38.                 #液晶电视高宽不能超过720   
  39.                 if len(sys.argv)<=3:  
  40.                     width=string.atof(c[0])  
  41.                     height=string.atof(c[1])  
  42.                     if width>720:  
  43.                         height=height*720/width  
  44.                         width=720  
  45.                     if height>720:  
  46.                         width=width*720/height  
  47.                         height=720  
  48.                 width=int(round(width))  
  49.                 height=int(round(height))  
  50.                 print 'new:',width,'x',height  
  51.                 break  
  52.           
  53.         #生成命令,mp3+xvid  avi   
  54.         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)"'  
  55.         print cmd  
  56.           
  57.         #运行   
  58.         (si, so, se) = os.popen3(cmd)  
  59.         for line in se.readlines() :#打印输出   
  60.             print line  
  61.         for line in so.readlines() :#打印输出   
  62.             print line  
  63.               
  64.         print cmd,'   finish'#再显示一次命令   

相关内容