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

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

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

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

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

  1. 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。否则某些乱码会导致挂机
  1. import os,re,json
  2. # ffprobe 需放置在 system32, not user's PATH
  3. # 调用ffprobo 获取信息的json格式
  4. def getJsonString(strFileName):
  5. strCmd = 'ffprobe -v quiet -print_format json -show_format -show_streams -i "' + strFileName + '"'
  6. mystring = os.popen(strCmd).read()
  7. return mystring
  8.  
  9. # UnicodeDecodeError: 'utf8' codec can't decode byte 0xc0 in position 57: invalid start byte
  10. filecontent = getJsonString(strFileName)
  11.  
  12. try:
  13. js = json.loads(filecontent)
  14. except Exception,e:
  15. print Exception,":",e, strFileName
  16. return

获取视频信息

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

  1. iVideoWidth = 0
  2. iVideoHeight = 0
  3. iVideoBitRate = 0
  4. iAllBitRate = 0
  5. strCodecName = ''
  6.  
  7. for stream in arrStreams:
  8. if(stream['codec_type'] == 'video'):
  9.  
  10. strCodecName = stream['codec_name']
  11. iVideoWidth = int(stream['width'])
  12. iVideoHeight = int(stream['height'])
  13.  
  14. # h264 可能没有这一项
  15. if 'bit_rate' in stream.keys() :
  16. iVideoBitRate = int (stream['bit_rate'])
  17.  
  18. break
  19.  
  20. iAllBitRate = int(js['format']['bit_rate'])
  21.  
  22. print 'CodecName (%s), width(%d), height(%d), video bit_rate(%d), all bit_rate (%d)' % (strCodecName, iVideoWidth, iVideoHeight, iVideoBitRate, iAllBitRate )

获取目录里的全部文件名

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

  1. g_fileList = []
  2.  
  3. def getFiles(path):
  4. if os.path.exists(path):
  5. files = os.listdir(path)
  6. for f in files :
  7. subpath=os.path.join(path,f)
  8. if os.path.isfile(subpath):
  9. g_fileList.append(subpath)
  10. else:
  11. getFiles(subpath)

过滤视频文件

  1. # 按扩展名过滤
  2. def filterExname (fileList, arrExtnames):
  3. filterList = []
  4. for strFile in fileList:
  5. strLowFileName = strFile.lower() # 转小写先
  6.  
  7. for strExtName in arrExtnames :
  8. if strLowFileName.endswith(strExtName) :
  9. filterList.append(strFile)
  10.  
  11. return filterList
  12.  
  13. g_fileList = []
  14.  
  15. # 假设是网络路径,能够先映射到本地, python有可能不支持网络路径 \\
  16. getFiles('.')
  17.  
  18. print 'g_fileList len = ', len(g_fileList)
  19. arrExtName = ['.mkv', '.rmvb', '.rm', '.wmv', '.avi', '.mp4', '.mov', '.mpg', '.xvid', '.asf', '.mpeg', '.vob', '.3gp', '.flv', '.ts']
  20. arrVideoFiles = filterExname (g_fileList, arrExtName)

过滤大的码率文件

  1. # 设置单位像素 比特率 阈值 2.5 - 4.0
  2. PIEXL_RATE_MAX = 3.9
  3.  
  4. def isLargeBps(iWidth, iHeight, iBitrate):
  5. # 基准 每像素字节数
  6.  
  7. fCurrentBitRatePixel = float(iBitrate) / (iWidth * iHeight)
  8.  
  9. print 'isNeedConvert input = ', iWidth, iHeight, iBitrate, fCurrentBitRatePixel
  10. 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. JAVA bean与XML互转的利器---XStream

    最近在项目中遇到了JAVA bean 和XML互转的需求, 本来准备循规蹈矩使用dom4j忽然想起来之前曾接触过的XStream, 一番研究豁然开朗,利器啊利器, 下来就XStream的一些用法与大家 ...

  2. 【HDOJ】5564 Clarke and digits

    DP+快速矩阵幂.注意base矩阵的初始化,不难. /* 5564 */ #include <iostream> #include <string> #include < ...

  3. maven 简单实用教程

    1. Maven介绍 1.1. 简介 java编写的用于构建系统的自动化工具. 目前版本是2.0.9,注意maven2和maven1有很大区别,阅读第三方文档时需要区分版本. 1.2. Maven资源 ...

  4. c# post文字图片至服务器

    最近由于项目需要实现c#提交文字及数据至服务器,因此研究了一下c# php数据传送: 下面用一个示例来演示,c# post文字+图片 ,php端接收: post提交数据核心代码(post数据提交) ? ...

  5. C# winform 渐变效果

    在用到vs的兴奋过程中,想给程序做个启动画面,我采用了显示Aform,过一段时间,隐藏这个Aform,showdialog下一个Bform,closeAForm这个方法来做了,不知道大家有没有跟好的办 ...

  6. 嵌入式 hi3518c裸板uboot烧写、kernel烧写、fs烧写小结

    1.在uboot中我可以添加自己的命令,添加的方法是找到一个uboot的命令,然后模仿着去增加属于自己的命令代码以及实现函数就可以 2.记住在使用printf进行调试的时候,在遇到指针或者字符串的时候 ...

  7. 普通Java类获取spring 容器的bean的5种方法

    方法一:在初始化时保存ApplicationContext对象方法二:通过Spring提供的工具类获取ApplicationContext对象方法三:继承自抽象类ApplicationObjectSu ...

  8. [摘]selenium-ide命令

    关于,selenium 命令这一部分,为了便于像我一样的菜鸟理解,我采用通过例子讲命令的方式. 菜鸟Selenium 命令通常被称为selenese,有一系列运行测试案例所需的命令构成. ----// ...

  9. [TOP]疯狂的投资

    [TOP]疯狂的投资 这是罗辑思维一期<疯狂的投资>的节目笔记,这期主要是通过菲尔德铺设横跨大西洋的电缆的故事讲了创业者需要的特质和<二十一世纪资本论>的一个观念:随着自由市场 ...

  10. NOIP2002 字串变换

    题二 字串变换 (存盘名: NOIPG2) [问题描述]: 已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ -> B2$ 规则的含义为: ...