python使得ffmpeg更加强大

录制项目终于做完,不用总是提醒自己抓紧时间这样来想问题了。
在完成之后带着一些满足感,回头看看哪些地方是需要改进的,哪些地方又是有更好的替代方案,自己又有哪些不足。

下面按照软件的各部分分别作总结记录:

0. 软件应用场景:

客户希望用视频+音频的方式录制下会议的内容。除了录制会议室情况之外,会议中还有可能需要录制电脑屏幕内容,比如在做PPT讲解等,所以需要一个在两种录制方式之间快捷切换的软件。除此之外,需要一个防止复制运行的机制和完整的安装包。

1. 核心:subprocess子进程运行控制。

由应用来看,关键是录制屏幕和录制摄像头,以及用快捷键控制在这两者之间切换。
我的实现是通过python3调用ffmpeg,ffmpeg实现录制,python来完成切换。
从开发角度来说,并不算难,抛去录制这个功能,这个软件实际上应该这样描述:python完全控制ffmpeg.exe进程的应用。
进一步地说,ffmpeg能做到的,软件大部分都可以做到,不同的是可以添加快捷键控制等,可以用python对除了ffmpeg功能之外做一些必要的补充。比如,客户在需求实现之前测试发现win10系统下自买的摄像头运行时间长了之后会随机的中断录制,卖家也无办法解决,因为是win10系统兼容性问题。所以客户提出在录制异常中断的情况下,能够自动重新开始录制。这个需求的满足就依赖python对ffmpeg的补充。
另外,完全控制ffmpeg进程关键在于如何自然退出。ffmpeg在cmd运行按下q键是退出,利用这一点往子进程输入流写入’q’实现了自然退出,保证了数据的正常写入和保存,并且不会引发异常情况。如果不得益于这一点,用os.kill(process_id)等方式都很难去控制进程的正常退出。
下面是代码结构简化版思维导图:
clipboard.png

功能性的右键菜单:
一般设备设置 录制参数设置

程序主要的录制状态变化通过托盘图标的来展示。三种录制状态的托盘图标如下:
python使得ffmpeg更加强大

暂时熟练的就这些,以后再更新。
软件代码发布在record-camera-and-screen。
创建了两个分支gutin和dev。gutin是给客户的版本,dev是自己想在这个软件上进一步的完善。

6. 交付效果:

软件运行效果:在分辨率为1024×768、帧率30/s、h264编码、i5 cpu threads=4的情况下录制,cpu占有率保持在30%~40%之间(这是ffmpeg的功劳)。
开发分两次提出,客户第一次的需求主要是录制,第二次是调整和增加附加功能。两次合作及时完成了客户的需求,都得到了用户满意的反馈。

7. 项目收获:

  1. 加深了对python的了解,更熟练的编写python代码。
  2. 在开发过程中,练习使用git管理自己的代码。并且利用版本回退帮助自己查找bug引发的原因,相信以后git会成为我开发工作中必不可少的帮手。这次不同的是,是在自己一手写出来的代码基础上进行管理,所以得心应手很多。以往总是试着去github上clone别人的项目别人的代码,作为一个新手,自己首先就面对的是不熟悉的项目和代码,如果说在这个基础上再学习git的操作和概念,其实是很难的。所以以前总是没能好好的掌握git。
  3. 开发这个软件第一目的是再学习如何解决在开发过程中遇到的问题。
    这次开发遇到最大的难题是write(q),为什么这么说定是不是采用python+ffmpeg.exe的形式来实现的关键点在于对ffmpeg.exe进程的完全控制。首先,查看了subprocess的文档,确定了完全控制一个子进程不成问题;然后在cmd下实验了摄像头录制和屏幕录制,就是ffmpeg在单独运行的情况下,实现录制功能。这两点实验过后都没有问题,然后自以为两者的结合会顺其自然的顺利。结果就卡在了停止录制时,怎么处理ffmpeg进程的退出方式。

    第一次实验是Popen.terminate()和kill(),实际发现ffmpeg根本无动于衷。[原因待确认]
    然后用Popen.send_signal(CTRL_C_EVENT)确实是可以控制ffmpeg进程退出了,结果看录制的视频,最后一部分录制内容丢失了,很显然是ffmpeg不正常退出导致的。由此也明白了,光退出还不行,还得自然的退出。虽然知道凡强制的方式必定不是自然的,期间抱着试试的态度也用到了os.kill(),结果果然不如人愿。
    然后回头复盘,想着CTRL_C_EVENT是模拟按键进行退出,那么模拟q键退出是不是可行呢TRL_C_EVENT是python提供的,那么怎么模拟自定义按键呢着就尝试了stdin.write(‘q’)方式,结果令人振奋,不仅录制内容完整,而且没有强制退出时偶尔引起的程序异常。事实证明这样的处理方式是最自然的。还记得当时解决这个难题是多么的开心和满足,这种满足感也正是自己的开发乐趣所在。不过解决旧问题的同时,常常也许会引发新的问题。与输入流交互的write(‘q’)方式也就必须让Popen(universal_newlines=True),而这后面也凸显了ffmpeg对中文支持不太友好的问题,不过都得到了解决。

  4. 最后经过这个软件的开发,让自己从整体上对软件有了一个新的认识。
    任何一个软件简洁到可以用一句话说清楚。知道最终的目的是什么,从一个模型框架开始,我们所做的工作无非就是在这个模型之上添砖加瓦。软件的不同之处在于,包含的砖瓦种类数目,每种砖每个瓦的开发难度,以及它们用什么样的方式合在一起。最终构建成一座高楼大厦。收获了完成一件作品时的喜悦,同时,也看到了自己能力的局限性。
    想构建更强更大的软件不光是要提升自己的能力,找到一个好的团队,并一起合作创造才是最佳途径。

8. 未来改进和扩展:

完善快捷键
录制状态切换音效和添加动画【学习pyqt的绘制】
视频输出优化:添加水印和标签等
界面美化:用圆形框取代方形按钮
添加支付接口
添加实时录制预览窗口
改成个人的演讲练习录制工具

9. 个人其他开发项目

github: www.github.com/ilinxiao

文章知识点与官方知识档案匹配,可进一步学习相关知识Python入门技能树首页概览208266 人正在系统学习中 相关资源:按软件服务对象的范围划分-软件工程课件-专业指导文档类资源-CSDN…

来源:weixin_34081595

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2018年5月23日
下一篇 2018年5月23日

相关推荐