歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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'#再顯示一次命令   
Copyright © Linux教程網 All Rights Reserved