MLT的学习理解
MLT的学习理解
MLT是一个开源的多媒体库,我们的音视频编辑工具,是使用它作为底层支持,某司的‘快剪辑’pc版和安卓版,也是用的它。
MLT简介
它的GitHub地址,这个库比较老了,现在只有一个作者在维护,可能这种库关注的人比较少,所以只有几百个star。想快速上手这个库,可以去看Shotcut的源码,这个Shotcut是一个多轨道视频编辑工具,底层用的就是MLT,UI用的是Qt。MLT用的插件化的设计,它的核心是纯C写的,只依赖标准库和pthread,主要采用的是生产者(producer)和消费者(consumer)模型,模块功能扩展可以有producer,consumer,filter,transition只要遵循核心接口里面的API就行了。MLT的功能模块,用到了很多知名的音视频处理库,像FFmpeg,JACK,Movit,SDL,SOX,libvorbis,都是以插件的形式扩展的。MLT核心虽然是用c语言写的,但是还有一颗面向对象的心,它在最上层的mlt_properties_s结构体里面添加了引用计数,然后它用C++对这些结构体面向对象封装了一下,在类的构造和析构函数里面分别引用计数加一减一,在c代码里面也有一些引用计数操作,但总的来说这个库还是存在内存泄露的,我们自己的项目和Shotcut都有,我们发现关闭一个视频编辑project之后,内存并没有释放,一些对象在我们看来已经完全没有被引用,虽然也调了析构函数,但是引用计数还是没清零,后面我们在关闭编辑作品之后,强制释放大的内存,能大概释放8成左右的内存,还有一部分没有定位到(这个内存释放在后面会讲到)。Shotcut也没有做到关闭一个project,释放内存,所以内存比较小的机器,操作多了会出现崩溃。
项目集成
参照Shotcut的源码,集成MLT还是比较容易的,MLT的编译环境是用32位和64位的mingw,下载那些依赖库,顺利编译,编译完成后,测试一下melt.exe。
关于UI层,我们做的时候考虑的便利性,没有直接选用QT,而采用了PYQT,虽然开发的速度是提高了不少,但是也为后面埋下了一些坑。
在Python层调用c++和c,MLT使用SWIG生成Python接口。在视频播放的过程中的,MLT的sdl_audio consumer会在on_frame_show回调mlt_frame,这个回调方法是在异步线程里面执行的,我们需要在这个线程里面调用Python层的方法,把mlt_frame传过去,首先必须先加GIL全局锁,然后才能调用Python方法,因为Python只允许同时一时刻,只能有一个线程占用解释器。这样虽然是可以正常调用,但是会有一个问题,这个回调不断的加全局锁,抢夺解释器,在播放的过程中,如果快速进行一些UI操作,很容易导致卡顿转圈,然后崩溃,用户体验非常不好。后面改进的方法就是避免在c++异步线程频繁调用Python代码,我们把QWidget的窗口句柄传入MLT,然后直接用opengl,绘制图形,这样就可以播放,也不会造成卡顿了。
3D文字
MLT里面的webvfx利用webkit引擎,可以直接渲染网页,所以先前用的是three.js绘制了3d文字,然后加一些简单的文字动画,但是视频加了这种3d文字之后,会变的十分卡顿,fps只有十左右。webvfx生成3d文字图像,然后借助transition和视频图像融合,这些都是在cpu里面进行了,非常消耗时间;另外加载字体的时候导致内存占用也非常大,偶尔还会导致崩溃,简直做不下去了。后面产品方案让我重新做一套3d文字,使用的是opengl+freetype重新做了一套,因为以前总是做移动方向的,所以对opengl接口比较熟悉,d3d不太熟练,所以采用opengl。目前各种动画效果已经做出来了,但是有两点做的不太好,一是当时没有考虑文字要换行,二是光照效果做的不太满意。后面继续优化吧。
未完待续。。。。
MLT的学习理解的更多相关文章
- 全面学习理解TLB(Translation Look-aside Buffer)地址变换高速缓存
全面学习理解TLB(Translation Look-aside Buffer)地址变换高速缓存 前言: 本文学习思路是:存在缘由 --> 存在好处 --> 定义性质 --> 具 ...
- 菜鸟之路——机器学习之SVM分类器学习理解以及Python实现
SVM分类器里面的东西好多呀,碾压前两个.怪不得称之为深度学习出现之前表现最好的算法. 今天学到的也应该只是冰山一角,懂了SVM的一些原理.还得继续深入学习理解呢. 一些关键词: 超平面(hyper ...
- batch normalization学习理解笔记
batch normalization学习理解笔记 最近在Andrew Ng课程中学到了Batch Normalization相关内容,通过查阅资料和原始paper,基本上弄懂了一些算法的细节部分,现 ...
- Source Xref 与 JavaDocs 学习理解
最近学习Mybatis的官方文档,看到了[项目文档]一节有很多内容没有见过,做个笔记,理解一下. 没找到java相关代码的解释,其实用下面这个php版本解释,也非常不错. What is SOURCE ...
- TLD网络资源汇总--学习理解之(四)
原文:http://blog.csdn.net/mysniper11/article/details/8726649 引文地址:http://www.cnblogs.com/lxy2017/p/392 ...
- TLD算法概述--学习理解之(一)
liuyihai@126.com http://www.cnblogs.com/liuyihai/ TLD(Tracking-Learning-Detection)是英国萨里大学的一个捷克籍博士生Zd ...
- face recognition[翻译][深度学习理解人脸]
本文译自<Deep learning for understanding faces: Machines may be just as good, or better, than humans& ...
- [深度学习]理解RNN, GRU, LSTM 网络
Recurrent Neural Networks(RNN) 人类并不是每时每刻都从一片空白的大脑开始他们的思考.在你阅读这篇文章时候,你都是基于自己已经拥有的对先前所见词的理解来推断当前词的真实含义 ...
- java中的自动转型的学习理解
java当中的继承是和c++中的继承类似,只是java中的继承时的父类只能有一位. 我们今天在这里讲的是关于java中的自动转型的理解:顾名思义,自动转型值得就是使用时自动的将自身的类型进行转化. 自 ...
随机推荐
- Office Online Server 2016 部署和配置
Office Online Server 2016 部署和配置https://wenku.baidu.com/view/65faf8de846a561252d380eb6294dd88d1d23d45 ...
- Factory模式 http://blog.csdn.net/tf576776047/article/details/6895545
Factory模式 http://blog.csdn.net/tf576776047/article/details/6895545 分类: 网站开发 2011-10-22 00:23 1056人 ...
- Linux下中间人攻击利用框架bettercap测试
0x01简介 bettercap可用来实现各种中间人攻击,模块化,便携.易扩展 0x02特点 提到中间人攻击,最知名的莫过于ettercap,而开发bettercap的目的不是为了追赶它,而是替代它 ...
- mysql 插入汉字异常: Incorrect string value: '\xE8\xB0\xA2\xE9\x9D\x99' for column 'uname' at row 1
该字段编码问题,不支持中文,设置支持中文即可
- 深入剖析php执行原理(2):函数的编译
本文只探讨纯粹的函数,并不包含方法.对于方法,会放到类.对象中一起研究. 想讲清楚在zend vm中,函数如何被正确的编译成op指令.如何发生参数传递.如何模拟调用栈.如何切换作用域等等,的确是一个很 ...
- css3 圣诞红包雨效果
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- BZOJ 2440 完全平方数 莫比乌斯反演模板题
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2440 题目大意: 求第k个无平方因子的数 思路: 二分答案x,求1-x中有多少个平方因 ...
- 关于使用 CALayer 中 mask 的一些技巧
CALayer 拥有 mask 属性,Apple 的官方解释如下: An optional layer whose alpha channel is used to mask the layer’s ...
- [Python 多线程] RLock可重入锁 (九)
RLock 可重复锁,是线程相关的锁.同样是线程相关的还有threading.local. 线程A获得可重用锁,并可以多次成功获取,不会阻塞.最后要再线程A中和acquire次数相同的release. ...
- servlet入门与进阶
servlet入门与进阶 1.servlet基础认知 Servlet(Server Applet):全称Java Servlet,是用Java编写的服务器端程序,其主要功能在于交互式地浏览和修改数据, ...