Python调用ffmpeg开源视频处理库,批量处理视频


Posted in Python onNovember 16, 2020

代码示例

# coding=utf-8
import os
import subprocess
import datetime
import json, pprint
import re, time
import threading
import random
import shutil


class FFmpeg:

  def __init__(self, editvdo, addlogo=None, addmusic=None,
         addvdohead=None, addvdotail=None):
    self.editvdo = editvdo
    self.addlogo = addlogo
    self.addmusic = addmusic
    self.addvdohead = addvdohead
    self.addvdotail = addvdotail
    self.vdo_time, self.vdo_width, self.vdo_height, self.attr_dict = self.get_attr()
    self.editvdo_path = os.path.dirname(editvdo)
    self.editvdo_name = os.path.basename(editvdo)

  def get_attr(self):
    """
    获取视频属性参数
    :return:
    """
    strcmd = r'ffprobe -print_format json -show_streams -i "{}"'.format(self.editvdo)
    status, output = subprocess.getstatusoutput(strcmd)
    agrs = eval(re.search('{.*}', output, re.S).group().replace("\n", "").replace(" ", ''))
    streams = agrs.get('streams', [])
    agrs_dict = dict()
    [agrs_dict.update(x) for x in streams]
    vdo_time = agrs_dict.get('duration')
    vdo_width = agrs_dict.get('width')
    vdo_height = agrs_dict.get('height')
    attr = (vdo_time, vdo_width, vdo_height, agrs_dict)
    return attr

  def edit_head(self, start_time, end_time, deposit=None):
    """
    截取指定长度视频
    :param second: 去除开始的多少秒
    :param deposit: 另存为文件
    :return: True/Flase
    """
    if None == deposit:
      deposit = self.editvdo_path+'/'+'edit_head'+self.editvdo_name
    start = time.strftime('%H:%M:%S', time.gmtime(start_time))
    end = time.strftime('%H:%M:%S', time.gmtime(end_time))
    strcmd = 'ffmpeg -i "{}" -vcodec copy -acodec copy -ss {} -to {} "{}" -y'.format(
      self.editvdo, start, end, deposit)
    result = subprocess.run(args=strcmd, stdout=subprocess.PIPE, shell=True)
    if os.path.exists(deposit):
      os.remove(self.editvdo)
      os.rename(deposit, self.editvdo)
      return True
    else:
      return False

  def edit_logo(self, deposit=None):
    """
    添加水印
    :param deposit:添加水印后另存为路径,为空则覆盖
    :return: True/False
    """
    if None == deposit:
      deposit = self.editvdo_path+'/'+'edit_logo'+self.editvdo_name
    strcmd = r'ffmpeg -i "{}" -vf "movie=\'{}\' [watermark];[in] ' \
         r'[watermark] overlay=main_w-overlay_w-10:10 [out]" "{}"'.format(
          self.editvdo, self.addlogo, deposit)
    result = subprocess.run(args=strcmd, stdout=subprocess.PIPE, shell=True)
    if os.path.exists(deposit):
      os.remove(self.editvdo)
      os.rename(deposit, self.editvdo)
      return True
    else:
      return False

  def edit_music(self, deposit=None):
    if None == deposit:
      deposit = self.editvdo_path+'/'+'edit_music'+self.editvdo_name
    strcmd = r'ffmpeg -y -i "{}" -i "{}" -filter_complex "[0:a] ' \
         r'pan=stereo|c0=1*c0|c1=1*c1 [a1], [1:a] ' \
         r'pan=stereo|c0=1*c0|c1=1*c1 [a2],[a1][a2]amix=duration=first,' \
         r'pan=stereo|c0<c0+c1|c1<c2+c3,pan=mono|c0=c0+c1[a]" ' \
         r'-map "[a]" -map 0:v -c:v libx264 -c:a aac ' \
         r'-strict -2 -ac 2 "{}"'.format(self.editvdo, self.addmusic, deposit)
    result = subprocess.run(args=strcmd, stdout=subprocess.PIPE, shell=True)
    if os.path.exists(deposit):
      os.remove(self.editvdo)
      os.rename(deposit, self.editvdo)
      return True
    else:
      return False

  def edit_rate(self, rete=30, deposit=None):
    """
    改变帧率
    :param rete: 修改大小帧率
    :param deposit: 修改后保存路径
    :return:
    """
    if None == deposit:
      deposit = self.editvdo_path+'/'+'edit_music'+self.editvdo_name
    strcmd = r'ffmpeg -i "{}" -r {} "{}"' % (self.editvdo, rete, deposit)
    result = subprocess.run(args=strcmd, stdout=subprocess.PIPE, shell=True)
    if os.path.exists(deposit):
      os.remove(self.editvdo)
      os.rename(deposit, self.editvdo)
      return True
    else:
      return False

  def edit_power(self, power='1280x720', deposit=None):
    """
    修改分辨率
    :param power: 分辨率
    :param deposit: 修改后保存路径,为空则覆盖
    :return:
    """
    if None == deposit:
      deposit = self.editvdo_path+'/'+'edit_power'+self.editvdo_name
    strcmd = r'ffmpeg -i "{}" -s {} "{}"'.format(self.editvdo, power, deposit)
    result = subprocess.run(args=strcmd, stdout=subprocess.PIPE, shell=True)
    if os.path.exists(deposit):
      os.remove(self.editvdo)
      os.rename(deposit, self.editvdo)
      return True
    else:
      return False

  def rdit_marge(self, vdo_head, vdo_tail, deposit=None):
    if None == deposit:
      deposit = self.editvdo_path+'/'+'rdit_marge'+self.editvdo_name
    with open(self.editvdo_path+'/'+'rdit_marge.txt', 'w', encoding='utf-8') as f:
      f.write("file '{}' \nfile '{}' \nfile '{}'" .format(
        vdo_head, self.editvdo, vdo_tail))
    strcmd = r'ffmpeg -f concat -safe 0 -i "{}" -c copy "{}"'.format(
      self.editvdo_path + '/' + 'rdit_marge.txt', deposit)
    result = subprocess.run(args=strcmd, stdout=subprocess.PIPE, shell=True)
    if os.path.exists(deposit):
      os.remove(self.editvdo)
      os.rename(deposit, self.editvdo)
      return True
    else:
      return False



  # ffmpeg - i input.mkv - filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" - map"[v]" - map"[a]" output.mkv



