亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

python整合ffmpeg實(shí)現(xiàn)視頻文件的批量轉(zhuǎn)換

系統(tǒng) 1747 0

轉(zhuǎn)換工具層出不窮,ffmpeg才是全能的轉(zhuǎn)換工具,只是不支持圖形操作。

沒有關(guān)系,命令行方式,在freebsd/linux下直接來

我們的思路是,設(shè)定一個文件夾存放源視頻文件,python讀取該文件夾下的全部文件,并對文件通過ffmpeg進(jìn)行分析,根據(jù)需要,修改目標(biāo)文件的編碼、分辨率等等,調(diào)用ffmpeg轉(zhuǎn)換。

我這次的需求是,我家液晶電視只支持分辨來,長寬均小于720,編碼只支持divx/xvid的avi文件,且fps只能小于25――多次實(shí)踐,才總結(jié)出來的,電視說明書也沒說!!

下面的程序?qū)?

            
/root//root2/video/origin
          

下存在的全部文件轉(zhuǎn)換成液晶電視需要的avi格式電影

以下是最新的修改,引入了OptionParser ?參數(shù)分析工具。能指定最大寬度,音視頻編碼,視頻質(zhì)量,原路徑,目的路徑,工作路徑等

            
# 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('[','''\[''')#對文件名中的[進(jìn)行轉(zhuǎn)義
 newname =name[0: name.rindex('.')] 
 
 #運(yùn)行一次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的,將其轉(zhuǎn)換為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
 
 #運(yùn)行
 (si, so, se) = os.popen3(cmd)
 for line in se.readlines() :#打印輸出
  print line
 for line in so.readlines() :#打印輸出
  print line
  
 #print cmd,'  finish'#再顯示一次命令
          

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 色姑娘桃花网 | 欧美高清亚洲欧美一区h | 奇米第四色在线观看 | 一级a俄罗斯毛片免费 | 亚洲人成自拍网站在线观看忄 | 一级欧美激情毛片 | 天天色天天操天天射 | 韩国三日本三级中文字幕 | 夜间福利视频 | 亚洲美女精品视频 | 97午夜理伦片在线影院 | 国产精品福利久久 | 国产精品亚洲玖玖玖在线靠爱 | 天天综合天天添夜夜添狠狠添 | 久久精品视频久久 | 欧美国产精品一区二区免费 | 99久久免费精品国产免费 | 日韩欧美在线观看视频一区二区 | 中文字幕一区二区三区免费视频 | 91精品国产综合久久久久 | 亚洲一区二区三区四区五区 | 99热成人精品热久久66 | 天天干天天操天天添 | 欧美e片成 人 在线播放乱妇 | 欧美韩国日本在线 | 免费看羞羞视频的网站 | 久草日韩| 色xxx| 中文字幕中韩乱码亚洲大片 | 久久免费视频2 | 91福利视频在线 | 色婷婷综合久久久 | 99热久久国产精品免费观看 | 久久久中文字幕 | 日日干日日草 | 九九热九九热 | 日韩第1页 | 夜夜操夜夜骑 | 一级特级女人18毛片免费视频 | 免费播放欧美毛片 | 好爽毛片一区二区三区四区 |