博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用Python和FFmpeg查找大码率的视频文件
阅读量:5076 次
发布时间:2019-06-12

本文共 2878 字,大约阅读时间需要 9 分钟。

用Python和FFmpeg查找大码率的视频文件

本文使用Python2.7, 这个工作分两步

  1. 遍历目录下的视频文件
  2. 用ffprobe获取是视频文件的码率信息

用ffprobe 获取json格式的视频信息

用ffprobe.exe是FFmpeg自带的查看视频信息的工具。其获取json格式的信息命令例如以下

ffprobe -v quiet -print_format json -show_format -show_streams -i filename

这个命令会输出 带有 streams和format项的json结构

Python读取json

  1. 用os.popen(strCmd).read() 来获取命令行的输出
  2. 用json.loads 解析json, 这个必须加try。否则某些乱码会导致挂机
import os,re,json# ffprobe 需放置在 system32, not user's PATH# 调用ffprobo 获取信息的json格式def getJsonString(strFileName):    strCmd =  'ffprobe -v quiet -print_format json -show_format -show_streams -i "' +  strFileName  + '"'      mystring = os.popen(strCmd).read()    return  mystring# UnicodeDecodeError: 'utf8' codec can't decode byte 0xc0 in position 57: invalid start bytefilecontent = getJsonString(strFileName)try:    js = json.loads(filecontent)except Exception,e:       print Exception,":",e, strFileName     return

获取视频信息

有时候video项中没有bit_rate这一项,这时须要从format项中取

iVideoWidth = 0iVideoHeight = 0iVideoBitRate = 0iAllBitRate = 0strCodecName = ''for stream in arrStreams:    if(stream['codec_type'] == 'video'):        strCodecName = stream['codec_name']        iVideoWidth = int(stream['width'])        iVideoHeight = int(stream['height'])        # h264 可能没有这一项        if  'bit_rate'  in stream.keys() :            iVideoBitRate = int (stream['bit_rate'])        breakiAllBitRate = int(js['format']['bit_rate'])print  'CodecName (%s), width(%d), height(%d), video bit_rate(%d), all bit_rate (%d)' % (strCodecName, iVideoWidth, iVideoHeight, iVideoBitRate, iAllBitRate )

获取目录里的全部文件名

这个网上比較多,取了一个实现简单的递归版本号

g_fileList = []def getFiles(path):    if os.path.exists(path):           files = os.listdir(path)        for f in files :            subpath=os.path.join(path,f)            if os.path.isfile(subpath):                g_fileList.append(subpath)            else:                getFiles(subpath)

过滤视频文件

# 按扩展名过滤        def filterExname (fileList, arrExtnames):    filterList = []    for strFile in fileList:        strLowFileName = strFile.lower() # 转小写先        for strExtName in arrExtnames :                        if strLowFileName.endswith(strExtName) :                filterList.append(strFile)        return filterListg_fileList = []# 假设是网络路径,能够先映射到本地, python有可能不支持网络路径 \\getFiles('.')print 'g_fileList len = ', len(g_fileList)        arrExtName = ['.mkv', '.rmvb', '.rm', '.wmv', '.avi', '.mp4', '.mov', '.mpg', '.xvid', '.asf', '.mpeg', '.vob', '.3gp', '.flv', '.ts']arrVideoFiles = filterExname (g_fileList, arrExtName)

过滤大的码率文件

# 设置单位像素 比特率 阈值 2.5 - 4.0PIEXL_RATE_MAX = 3.9def isLargeBps(iWidth, iHeight, iBitrate):    # 基准 每像素字节数    fCurrentBitRatePixel = float(iBitrate) / (iWidth * iHeight)    print  'isNeedConvert input = ', iWidth, iHeight, iBitrate, fCurrentBitRatePixel    return (fCurrentBitRatePixel > PIEXL_RATE_MAX)

总结

大致就是这样,至于输出batch命令行,输出csv结果就不必细讲了。

转载于:https://www.cnblogs.com/blfshiye/p/5244893.html

你可能感兴趣的文章
不知道做什么时
查看>>
matlab 给某一列乘上一个系数
查看>>
密码学笔记——培根密码
查看>>
Screening technology proved cost effective deal
查看>>
MAC 上升级python为最新版本
查看>>
创业老板不能犯的十种错误
查看>>
Animations介绍及实例
查看>>
判断请求是否为ajax请求
查看>>
【POJ2699】The Maximum Number of Strong Kings(网络流)
查看>>
spring boot配置跨域
查看>>
BZOJ 1996 合唱队(DP)
查看>>
进击吧!阶乘——大数乘法
查看>>
安卓学习资料推荐-25
查看>>
Mysql数据库备份和还原常用的命令
查看>>
关于退出当前页面在火狐的一些问题
查看>>
【项目实施】项目考核标准
查看>>
spring-aop AnnotationAwareAspectJAutoProxyCreator类
查看>>
经典入门_排序
查看>>
Redis Cluster高可用集群在线迁移操作记录【转】
查看>>
二、spring中装配bean
查看>>