test = FFmpeg(r"D:\vdio\4.mp4")
pass

以上就是Python调用ffmpeg开源视频处理库,批量处理视频的详细内容,更多关于python 批量处理视频的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python3基础之list列表实例解析
Aug 13 Python
python网络编程之文件下载实例分析
May 20 Python
Python3使用正则表达式爬取内涵段子示例
Apr 22 Python
python验证码识别教程之利用滴水算法分割图片
Jun 05 Python
如何优雅地改进Django中的模板碎片缓存详解
Jul 04 Python
python bmp转换为jpg 并删除原图的方法
Oct 25 Python
python判断列表的连续数字范围并分块的方法
Nov 16 Python
python pygame实现挡板弹球游戏
Nov 25 Python
pytorch 改变tensor尺寸的实现
Jan 03 Python
在tensorflow中实现屏蔽输出的log信息
Feb 04 Python
浅析python中的del用法
Sep 02 Python
浅谈matplotlib默认字体设置探索
Feb 03 Python
python tkinter实现连连看游戏
Nov 16 #Python
详解python os.path.exists判断文件或文件夹是否存在
Nov 16 #Python
Python 删除List元素的三种方法remove、pop、del
Nov 16 #Python
python 从list中随机取值的方法
Nov 16 #Python
python实现在列表中查找某个元素的下标示例
Nov 16 #Python
python如何获得list或numpy数组中最大元素对应的索引
Nov 16 #Python
Python实现列表索引批量删除的5种方法
Nov 16 #Python
You might like
php预定义常量
2006/12/25 PHP
Discuz! Passport 通行证整合
2008/03/27 PHP
PHP实现读取一个1G的文件大小
2013/08/24 PHP
PHP脚本监控Nginx 502错误并自动重启php-fpm
2015/05/13 PHP
纯JS实现的批量图片预览加载功能
2011/08/14 Javascript
jQuery之选项卡的简单实现
2014/02/28 Javascript
JavaScript删除数组元素的方法
2015/03/20 Javascript
JavaScript中setter和getter方法介绍
2016/07/11 Javascript
微信js-sdk分享功能接口常用逻辑封装示例
2016/10/13 Javascript
node.js与C语言 实现遍历文件夹下最大的文件,并输出路径,大小
2017/01/20 Javascript
JS实现复选框的全选和批量删除功能
2017/04/05 Javascript
基于Axios 常用的请求方法别名(详解)
2018/03/13 Javascript
简单两步使用node发送qq邮件的方法
2019/03/01 Javascript
Vue.js构建你的第一个包并在NPM上发布的方法步骤
2019/05/01 Javascript
js图片无缝滚动插件使用详解
2020/05/26 Javascript
JAVA面试题 static关键字详解
2019/07/16 Javascript
解决vant框架做H5时踩过的坑(下拉刷新、上拉加载等)
2020/11/11 Javascript
Python中的模块和包概念介绍
2015/04/13 Python
Python版微信红包分配算法
2015/05/04 Python
Python使用迭代器打印螺旋矩阵的思路及代码示例
2016/07/02 Python
pandas系列之DataFrame 行列数据筛选实例
2018/04/12 Python
详谈python中冒号与逗号的区别
2018/04/18 Python
用Python写脚本,实现完全备份和增量备份的示例
2018/04/29 Python
美国时装品牌:Nautica(诺帝卡)
2016/08/28 全球购物
大学校庆邀请函
2014/01/11 职场文书
导游实习生自荐书
2014/01/28 职场文书
什么样的创业计划书可行性高?
2014/02/01 职场文书
2014学年自我鉴定
2014/02/23 职场文书
医学院毕业生自荐信范文
2014/03/06 职场文书
勤俭节约倡议书
2014/04/14 职场文书
技术负责人任命书
2014/06/05 职场文书
社区护士演讲稿
2014/08/27 职场文书
2015年计生协会工作总结
2015/04/24 职场文书
大学生敬老院活动总结
2015/05/07 职场文书
社区扶贫帮困工作总结
2015/05/20 职场文书
傲慢与偏见电影观后感
2015/06/10 职场文书