用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 byte
filecontent = getJsonString(strFileName) try:
js = json.loads(filecontent)
except Exception,e:
print Exception,":",e, strFileName
return

获取视频信息

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

iVideoWidth = 0
iVideoHeight = 0
iVideoBitRate = 0
iAllBitRate = 0
strCodecName = '' 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']) break iAllBitRate = 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 filterList g_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.0
PIEXL_RATE_MAX = 3.9 def isLargeBps(iWidth, iHeight, iBitrate):
# 基准 每像素字节数 fCurrentBitRatePixel = float(iBitrate) / (iWidth * iHeight) print 'isNeedConvert input = ', iWidth, iHeight, iBitrate, fCurrentBitRatePixel
return (fCurrentBitRatePixel > PIEXL_RATE_MAX)

总结

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

用Python和FFmpeg查找大码率的视频文件的更多相关文章

  1. FFmpeg开发实战(六):使用 FFmpeg 将YUV数据编码为视频文件

    本文中实现的一个小功能是把一个YUV原始视频数据(时间序列图像)经过h264编码为视频码流,然后在使用mp4封装格式封装. 编码&封装的流程图如下: 使用ffmpeg编码流程: 1.首先使用a ...

  2. 用find命令查找最近修改过的文件

    Linux的终端上,没有windows的搜索那样好用的图形界面工具,但find命令确是很强大的. 比如按名字查找一个文件,可以用 find / -name targetfilename . 唉,如果只 ...

  3. Linux系统下查找最近修改过的文件

    Linux的终端上,没有windows的搜索那样好用的图形界面工具,但find命令确是很强大的. 比如按名字查找一个文件,可以用 find / -name targetfilename . 唉,如果只 ...

  4. 算法图解学习笔记01:二分查找&大O表示法

    二分查找 二分查找又称折半查找,其输入的必须是有序的元素列表.二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止:如果x<a[ ...

  5. 【原创】python倒排索引之查找包含某主题或单词的文件

    什么是倒排索引? 倒排索引(英语:Inverted index),也常被称为反向索引.置入档案或反向档案,是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射.它是文 ...

  6. Linux如何查找大文件或目录总结

    在Windows系统中,我们可以使用TreeSize工具查找一些大文件或文件夹,非常的方便高效,在Linux系统中,如何去搜索一些比较大的文件呢?下面我整理了一下在Linux系统中如何查找大文件或文件 ...

  7. 在linux/unix中查找大文件

    在linux/unix中查找大文件,如查找大于100M文件的位置路径,查找等于10M文件的位置路径等等,下面就介绍几个实现快速查找的命令: 1. 查找指定目录下所有大于100M的文件,命令为 find ...

  8. CentOS下如何查找大文件

    在Windows系统中,我们可以使用TreeSize工具查找一些大文件或文件夹,非常的方便高效,在Linux系统中,如何去搜索一些比较大的文件呢?下面我整理了一下在Linux系统中如何查找大文件或文件 ...

  9. centos磁盘爆满,查找大文件并清理

    今天发现vps敲入crontab -e 居然提示 “Disk quota exceeded” 无法编辑.于是"df -h"查了查发现系统磁盘空间使用100%了.最后定位到是/var ...

随机推荐

  1. 从 C++ 到 Qt(命令行编译)good

    从 C++ 到 Qt 转载自:http://hi.baidu.com/cyclone/blog/item/8f8f08fa52d22f8758ee9006.html Qt 是 C++ 的库,Qt在an ...

  2. java1.8的几大新特性(二)

    七.Date APIJava 8 在包java.time下包含了一组全新的时间日期API.新的日期API和开源的Joda-Time库差不多,但又不完全一样,下面的例子展示了这组新API里最重要的一些部 ...

  3. Form.KeyPreview 属性

    Form.KeyPreview 属性 今天再做KeyDown 和 KeyUp 事件时,就是忘了设置,窗体的KeyPreview 属性,所以KeyDown 和 KeyUp 事件没有反应(这里说明一下,本 ...

  4. mysql show variables系统变量详解

    mysql系统变量详解 mysqld服务器维护两种变量.全局变量影响服务器的全局操作.会话变量影响具体客户端连接相关操作. 服务器启动时,将所有全局变量初始化为默认值.可以在选项文件或命令行中指定的选 ...

  5. URAL1018. Binary Apple Tree

    链接 简单树形DP #include <iostream> #include<cstdio> #include<cstring> #include<algor ...

  6. [Hadoop源码解读](四)MapReduce篇之Counter相关类

    当我们定义一个Counter时,我们首先要定义一枚举类型: public static enum MY_COUNTER{ CORRUPTED_DATA_COUNTER, NORMAL_DATA_COU ...

  7. 结构体dtype_t

    /* SQL data type struct */ typedef struct dtype_struct dtype_t; struct dtype_struct{ unsigned mtype: ...

  8. Linux kernel ‘qeth_snmp_command’函数缓冲区溢出漏洞

    漏洞名称: Linux kernel ‘qeth_snmp_command’函数缓冲区溢出漏洞 CNNVD编号: CNNVD-201311-423 发布时间: 2013-11-29 更新时间: 201 ...

  9. 解决Mac下Sequel Pro 1.1 连接 Homebrew安装Mysql5.7.8的问题 Sequel Pro 1.1 encountered an unexpected error

    解决Mac下Sequel Pro 1.1 连接 Homebrew安装Mysql5.7.8的问题 Sequel Pro encountered an unexpected error Sequel Pr ...

  10. bzoj 2285 [Sdoi2011]保密(二分,spfa + 最大流)

    Description 现在,保密成为一个很重要也很困难的问题.如果没有做好,后果是严重的.比如,有个人没有自己去修电脑,又没有拆硬盘,后来的事大家都知道了. 当然,对保密最需求的当然是军方,其次才是 ...