Python使用Tkinter封装FFmpeg

前言:这次实验为2016级北邮信通多媒体通信的一次小作业(版本一&版本二),在此记录一下以供后来的学弟学妹参考,当然也可以使用其他的方式比如Qt去做界面啦。如果嫌下载要积分的话直接私信我就好。
tips: 楼主的Mac用的是pyenv,跑tk的时候显示不出来,后来切换版本回到2.7可以,但是代码也可以直接在Python3里面运行(只要修改import Tkinterimport tkinter就好).

文章目录

  • 两种代码思路
    • 1. 使用Python中的Subprocess对FFmpeg命令行进行适配
    • 2. 调用Python中的FFmpy库
    • 3. GUI界面预览

两种代码思路

1. 使用Python中的Subprocess对FFmpeg命令行进行适配

Subprocess比较实用,直接将字符用逗号分隔就好
一个简单的例子如下:

import subprocess
subprocess.call(['ls','-l'])

然后就可以在输出里面看到ls -l的执行结果了,这就相当于直接调用命令行。
那么接下来要做的事情就简单了,对于如下的指令:

ffmpeg -s qcif -r 30 -i "输入yuv文件" -aspect 4:3 -c:v mpeg4 -b:v 32K -bt 32K -g 30 "输出w4v或者mp4文件"

只要将其中的各个变量设置成Python中的字符串变量就好了。
而各个字符串变量绑定在Tk的控件当中,各个变量的类型是tk.StringVar()

window_decode = tk.Toplevel(window)window_decode.geometry('400x550')window_decode.title('Decoding window')pixel_rate= tk.StringVar()tk.Label(window_decode, text="分辨率",font=('Arial',20)).place(x=10, y= 10)combobox_bt = ttk.Combobox(window_decode, textvariable=pixel_rate, values=("qcif", "40k", "48k", "自定义(单位:k)"))combobox_bt.place(x=150, y=10)#combobox_bt.pack()fps = tk.StringVar()tk.Label(window_decode, text='帧速率',font=('Arial',20)).place(x=10, y=50)combobox_bt0 = ttk.Combobox(window_decode, textvariable=fps, values=("15", "29.97", "45", "60","自定义帧速率"))combobox_bt0.place(x=150, y=50)bit = tk.StringVar()tk.Label(window_decode, text='码率',font=('Arial',20)).place(x=10, y=90)combobox_bt0 = ttk.Combobox(window_decode, textvariable=bit, values=("30k", "60k","360k", "720k", "1550k","自定义码率"))combobox_bt0.place(x=150, y=90)size = tk.StringVar()tk.Label(window_decode, text='帧大小',font=('Arial',20)).place(x=10, y= 130)combobox_bt1 = ttk.Combobox(window_decode, textvariable=size, values=("qcif", "cif", "half", "d1","自定义帧大小"))combobox_bt1.place(x=150, y=130)aspect= tk.StringVar()tk.Label(window_decode, text='宽高比',font=('Arial',20)).place(x=10, y=170)combobox_bt1 = ttk.Combobox(window_decode, textvariable=aspect, values=("4:3", "16:9","自定义宽:自定义高"))combobox_bt1.place(x=150, y=170)code_way= tk.StringVar()tk.Label(window_decode, text='编码方式',font=('Arial',20)).place(x=10, y=210)combobox_bt1 = ttk.Combobox(window_decode, textvariable=code_way, values=("mpeg4", "mpeg3", "libx264","其他编码方式"))combobox_bt1.place(x=150, y=210)gop_size = tk.StringVar()tk.Label(window_decode, text='图像组大小',font=('Arial',20)).place(x=10, y=250)combobox_bt1 = ttk.Combobox(window_decode, textvariable=gop_size, values=("30k", "360k", "720k", "1550k","自定义(单位:k)"))combobox_bt1.place(x=150, y=250)form = tk.StringVar()form.set('.mp4')tk.Label(window_decode, text='输出图像格式',font=('Arial',20)).place(x=10, y=290)combobox_bt1 = ttk.Combobox(window_decode, textvariable=form, values=('.mp4', '.m4v','.264',"其他"))combobox_bt1.place(x=150, y=290)

然后在绑定的触发事件中拼接字符串:

subprocess.call(['ffmpeg','-s',size.get(),'-r',fps.get(),'-i',Input.get(),'-aspect',aspect.get(),'-c:v',code_way.get(),'-b:v',bit.get(),Output.get(),'-y'])

要记住变量的类型是tk.StringVar(),拼接的时候要使用变量.get()获得它的字符串。

2. 调用Python中的FFmpy库

另外一种思路就是直接使用FFmpy的适配库,使用这个库的话,要创建两个字典input_dictoutput_dict最后直接调用.run()就好了。

input_dict = {input_path: "-s " + size + ' ' + "-r " + fps}output_dict = {output_path: "-aspect " + aspect + ' ' + "-c:v " + codec + ' ' + "-b:v " + bitrate + ' ' + "-bt " + bt + ' ' + "-g " + gop_size}ff = FFmpeg(inputs=input_dict, outputs=output_dict)#print(ff.cmd)ff.run()

其他的参数设置基本与上述一致。

