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中__name__的使用实例
Apr 14 Python
Python scikit-learn 做线性回归的示例代码
Nov 01 Python
python使用pil进行图像处理(等比例压缩、裁剪)实例代码
Dec 11 Python
python pandas读取csv后,获取列标签的方法
Nov 12 Python
详解Python静态网页爬取获取高清壁纸
Apr 23 Python
Python 2/3下处理cjk编码的zip文件的方法
Apr 26 Python
Django用户认证系统 Web请求中的认证解析
Aug 02 Python
python 有效的括号的实现代码示例
Nov 11 Python
Python Sphinx使用实例及问题解决
Jan 17 Python
python获取依赖包和安装依赖包教程
Feb 13 Python
Python Pivot table透视表使用方法解析
Sep 11 Python
Python list和str互转的实现示例
Nov 16 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
动态网站web开发 PHP、ASP还是ASP.NET
2006/10/09 PHP
PHP Mysql编程之高级技巧
2008/08/27 PHP
php session 预定义数组
2009/03/16 PHP
Laravel框架模板加载,分配变量及简单路由功能示例
2018/06/11 PHP
Js event事件在IE、FF兼容性问题
2011/01/01 Javascript
JavaScript 原型继承之构造函数继承
2011/08/26 Javascript
showModalDialog在谷歌浏览器下会返回Null的解决方法
2013/11/27 Javascript
cocos2dx骨骼动画Armature源码剖析(三)
2015/09/08 Javascript
基于JS实现密码框(password)中显示文字提示功能代码
2016/05/27 Javascript
jQuery+Ajax+PHP弹出层异步登录效果(附源码下载)
2016/05/27 Javascript
Bootstrap学习笔记之css组件(3)
2016/06/07 Javascript
vue-cli如何快速构建vue项目
2017/04/26 Javascript
nodejs前端自动化构建环境的搭建
2017/07/26 NodeJs
jQuery实现html双向绑定功能示例
2017/10/09 jQuery
基于vue-cli创建的项目的目录结构及说明介绍
2017/11/23 Javascript
bootstrap模态框关闭后清除模态框的数据方法
2018/08/10 Javascript
vue mounted 调用两次的完美解决办法
2018/10/29 Javascript
vue.js中使用echarts实现数据动态刷新功能
2019/04/16 Javascript
[01:03]PWL开团时刻DAY6——别打我
2020/11/05 DOTA
跟老齐学Python之使用Python查询更新数据库
2014/11/25 Python
Python实现调度算法代码详解
2017/12/01 Python
Python 创建空的list,以及append用法讲解
2018/05/04 Python
Python检测网络延迟的代码
2018/05/15 Python
Python3.5多进程原理与用法实例分析
2019/04/05 Python
Python3.5 + sklearn利用SVM自动识别字母验证码方法示例
2019/05/10 Python
Keras Convolution1D与Convolution2D区别说明
2020/05/22 Python
套娃式文件夹如何通过Python批量处理
2020/08/23 Python
video下autoplay属性无效的解决方法(添加muted属性)
2020/05/19 HTML / CSS
移动端HTML5开发神器之vconsole详解
2020/12/15 HTML / CSS
贝嫂喜欢的婴儿品牌,个性化的婴儿礼物:My 1st Years
2017/11/19 全球购物
MAC彩妆澳洲官网:M·A·C AU
2021/01/17 全球购物
计算机求职信
2013/12/01 职场文书
公安领导班子四风问题个人整改措施思想汇报
2014/10/09 职场文书
python之django路由和视图案例教程
2021/07/26 Python
python turtle绘图
2022/05/04 Python
利用Redis实现点赞功能的示例代码
2022/06/28 Redis