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的学习理解的更多相关文章

  1. 全面学习理解TLB(Translation Look-aside Buffer)地址变换高速缓存

    全面学习理解TLB(Translation Look-aside Buffer)地址变换高速缓存 前言: 本文学习思路是:存在缘由   --> 存在好处 --> 定义性质 --> 具 ...

  2. 菜鸟之路——机器学习之SVM分类器学习理解以及Python实现

    SVM分类器里面的东西好多呀,碾压前两个.怪不得称之为深度学习出现之前表现最好的算法. 今天学到的也应该只是冰山一角,懂了SVM的一些原理.还得继续深入学习理解呢. 一些关键词: 超平面(hyper ...

  3. batch normalization学习理解笔记

    batch normalization学习理解笔记 最近在Andrew Ng课程中学到了Batch Normalization相关内容,通过查阅资料和原始paper,基本上弄懂了一些算法的细节部分,现 ...

  4. Source Xref 与 JavaDocs 学习理解

    最近学习Mybatis的官方文档,看到了[项目文档]一节有很多内容没有见过,做个笔记,理解一下. 没找到java相关代码的解释,其实用下面这个php版本解释,也非常不错. What is SOURCE ...

  5. TLD网络资源汇总--学习理解之(四)

    原文:http://blog.csdn.net/mysniper11/article/details/8726649 引文地址:http://www.cnblogs.com/lxy2017/p/392 ...

  6. TLD算法概述--学习理解之(一)

    liuyihai@126.com http://www.cnblogs.com/liuyihai/ TLD(Tracking-Learning-Detection)是英国萨里大学的一个捷克籍博士生Zd ...

  7. face recognition[翻译][深度学习理解人脸]

    本文译自<Deep learning for understanding faces: Machines may be just as good, or better, than humans& ...

  8. [深度学习]理解RNN, GRU, LSTM 网络

    Recurrent Neural Networks(RNN) 人类并不是每时每刻都从一片空白的大脑开始他们的思考.在你阅读这篇文章时候,你都是基于自己已经拥有的对先前所见词的理解来推断当前词的真实含义 ...

  9. java中的自动转型的学习理解

    java当中的继承是和c++中的继承类似,只是java中的继承时的父类只能有一位. 我们今天在这里讲的是关于java中的自动转型的理解:顾名思义,自动转型值得就是使用时自动的将自身的类型进行转化. 自 ...

随机推荐

  1. 沉淀再出发:mongodb的使用

    沉淀再出发:mongodb的使用 一.前言 这是一篇很早就想写却一直到了现在才写的文章.作为NoSQL(not only sql)中出色的一种数据库,MongoDB的作用是非常大的,这种文档型数据库, ...

  2. [T-ARA][SEXY LOVE]

    歌词来源:http://music.163.com/#/song?id=22704402 作曲 : 新沙洞老虎/崔圭成 [作曲 : 新沙洞老虎/崔圭成] [作曲 : 新沙洞老虎/崔圭成] 作词 : 新 ...

  3. WinRAR(5.21)-0day漏洞-始末分析

    0x00 前言 上月底,WinRAR 5.21被曝出代码执行漏洞,Vulnerability Lab将此漏洞评为高危级,危险系数定为9(满分为10),与此同时安全研究人员Mohammad Reza E ...

  4. Python正则表达式(总)

    转载请标明出处: http://www.cnblogs.com/why168888/p/6445044.html 本文出自:[Edwin博客园] Python正则表达式(总) search(patte ...

  5. N个苹果分给M个人,有多少种分法

    每次分配一个苹果出去,然后再分配N-1个苹果.这里有个注意的地方就是,分那1个苹果的时候,假设还有N个苹果,不是从第一个人开始分,而是从N+1个苹果分配的位置开始,不然的话会产生重复的解.所以i=p不 ...

  6. Java基础知识强化之集合框架笔记77:ConcurrentHashMap之 ConcurrentHashMap的基本操作

    1. ConcurrentHashMap的初始化: 下面我们来结合源代码来具体分析一下ConcurrentHashMap的实现,先看下初始化方法: public ConcurrentHashMap(i ...

  7. C/C++中作用域详解

    转自:http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777433.html 作用域规则告诉我们一个变量的有效范围,它在哪儿创建,在哪儿 ...

  8. Java并发案例01---多线程之死锁

    多线程之死锁案例一 package example; /** * 模拟死锁 * @author maple * */ public class DeadLock { public int flag = ...

  9. 随手练——洛谷-P1008 / P1618 三连击(暴力搜索)

    1.普通版 第一眼看到这个题,我脑海里就是,“我们是不是在哪里见过~”,去年大一刚学C语言的时候写过一个类似的题目,写了九重循环....就像这样(在洛谷题解里看到一位兄台写的....超长警告,慎重点开 ...

  10. gdbt与adboost(或者说boosting)区别

    boosting 是一种将弱分类器转化为强分类器的方法统称,而adaboost是其中的一种,或者说AdaBoost是Boosting算法框架中的一种实现 https://www.zhihu.com/q ...