python视频处理加速的库_Python调用ffmpeg开源视频处理库,批量处理视频
代码示例
# 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开源视频处理库,批量处理视频相关推荐
- python批量处理视频_Python调用ffmpeg开源视频处理库,批量处理视频
代码示例 # coding=utf-8 import os import subprocess import datetime import json, pprint import re, time ...
- 2023-02-21:请用go语言调用ffmpeg,解码mp4文件,输出视频信息和总帧数。
2023-02-21:请用go语言调用ffmpeg,解码mp4文件,输出视频信息和总帧数. 答案2023-02-21: 使用 github.com/moonfdd/ffmpeg-go 库,这个库比go ...
- java命令截图,GitHub - xuege-cn/fmj: FMJ (FFMpeg for Java)。通过Java调用FFMpeg命令的方式来对音视频进行处理(获取信息、截图等等)。...
项目介绍 FMJ (FFMpeg for Java) 通过Java调用FFMpeg命令的方式来对音视频进行处理(获取信息.截图等等). FFMpeg安装 建议使用 ffmpeg-2.6.1 版本 Li ...
- python什么模块动态调用链接库_Python调用C/C++动态链接库的方法详解
本文以实例讲解了Python调用C/C++ DLL动态链接库的方法,具体示例如下: 示例一: 首先,在创建一个DLL工程(本例创建环境为VS 2005),头文件: 1 2 3 4 5 6 7 8 9 ...
- python调用c++动态库_Python调用C/C++动态链接库的方法
本文以实例讲解了Python调用C/C++ DLL动态链接库的方法,具体示例如下: 示例一: 首先,在创建一个DLL工程(本例创建环境为VS 2005),头文件: //hello.h #ifdef E ...
- python 统计组合用什么库_Python数据科学,用这些库就够了
为了方便学习,本文列出的20个Python库将按领域进行分类,有些你可能并不熟悉,但是真的能提高你的模型算法实现效率,多一点尝试,多一些努力! ▌核心库和统计数据 1. NumPy (Commits: ...
- python ffmpeg模块mp4岀错_Python 调用 FFmpeg 提示 module 'ffmpeg' has no attribute 'input' 的解决方法-老唐笔记...
按照之前文章的方法安装 FFmpeg 之后(在 macOS 上安装 FFmpeg 并通过 Python 调用的方法),我们想通过 Python 进行调用,但是有些不细心的朋友可以装 Python 库的 ...
- python缺少标准库_Python 实现自动导入缺失的库
作者:豌豆花下猫 在写 Python 项目的时候,我们可能经常会遇到导入模块失败的错误:ImportError: No module named 'xxx'或者ModuleNotFoundError: ...
- Android 第三方库--2017年Android开源项目及库汇总
转自:http://blog.csdn.net/jsonnan/article/details/62215287 东西有点多,但是资源绝对nice,自己都全部亲身体验过了,大家可放心使用 github ...
最新文章
- 遇见你们,真好 ---致我的舍友
- easyui 去掉按钮 虚线框
- python中and与or的执行顺序-关联子查询的执行顺序是什么
- 1.3 List集合:ArrayList和LinkedList类的用法及区别
- 理解 Glance - 每天5分钟玩转 OpenStack(20)
- leetcode 135. 分发糖果
- jQuery1.3以上版本@的问题
- 计算机刷bios版本,主板刷bios的6种方法,电脑刷bios方法-
- 在取证过程中,常见的一些注册表键值整理
- 如何用计算机计算概率,计算器怎么算概率里面的A和C
- 验证离散数学中的关系的相关性质(自反性,对称性,反自反性,发对称性,传递性)通过关系矩阵的方法
- 一次泛微OA宕机事件的解决。
- mysql常用表名大全_MySQL常用系统表大全
- 2021辽宁省大学生程序设计大赛部分题解
- echarts地图的常见用法:基本使用、区域颜色分级、水波动画、区域轮播、给地图添加背景图片和图标、3d地图
- C# 7.0 SPANS
- 怎么有的帖子发不了啊
- Linux——Makefile文件
- 四川大学计算机学院赵怡,【喜讯】我校计算机学院学子在蓝桥杯大赛全国总决赛中再获佳绩...
- 【综述 寿命预测】基于机器学习的设备剩余寿命预测方法综述
热门文章
- 超过一定字数显示省略号的两种方式
- Citavi插件的安装和使用以及注意事项
- eshop4-tomcat 安装
- 附件、文件的加密解密方法
- 彻底防止Windows 7/8/8.1升级更新到Windows 10
- 雷电模拟器charles抓包失败处理
- 计算机相关专业硕士论文,计算机专业硕士论文优秀题目范例
- [转载]完整谈谈Omnifocus的行动清单、任务清单、截止日期的概念
- java update needed_为什么会显示 Java Update Needed(需要 Java Update)消息:Your Java version is out of date(...
- centos 7卸载java_centos下JDK的卸载与安装