用Python和FFmpeg查找大码率的视频文件
用Python和FFmpeg查找大码率的视频文件
本文使用Python2.7, 这个工作分两步
- 遍历目录下的视频文件
- 用ffprobe获取是视频文件的码率信息
用ffprobe 获取json格式的视频信息
用ffprobe.exe是FFmpeg自带的查看视频信息的工具。其获取json格式的信息命令例如以下
- ffprobe -v quiet -print_format json -show_format -show_streams -i filename
这个命令会输出 带有 streams和format项的json结构
Python读取json
- 用os.popen(strCmd).read() 来获取命令行的输出
- 用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查找大码率的视频文件的更多相关文章
- FFmpeg开发实战(六):使用 FFmpeg 将YUV数据编码为视频文件
本文中实现的一个小功能是把一个YUV原始视频数据(时间序列图像)经过h264编码为视频码流,然后在使用mp4封装格式封装. 编码&封装的流程图如下: 使用ffmpeg编码流程: 1.首先使用a ...
- 用find命令查找最近修改过的文件
Linux的终端上,没有windows的搜索那样好用的图形界面工具,但find命令确是很强大的. 比如按名字查找一个文件,可以用 find / -name targetfilename . 唉,如果只 ...
- Linux系统下查找最近修改过的文件
Linux的终端上,没有windows的搜索那样好用的图形界面工具,但find命令确是很强大的. 比如按名字查找一个文件,可以用 find / -name targetfilename . 唉,如果只 ...
- 算法图解学习笔记01:二分查找&大O表示法
二分查找 二分查找又称折半查找,其输入的必须是有序的元素列表.二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止:如果x<a[ ...
- 【原创】python倒排索引之查找包含某主题或单词的文件
什么是倒排索引? 倒排索引(英语:Inverted index),也常被称为反向索引.置入档案或反向档案,是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射.它是文 ...
- Linux如何查找大文件或目录总结
在Windows系统中,我们可以使用TreeSize工具查找一些大文件或文件夹,非常的方便高效,在Linux系统中,如何去搜索一些比较大的文件呢?下面我整理了一下在Linux系统中如何查找大文件或文件 ...
- 在linux/unix中查找大文件
在linux/unix中查找大文件,如查找大于100M文件的位置路径,查找等于10M文件的位置路径等等,下面就介绍几个实现快速查找的命令: 1. 查找指定目录下所有大于100M的文件,命令为 find ...
- CentOS下如何查找大文件
在Windows系统中,我们可以使用TreeSize工具查找一些大文件或文件夹,非常的方便高效,在Linux系统中,如何去搜索一些比较大的文件呢?下面我整理了一下在Linux系统中如何查找大文件或文件 ...
- centos磁盘爆满,查找大文件并清理
今天发现vps敲入crontab -e 居然提示 “Disk quota exceeded” 无法编辑.于是"df -h"查了查发现系统磁盘空间使用100%了.最后定位到是/var ...
随机推荐
- codeforces Vasya and Digital Root
/* * c.cpp * * Created on: 2013-10-7 * Author: wangzhu */ /** * 当时比赛时,想得复杂了,也想偏了, * 1).写出来之后,结果达到了预期 ...
- USB (Universal Serial Bus)
USB歷史簡介 USB規格演變 標準 USB 2.0 介面 實體層 訊號傳輸 傳輸速率 網路層 USB 通訊模型 Endpoints 傳輸型態 USB 資料連結 Transaction Frame P ...
- SLF4J user manual
http://www.slf4j.org/manual.html The Simple Logging Facade for Java (SLF4J) serves as a simple facad ...
- WinForm实现简单的拖拽功能(C#)
用到了ListBox和TreeView两个控件,ListBox作为数据源,通过拖拽其中的数据放置到TreeView上,自动添加一个树节点 ListBox控件的MouseDown用于获取要拖拽的值并调用 ...
- Oracle备忘录
习惯是一个数据库中有多个用户,但是一个用户对应一个系统 数据库管理员主要职责: 每个Oracle数据库应该至少有一个数据库管理员(dba),对于一个小的数据库,一个dba就够了,但是对于一个大的数据库 ...
- VJP1063 迎春舞会之集体舞(DP)
我是被这题彻底折腾惨了 .. DP很简单 不用说了 重点是必须按它那个图说来来划分三角形 而不是随便撇下一部分 随便划下一个三角形就可以 所以 要判断J是第奇数个点才可以 #include <i ...
- Wpf配置文件属性
public MainWindow() { InitializeComponent(); this.WindowState = Properties.Settings.Default.WindowSt ...
- cmd find命令
find 作用:从文件中收索字符串 格式:find 参数 "字符串" 路径\文件名 参数: /V 显示所有未包含指定字符串的行. /C 仅显示包含字符串的行数. /N 显示行号. ...
- ACM ICPC Asia Regional 2011 Kuala Lumpur C题
看了逆波兰表达式之后,发现真是强悍的数据结构,栈的应用怎么感觉一辈子也学不完了呢 后缀表达式即逆波兰表达式,就是将所有的运算符按照一定的等级全部都安排到数字的后面去,实现正确的运算法则. OK,代码要 ...
- 使用Spring MVC 的表单控制器SimpleFormController
以注册过程为例,我们可能会选择继承AbstractController来实现表单的显示,继承AbstractCommandController来实现表单的处理 ,这样是可行的,但必须要维护两个控制器 ...