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 相关文章推荐
Python随机生成彩票号码的方法
Mar 05 Python
python使用Tkinter显示网络图片的方法
Apr 24 Python
Python实现简易Web爬虫详解
Jan 03 Python
python实现在pandas.DataFrame添加一行
Apr 04 Python
基于python实现简单日历
Jul 28 Python
Django中Aggregation聚合的基本使用方法
Jul 09 Python
python判断一个变量是否已经设置的方法
Aug 13 Python
Python unittest生成测试报告过程解析
Sep 08 Python
解决python 执行shell命令无法获取返回值的问题
Dec 05 Python
浅谈Selenium+Webdriver 常用的元素定位方式
Jan 13 Python
如何用 Python 子进程关闭 Excel 自动化中的弹窗
May 07 Python
python多次执行绘制条形图
Apr 20 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获取本周,上周,本月,上月,本季度日期的代码
2009/08/05 PHP
支付宝支付开发――当面付条码支付和扫码支付实例
2016/11/04 PHP
php提交表单时保留多个空格及换行的文本样式的方法
2017/06/20 PHP
PhpStorm+xdebug+postman调试技巧分享
2020/09/15 PHP
网页编辑器ckeditor和ckfinder配置步骤分享
2012/05/24 Javascript
jQuery getJSON()+.ashx 实现分页(改进版)
2013/03/28 Javascript
Jquery实现搜索框提示功能示例代码
2013/08/13 Javascript
JS比较2个日期间隔的示例代码
2014/04/15 Javascript
jQuery Ajax中的事件详细介绍
2015/04/16 Javascript
举例简介AngularJS的内部语言环境
2015/06/17 Javascript
jQuery实现有动画淡出效果的二级折叠菜单代码
2015/10/17 Javascript
JS中的==运算: [''] == false —&gt;true
2016/07/24 Javascript
利用Node.js编写跨平台的spawn语句详解
2017/02/12 Javascript
AngularJS  ng-repeat遍历输出的用法
2017/06/19 Javascript
vue综合组件间的通信详解
2017/11/06 Javascript
微信小程序实现滑动切换自定义页码的方法分析
2018/12/29 Javascript
Vue 打包的静态文件不能直接运行的原因及解决办法
2020/11/19 Vue.js
[01:15]PWL S2开团时刻第二期——他们杀 我就白给
2020/11/25 DOTA
Python实现115网盘自动下载的方法
2014/09/30 Python
Python爬取读者并制作成PDF
2015/03/10 Python
Django URL传递参数的方法总结
2016/08/28 Python
Python开发的实用计算器完整实例
2017/05/10 Python
Python实现的计算器功能示例
2018/04/26 Python
Python处理时间日期坐标轴过程详解
2019/06/25 Python
django admin后管定制-显示字段的实例
2020/03/11 Python
Python基于yaml文件配置logging日志过程解析
2020/06/23 Python
django表单中的按钮获取数据的实例分析
2020/07/31 Python
OpenCV灰度化之后图片为绿色的解决
2020/12/01 Python
利用CSS3伪元素实现逐渐发光的方格边框
2017/05/07 HTML / CSS
美国顶级防滑鞋:Shoes For Crews
2017/03/27 全球购物
英国女鞋购物网站:Moda in Pelle
2019/02/18 全球购物
COSETTE官网:奢华,每天
2020/03/22 全球购物
房产转让协议书(2014版)
2014/09/30 职场文书
圆明园观后感
2015/06/03 职场文书
2015年医院保卫科工作总结
2015/07/23 职场文书
Matlab求解数组中的最大值及它所在的具体位置
2021/04/16 Python