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

用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结果就不必细讲了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中使用FFmpeg进行多进程分割视频文件可以通过以下步骤实现: 1. 首先,你需要安装FFmpeg并确保它已经添加到系统的环境变量中。你可以从FFmpeg的官方网站(https://ffmpeg.org/)下载并安装它。 2. 在Python中,你可以使用`subprocess`模块来执行FFmpeg命令。首先,导入`subprocess`模块: ```python import subprocess ``` 3. 接下来,你可以使用`subprocess.Popen`函数来启动一个新的进程并执行FFmpeg命令。例如,你可以使用以下代码来分割视频文件: ```python def split_video(input_file, output_file, start_time, duration): command = ['ffmpeg', '-i', input_file, '-ss', start_time, '-t', duration, '-c', 'copy', output_file] process = subprocess.Popen(command) process.wait() ``` 在上面的代码中,`input_file`是输入视频文件的路径,`output_file`是输出视频文件的路径,`start_time`是分割开始的时间(以秒为单位),`duration`是分割的持续时间(以秒为单位)。 4. 如果你想要同时分割多个视频文件,你可以使用Python的多进程库(如`multiprocessing`)来实现并行处理。以下是一个示例代码: ```python import multiprocessing def split_video(input_file, output_file, start_time, duration): # 分割视频的代码 if __name__ == '__main__': input_files = ['video1.mp4', 'video2.mp4', 'video3.mp4'] output_files = ['output1.mp4', 'output2.mp4', 'output3.mp4'] start_times = [10, 20, 30] durations = [5, 10, 15] processes = [] for i in range(len(input_files)): process = multiprocessing.Process(target=split_video, args=(input_files[i], output_files[i], start_times[i], durations[i])) processes.append(process) process.start() for process in processes: process.join() ``` 在上面的代码中,`input_files`是输入视频文件的路径列表,`output_files`是输出视频文件的路径列表,`start_times`是分割开始的时间列表,`durations`是分割的持续时间列表。通过循环创建多个进程来同时处理多个视频文件的分割操作。 这样,你就可以使用FFmpegPython的多进程库来实现多进程分割视频文件了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值