[Python]结合PyQT5和FFmpeg写一个压缩视频文件的可执行小程序,操作简单,直观明了

前置条件:

1.安装PyQT5

pip install PyQt5
pip install PyQt5 -i https://pypi.douban.com/simple   #通过豆瓣镜像源安装PyQT5

2.下载FFmpeg

官网地址  Download FFmpeg

本程序只用到了ffmpeg这个可执行程序(probe是用于编码,play是用于播放),ffmpeg.exe必须放置在最终程序的同一路径下或者配置到环境变量中

3.安装Pyinstaller

为了最终打包代码为一个可执行程序,下载方式如下

pip install pyinstaller  #也可以像第一步用镜像源下载

代码(可直接运行):

1.Python代码

import os
import sys
from datetime import datetime
from PyQt5.QtCore import Qt
from PyQt5.QtNetwork import QLocalServer, QLocalSocket
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QSlider, QPushButton
from PyQt5.QtGui import QIcon


class VideoCompressor(QWidget):
    def __init__(self):
        super().__init__()
        self.input_file = None
        self.output_file = None
        self.crf_value = 30
        self.init_ui()

    def init_ui(self):
        layout = QVBoxLayout()
        self.label = QLabel("拖动视频文件到窗口释放即可!")
        layout.addWidget(self.label)
        self.slider = QSlider(Qt.Horizontal)
        self.slider.setMinimum(1)  # 设置为1
        self.slider.setMaximum(50)  # 设置为50
        self.slider.setValue(int(self.crf_value))  # 映射为整数
        self.slider.valueChanged.connect(self.slider_changed)
        layout.addWidget(self.slider)
        self.crf_label = QLabel(f" CRF参数: {int(self.crf_value)}\n\n*CRF参数范围1至50,参数越大压缩效果越强\n 建议25-35之间")  # 只显示整数部分
        layout.addWidget(self.crf_label)
        self.compress_button = QPushButton("开始压缩")
        self.compress_button.resize(400,300)
        self.compress_button.clicked.connect(self.compress_video)
        layout.addWidget(self.compress_button)
        self.setLayout(layout)
        self.setGeometry(300, 300, 400, 200)
        self.setWindowTitle('PW_Compress')
        self.setAcceptDrops(True)

    def slider_changed(self):
        self.crf_value = int(self.slider.value())
        self.crf_label.setText(f" CRF参数: {self.crf_value}\n\n*CRF参数范围1至50,参数越大压缩效果越强\n 建议25-35之间")  # 只显示整数部分

    def compress_video(self):
        output_directory = os.path.dirname(self.input_file)
        output_filename = self.get_output_filename()
        self.output_file = output_directory + '/' + output_filename
        compress_cmd = 'ffmpeg -i \"{inputfile}\" -crf {index} \"{outputfile}\"'.format(inputfile=self.input_file,
                                                                                        index=self.crf_value,
                                                                                        outputfile=self.output_file)
        os.system(compress_cmd)
        self.label.setText(f"压缩完成,输出文件:{self.output_file}")

    def get_output_filename(self):
        base_filename, extension = os.path.splitext(os.path.basename(self.input_file))
        timestamp = datetime.now().strftime("%Y%m%d_%H%M")
        output_filename = f"{base_filename}_[{timestamp}compressed]{extension}"
        return output_filename

    def dragEnterEvent(self, event):
        mime_data = event.mimeData()
        if mime_data.hasUrls() and len(mime_data.urls()) == 1:
            file_path = mime_data.urls()[0].toLocalFile()
            if os.path.isfile(file_path) and any(
                    file_path.lower().endswith(ext) for ext in ['.mp4', '.avi', '.mkv', '.mov']):
                event.acceptProposedAction()

    def dropEvent(self, event):
        file_path = event.mimeData().urls()[0].toLocalFile()
        if os.path.isfile(file_path) and any(
                file_path.lower().endswith(ext) for ext in ['.mp4', '.avi', '.mkv', '.mov']):
            self.input_file = file_path
            self.label.setText(f"已选择文件:{self.input_file}")


if __name__ == '__main__':
    try:
        app = QApplication(sys.argv)
        serverName = 'PW_Compress'
        socket = QLocalSocket()
        socket.connectToServer(serverName)
        if socket.waitForConnected(500):
            app.quit()
        else:
            localServer = QLocalServer()
            localServer.listen(serverName)
            compressor = VideoCompressor()
            compressor.setWindowIcon(QIcon('Logo.ico'))
            compressor.show()
            sys.exit(app.exec_())
    except:
        print("启动异常")

代码结构:

2.使用Pyinstaller打包程序

在Terminal输入

pyinstaller -F -w 文件名.py

完成后会在路径下生成一个dist目录,可执行程序就在这个文件夹中

最终结果:

图标(我自己加了自己的icon,所以与默认图标不一致,如果想个性化定义,需要将想要的图片转为".ico"格式文件,Pyinstaller加 "-i 文件.ico"参数):

GUI界面:

操作步骤:

1.将想要压缩的视频拖入窗口,会自动识别文件绝对路径

2.调整CRF参数,数值越大压缩效果越强,但对画质损失也会越大。反之则效果弱,损失也小

3.点击压缩视频,开始压缩

4.需要压缩新的文件则拖新的文件进入,重复123步骤即可

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
您可以使用PythonPyQt5来创建一个基于FFmpeg视频播放器。下面是一个简单的示例代码: ```python import sys from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton from PyQt5.QtGui import QIcon from PyQt5.QtCore import Qt import subprocess class VideoPlayer(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setWindowTitle("Video Player") self.setGeometry(100, 100, 800, 600) # 创建一个垂直布局 layout = QVBoxLayout() # 创建一个播放按钮 play_button = QPushButton("Play") play_button.clicked.connect(self.playVideo) layout.addWidget(play_button) # 将布局设置为窗口的主布局 self.setLayout(layout) def playVideo(self): # 使用FFmpeg命令行播放视频 video_path = "path_to_video_file" # 替换为您自己的视频路径 command = ["ffmpeg", "-i", video_path, "-an", "-window_title", "Video Player", "-f", "sdl", "Video Player"] subprocess.call(command) if __name__ == "__main__": app = QApplication(sys.argv) player = VideoPlayer() player.show() sys.exit(app.exec_()) ``` 请将上述代码中的`"path_to_video_file"`替换为您自己的视频文件路径。运行代码后,将显示一个窗口,其中包含一个播放按钮。单击播放按钮将使用FFmpeg播放视频文件。 请注意,您需要安装FFmpeg并将其添加到系统路径中。此外,还需要安装PyQt5库。您可以使用以下命令来安装PyQt5: ``` pip install PyQt5 ``` 希望这可以帮助您开始创建一个基于FFmpeg视频播放器!如有其他问题,请随时提问。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值