代码示例

# 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("

", "").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

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 "{}"

file "{}"

file "{}"" .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:vdio4.mp4")

pass

以上就是Python调用ffmpeg开源视频处理库,批量处理视频的详细内容,更多关于python 批量处理视频的资料请关注云海天教程其它相关文章!

原文链接:https://github.com/inlike/Python-FFmpeg-Video

python视频处理加速的库_Python调用ffmpeg开源视频处理库,批量处理视频相关推荐

  1. python批量处理视频_Python调用ffmpeg开源视频处理库,批量处理视频

    代码示例 # coding=utf-8 import os import subprocess import datetime import json, pprint import re, time ...

  2. 2023-02-21:请用go语言调用ffmpeg,解码mp4文件,输出视频信息和总帧数。

    2023-02-21:请用go语言调用ffmpeg,解码mp4文件,输出视频信息和总帧数. 答案2023-02-21: 使用 github.com/moonfdd/ffmpeg-go 库,这个库比go ...

  3. java命令截图,GitHub - xuege-cn/fmj: FMJ (FFMpeg for Java)。通过Java调用FFMpeg命令的方式来对音视频进行处理(获取信息、截图等等)。...

    项目介绍 FMJ (FFMpeg for Java) 通过Java调用FFMpeg命令的方式来对音视频进行处理(获取信息.截图等等). FFMpeg安装 建议使用 ffmpeg-2.6.1 版本 Li ...

  4. python什么模块动态调用链接库_Python调用C/C++动态链接库的方法详解

    本文以实例讲解了Python调用C/C++ DLL动态链接库的方法,具体示例如下: 示例一: 首先,在创建一个DLL工程(本例创建环境为VS 2005),头文件: 1 2 3 4 5 6 7 8 9 ...

  5. python调用c++动态库_Python调用C/C++动态链接库的方法

    本文以实例讲解了Python调用C/C++ DLL动态链接库的方法,具体示例如下: 示例一: 首先,在创建一个DLL工程(本例创建环境为VS 2005),头文件: //hello.h #ifdef E ...

  6. python 统计组合用什么库_Python数据科学,用这些库就够了

    为了方便学习,本文列出的20个Python库将按领域进行分类,有些你可能并不熟悉,但是真的能提高你的模型算法实现效率,多一点尝试,多一些努力! ▌核心库和统计数据 1. NumPy (Commits: ...

  7. python ffmpeg模块mp4岀错_Python 调用 FFmpeg 提示 module 'ffmpeg' has no attribute 'input' 的解决方法-老唐笔记...

    按照之前文章的方法安装 FFmpeg 之后(在 macOS 上安装 FFmpeg 并通过 Python 调用的方法),我们想通过 Python 进行调用,但是有些不细心的朋友可以装 Python 库的 ...

  8. python缺少标准库_Python 实现自动导入缺失的库

    作者:豌豆花下猫 在写 Python 项目的时候,我们可能经常会遇到导入模块失败的错误:ImportError: No module named 'xxx'或者ModuleNotFoundError: ...

  9. Android 第三方库--2017年Android开源项目及库汇总

    转自:http://blog.csdn.net/jsonnan/article/details/62215287 东西有点多,但是资源绝对nice,自己都全部亲身体验过了,大家可放心使用 github ...

最新文章

  1. 遇见你们,真好 ---致我的舍友
  2. easyui 去掉按钮 虚线框
  3. python中and与or的执行顺序-关联子查询的执行顺序是什么
  4. 1.3 List集合:ArrayList和LinkedList类的用法及区别
  5. 理解 Glance - 每天5分钟玩转 OpenStack(20)
  6. leetcode 135. 分发糖果
  7. jQuery1.3以上版本@的问题
  8. 计算机刷bios版本,主板刷bios的6种方法,电脑刷bios方法-
  9. 在取证过程中,常见的一些注册表键值整理
  10. 如何用计算机计算概率,计算器怎么算概率里面的A和C
  11. 验证离散数学中的关系的相关性质(自反性,对称性,反自反性,发对称性,传递性)通过关系矩阵的方法
  12. 一次泛微OA宕机事件的解决。
  13. mysql常用表名大全_MySQL常用系统表大全
  14. 2021辽宁省大学生程序设计大赛部分题解
  15. echarts地图的常见用法:基本使用、区域颜色分级、水波动画、区域轮播、给地图添加背景图片和图标、3d地图
  16. C# 7.0 SPANS
  17. 怎么有的帖子发不了啊
  18. Linux——Makefile文件
  19. 四川大学计算机学院赵怡,【喜讯】我校计算机学院学子在蓝桥杯大赛全国总决赛中再获佳绩...
  20. 【综述 寿命预测】基于机器学习的设备剩余寿命预测方法综述

热门文章

  1. 超过一定字数显示省略号的两种方式
  2. Citavi插件的安装和使用以及注意事项
  3. eshop4-tomcat 安装
  4. 附件、文件的加密解密方法
  5. 彻底防止Windows 7/8/8.1升级更新到Windows 10
  6. 雷电模拟器charles抓包失败处理
  7. 计算机相关专业硕士论文,计算机专业硕士论文优秀题目范例
  8. [转载]完整谈谈Omnifocus的行动清单、任务清单、截止日期的概念
  9. java update needed_为什么会显示 Java Update Needed(需要 Java Update)消息:Your Java version is out of date(...
  10. centos 7卸载java_centos下JDK的卸载与安装