侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

python整合ffmpeg实现视频文件的批量转换

Python  /  管理员 发布于 7年前   192

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

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

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

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

下面的程序将

/root//root2/video/origin

下存在的全部文件转换成液晶电视需要的avi格式电影

以下是最新的修改,引入了OptionParser  参数分析工具。能指定最大宽度,音视频编码,视频质量,原路径,目的路径,工作路径等

# coding=gb2312import stringimport os import timeimport reimport sysfrom 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'#再显示一次命令

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


  • 上一条:
    python的set处理二维数组转一维数组的方法示例
    下一条:
    python自动发邮件总结及实例说明【推荐】
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客