3. GUI界面预览

主要用的是Button和下拉菜单ttk.Combobox,下面直接放图啦,具体的大家可以直接去代码里面修改,或者直接跳转B站Tk教程现学。

  1. 主界面
    注意canvas不是很好用,很容易显示不出啦哦。
  • 版本一

  • 版本二
  1. 编码界面
  • 版本一
  • 版本二
  1. 解码界面
  • 版本一
  • 版本二

本期分析记录结束啦,也是比较简单的一次
φ(≧ω≦*)♪

Python使用Kt封装FFmpeg相关推荐

  1. python modbus类封装_Python 中引入一个文件,模块的概念

    Python 提供了强大的模块支持,主要体现在,不仅 Python 标准库中包含了大量的模块(称为标准模块),还有大量的第三方模块,开发者自己也可以开发自定义模块. 通过这些强大的模块可以极大地提高开 ...

  2. python怎样实现封装_Python底层封装实现方法详解

    Python底层封装实现方法详解 这篇文章主要介绍了Python底层封装实现方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 事实上,pyth ...

  3. python类的封装是什么意思_python类封装 python中将函数和变量封装成类的好处

    Python中的封装有什么作用?发现自己的错误,就是开悟:改正自己的错误,就是成就. 日常生活中可以看到很多的汽车,汽车包括车轮.发动机.车架等零部件.可以在车架上安装车轮,然后安装发动机,最后安装其 ...

  4. FFmpeg开发(五)——Qt视频播放器之封装FFmpeg类(参考了暴风影音、迅雷影音)

    FFmpeg开发(五)--Qt视频播放器之封装FFmpeg类(参考了暴风影音.迅雷影音) 上一篇介绍了,使用Qt和FFmpeg写的播放器.页面大家可以点进去查看和下载. FFmpeg开发(四)--Qt ...

  5. 详解Python中的封装

    文章目录 详解Python中的封装 基础入门 -> setter.getter 进阶使用 -> __ 私有属性 _ 强化加强 -> property 详解Python中的封装 面向对 ...

  6. python之类的封装

    博主简介:原互联网大厂tencent员工,网安巨头Venustech员工,阿里云开发社区专家博主,微信公众号java基础笔记优质创作者,csdn优质创作博主,创业者,知识共享者,欢迎关注,点赞,收藏. ...

  7. python 类的封装

    一.什么是封装 在程序设计中,封装(Encapsulation)是对具体对象的一种抽象,即将某些部分隐藏起来,在程序外部看不到,其 含义是其他程序无法调用. 想要了解封装,就离不开"私有化& ...

  8. Python面向对象二 封装与修饰器

    Python面向对象二 封装与修饰器 1. 特殊方法 2. 封装 2.1 封装的引入 2.2 封装实例一 2.3 封装实例二 3. property装饰器 1. 特殊方法 • 在类中可以定义一些特殊方 ...

  9. python面向对象之封装、继承与多态

    目录 面向对象程序设计 类和对象 属性查找 数据属性 实例属性 类的封装 封装数据 封装⽅法(隔离复杂度) 类的⽅法 类的继承 继承概述 单继承 多继承 ⽅法重写 继承原理 深度优先&⼴度优先 ...

最新文章

  1. 如何用最短时间搞定酷炫可视化大屏?这款工具值得一看
  2. 婚纱照嘴巴有点凸好p吗_丑拒80寸奢华大片挂床头,压箱底的婚纱照还能这样摆?...
  3. 找出占用cpu最高的线程
  4. 黑客SQL服务器入侵实战演习
  5. 重磅!Uber发布史上最简单的深度学习框架Ludwig!不懂编程也能玩转人工智能
  6. 实用window2008之七 :路由器配置应用实例
  7. Linux下JAVA线程占用CPU高的分析方法
  8. Java多线程-join方法
  9. python soup提取叶子标签_使用Python爬虫库BeautifulSoup遍历文档树并对标签进行操作详解(新手必学)...
  10. 分享Java中模拟Ping操作的一个类
  11. linux ubuntu下网络调试助手(GUI)工具
  12. 2018最新第三方支付牌照公司名单「完整」
  13. 什么是差模干扰、共摸干扰?
  14. 【SSL 1458】zzzyyds(DP)
  15. 青蛙的约会(扩展欧几里德)
  16. 数码管显示电路分析-74hc138+74hc164
  17. 苹果电脑重置登录密码
  18. html整体结构图,用html+css制作的组织结构图
  19. PC DMIS三坐标产品测量编程视频教程+资料
  20. xenomai网卡驱动分析之一 加载和使用

热门文章

  1. java学习第188天,javaWeb学习第47天,复习第23天;p257-262(08/21)-4h
  2. 识别图片文字怎么弄?我来教大家怎么识别图片中的文字
  3. 如何使用旅程可视化工具:简化网站和应用程序上的客户旅程图
  4. 【Python 文件读写】— csv文件
  5. 设计师常用设计尺寸有哪些
  6. 认识WebSocket并搭建服务端
  7. 打印formdata的值
  8. 计算机考证编程类证书
  9. CRM——验证码(JWT技术)、接口资源鉴权
  10. cread and close