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中的自动转型的理解:顾名思义,自动转型值得就是使用时自动的将自身的类型进行转化. 自 ...
随机推荐
- 理解 Java 正则表达式怪异的 \\ 和 \\\\,让您见怪不怪
本文链接 https://unmi.cc/understand-java-regex-backslash/, 来自 隔叶黄莺 Unmi Blog Java 语言里的几大变革,一为 jdk1.4 引入的 ...
- Linux 基础学习大考核
0.关于Linux的简介 Linux(好又免费)的组成部分: Linux 是一种计算机操作系统: 一系列能让您与计算机进行交互操作并运行其它程序的程序. 操作系统由多种基础程序构成.它们使计算机可以与 ...
- 深入浅出SharePoint——常用的系统账号
NT AUTHORITY\Authenticated Users添加此用户后所有windows认证的ad用户都被授权.注意添加的时候如果搜索不到,可以直接输入Authenticated Users,然 ...
- 关于Class类的getResource().getPath()方法
程序中配置文件如果放置在classes文件夹,那么我们就可以使用Class类的getResource().getPath()方法获取文件路径. 例如: String path = DBUtil.cla ...
- python内置模块(三)
hashlib模块 通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示). Python2中使用hashlib: import hashlib m = hashlib ...
- python网络爬虫--简单爬取糗事百科
刚开始学习python爬虫,写了一个简单python程序爬取糗事百科. 具体步骤是这样的:首先查看糗事百科的url:http://www.qiushibaike.com/8hr/page/2/?s=4 ...
- git回滚线上代码
由于之前自己推代码的时候操作失误,push代码的时候没有push到线上的dev分支,而是push到了线上master分支(主要是因为没有在命令后写分支名,直接推到默认master分支上了),覆 ...
- 「BZOJ3226」[Sdoi2008]校门外的区间
题目 首先是开闭区间的处理,我们把\(1.5\)这种数加进来,用\([1.5,6]\)来表示\((2,6]\) 根据离散数学的基本知识,尝试把五个操作转化成人话 把\([x,y]\)变成\(1\) 把 ...
- ascll方便查询
- 关于tomcat无法启动问题详解
通常情况tomcat无法启动,有这么几个原因?(1)代码有问题; (2)tomcat有问题; (3)端口被占; (4)动态web项目为3.0: (5)java环境运行内存不足; 这是比较常见的问题.解 ...