zoukankan      html  css  js  c++  java
  • python使用moviepy模块对视频进行操作

    一、功能简介

    前段时间需要对多个视频进行合并,还需要对一个视频按需求进行截切成多个视频,然而网上虽然有现成的工具。

    但是大部分工具都带有第三方logo,这会影响视频的使用,而作者正好在学习python,为什么不自己搞一个类似

    的简易版的工具呢?因此一个简单的视频合并/视频截切的工具就此诞生了。

    二、视频合并

     1 import imageio
     2 imageio.plugins.ffmpeg.download()
     3 import sys,os
     4 from PyQt5.QtCore import *
     5 from PyQt5.QtWidgets import (QWidget, QPushButton, QLineEdit,QLabel,
     6                              QInputDialog, QApplication,QFileDialog)
     7 from moviepy.video.io.VideoFileClip  import VideoFileClip
     8 from moviepy.video.compositing.concatenate import concatenate_videoclips
     9 from natsort import natsorted
    10 
    11 class Example(QWidget):
    12     def __init__(self):
    13         super().__init__()
    14 
    15         self.initUI()
    16 
    17     def initUI(self):
    18         # 源文件选择按钮和选择编辑框
    19         self.source_btn = QPushButton('source', self)
    20         self.source_btn.move(30, 30)
    21         self.source_btn.resize(60,30)
    22         self.source_btn.clicked.connect(self.select_source)
    23         self.source_le = QLineEdit(self)
    24         self.source_le.move(120, 30)
    25         self.source_le.resize(250,30)
    26 
    27         # 存储文件选择按钮和选择编辑框
    28         self.target_btn = QPushButton('target', self)
    29         self.target_btn.move(30, 90)
    30         self.target_btn.resize(60, 30)
    31         self.target_btn.clicked.connect(self.select_target)
    32         self.target_le = QLineEdit(self)
    33         self.target_le.move(120, 90)
    34         self.target_le.resize(250, 30)
    35 
    36         # 保存按钮,调取数据增加函数等
    37         self.save_btn = QPushButton('save',self)
    38         self.save_btn.move(30, 150)
    39         self.save_btn.resize(150, 30)
    40         self.save_btn.clicked.connect(self.addNum)
    41 
    42         # 退出按钮,点击按钮退出整个程序
    43         self.cancle_btn = QPushButton('cancle',self)
    44         self.cancle_btn.move(220, 150)
    45         self.cancle_btn.resize(150, 30)
    46         self.cancle_btn.clicked.connect(QCoreApplication.quit)
    47 
    48         # 执行成功返回值显示位置设置
    49         self.result_le = QLabel(self)
    50         self.result_le.move(30, 210)
    51         self.result_le.resize(340, 30)
    52 
    53         # 技术支持框
    54         self.sourceLabel = QLabel(self)
    55         self.sourceLabel.move(30, 360)
    56         self.sourceLabel.resize(340, 30)
    57         self.sourceLabel.setText("Technical support:Azrael ")
    58         self.sourceLabel.setStyleSheet("color:blue;font-size:18px")
    59         self.sourceLabel.setAlignment(Qt.AlignCenter)
    60 
    61         # 整体界面设置
    62         self.setGeometry(400, 400, 400, 400)
    63         self.setWindowTitle('video binding')
    64         self.show()
    65 
    66     # 打开的视频文件路径
    67     def select_source(self):
    68         source = QFileDialog.getExistingDirectory(self, "select the video directory", "C:/")
    69         self.source_le.setText(str(source))
    70 
    71     # 保存的视频文件名称,要写上后缀名
    72     def select_target(self):
    73         target,fileType = QFileDialog.getSaveFileName(self, "select the save directory", "C:/")
    74         self.target_le.setText(str(target))
    75 
    76     def addNum(self):
    77         source = self.source_le.text().strip()#获取源视频文件存储地址
    78         target = self.target_le.text().strip()#获取合成视频保存地址
    79         video_list = []#定义加载后的视频存储列表
    80         for root, dirs, files in os.walk(source):
    81             files = natsorted(files)#按1,2,10类似规则对视频文件进行排序
    82             for file in files:
    83                 if os.path.splitext(file)[1] == ".mp4":#判断视频文件格式是否为.mp4
    84                     file_path = os.path.join(source, file)#粘合完整视频路径
    85                     video = VideoFileClip(file_path)#加载视频
    86                     video_list.append(video)#将加载完后的视频加入列表
    87         final_clip = concatenate_videoclips(video_list)#进行视频合并
    88         final_clip.to_videofile(target, fps=24, remove_temp=True)#将合并后的视频输出
    89         self.result_le.setText("ok!")#输出文件后界面返回OK
    90         self.result_le.setStyleSheet("color:red;font-size:40px")#设置OK颜色为红色,大小为四十像素
    91         self.result_le.setAlignment(Qt.AlignCenter)#OK在指定框内居中
    92 
    93 
    94 if __name__ == '__main__':
    95     app = QApplication(sys.argv)
    96     ex = Example()
    97     sys.exit(app.exec_())
    视频合并

    三、视频剪切

      1 #Author:Azrael
      2 import imageio
      3 imageio.plugins.ffmpeg.download()
      4 import win_unicode_console
      5 win_unicode_console.enable()
      6 import sys,os
      7 from PyQt5.QtCore import *
      8 from PyQt5.QtWidgets import (QWidget, QPushButton, QLineEdit,QLabel,
      9                               QApplication,QFileDialog)
     10 from moviepy.video.io.VideoFileClip  import VideoFileClip
     11 
     12 
     13 class login(QWidget):
     14     def __init__(self):
     15         super(login,self).__init__()
     16         self.initUI()
     17 
     18     def initUI(self):
     19         #源文件选择按钮和选择编辑框
     20         self.source_btn = QPushButton('source', self)
     21         self.source_btn.move(30, 30)
     22         self.source_btn.resize(60,30)
     23         self.source_btn.clicked.connect(self.select_source)
     24         self.source_le = QLineEdit(self)
     25         self.source_le.move(120, 30)
     26         self.source_le.resize(250,30)
     27 
     28         # 存储文件选择按钮和选择编辑框
     29         self.target_btn = QPushButton('target', self)
     30         self.target_btn.move(30, 90)
     31         self.target_btn.resize(60, 30)
     32         self.target_btn.clicked.connect(self.select_target)
     33         self.target_le = QLineEdit(self)
     34         self.target_le.move(120, 90)
     35         self.target_le.resize(250, 30)
     36 
     37         #截切开始时间输入框和提示
     38         self.startLabel = QLabel(self)
     39         self.startLabel.move(30, 150)
     40         self.startLabel.resize(60,30)
     41         self.startLabel.setText("stat_time")
     42         self.start_le = QLineEdit(self)
     43         self.start_le.move(120,150)
     44         self.start_le.resize(50,30)
     45 
     46         # 截切结束时间输入框和提示
     47         self.stopLabel = QLabel(self)
     48         self.stopLabel.move(230, 150)
     49         self.stopLabel.resize(60,30)
     50         self.stopLabel.setText("stop_time")
     51         self.stop_le = QLineEdit(self)
     52         self.stop_le.move(320,150)
     53         self.stop_le.resize(50,30)
     54 
     55         #保存按钮,调取数据增加函数等
     56         self.save_btn = QPushButton('save',self)
     57         self.save_btn.move(30, 210)
     58         self.save_btn.resize(140, 30)
     59         self.save_btn.clicked.connect(self.addNum)
     60 
     61         #退出按钮,点击按钮退出整个程序
     62         self.cancle_btn = QPushButton('cancle',self)
     63         self.cancle_btn.move(230, 210)
     64         self.cancle_btn.resize(140, 30)
     65         self.cancle_btn.clicked.connect(QCoreApplication.quit)
     66 
     67         #执行成功返回值显示位置设置
     68         self.result_le = QLabel(self)
     69         self.result_le.move(30, 270)
     70         self.result_le.resize(340, 30)
     71 
     72         #技术支持框
     73         self.sourceLabel = QLabel(self)
     74         self.sourceLabel.move(30, 360)
     75         self.sourceLabel.resize(340, 30)
     76         self.sourceLabel.setText("Technical support:Azrael ")
     77         self.sourceLabel.setStyleSheet("color:blue;font-size:18px")
     78         self.sourceLabel.setAlignment(Qt.AlignCenter)
     79 
     80         #整体界面设置
     81         self.setGeometry(400, 400, 400, 400)
     82         self.setWindowTitle('video binding')#设置界面标题名
     83         self.show()
     84 
     85     # 打开的视频文件名称
     86     def select_source(self):
     87         target,fileType = QFileDialog.getOpenFileName(self, "select the source file", "C:/")
     88         self.source_le.setText(str(target))
     89     #保存的视频文件名称,要写上后缀名
     90     def select_target(self):
     91         target,fileType = QFileDialog.getSaveFileName(self, "select the save file", "C:/")
     92         self.target_le.setText(str(target))
     93 
     94 
     95     def addNum(self):
     96         source = self.source_le.text().strip()#获取需要剪切的文件
     97         target = self.target_le.text().strip()#获取剪切后视频保存的文件
     98         start_time = self.start_le.text().strip()#获取开始剪切时间
     99         stop_time = self.stop_le.text().strip()#获取剪切的结束时间
    100         video = VideoFileClip(source)#视频文件加载
    101         video = video.subclip(int(start_time), int(stop_time))#执行剪切操作
    102         video.to_videofile(target, fps=20, remove_temp=True)#输出文件
    103         self.result_le.setText("ok!")#输出文件后界面返回OK
    104         self.result_le.setStyleSheet("color:red;font-size:40px")#设置OK颜色为红色,大小为四十像素
    105         self.result_le.setAlignment(Qt.AlignCenter)#OK在指定框内居中
    106 
    107 if __name__=="__main__":
    108     app = QApplication(sys.argv)
    109     ex = login()
    110     sys.exit(app.exec_())
    视频剪切

    四、编译成exe工具下载

    两个工具下载地址

  • 相关阅读:
    面向接口程序设计思想实践
    Block Chain Learning Notes
    ECMAScript 6.0
    Etcd Learning Notes
    Travis CI Build Continuous Integration
    Markdown Learning Notes
    SPRING MICROSERVICES IN ACTION
    Java Interview Questions Summary
    Node.js Learning Notes
    Apache Thrift Learning Notes
  • 原文地址:https://www.cnblogs.com/kowloon/p/9262120.html
Copyright © 2011-2022 走看看