想用python做一个视频播放器,不知道python怎么调用ffmpeg。视频非线性编辑方面打算用moviepy实现
https://blog.csdn.net/qq_34140940/article/details/87934016
本文使用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
def getJsonString(strFileName):
strCmd = 'ffprobe -v quiet -print_format json -show_format -show_streams -i "' + strFileName + '"'
mystring = os.popen(strCmd).read()
return mystring
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 = []
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)
过滤大的码率文件
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结果就不必细讲了。