MPV源码探究:背景及准备工作
背景及准备工作
一点历史
古有魏蜀吴三分天下,今有 Mplayer、MPC、VLC 三分天下。这个世界观太庞大,忍不住先讲一点多媒体播放器的历史。实际上目前市面上的开源播放器主要基于三种技术栈:
Mplayer/MPV
发家于 Linux 平台的播放器,基于 FFmpeg 进行解码。我们的研究对象 Mpv 实际上是 Mplayer 的一个衍生分支。基于 OpenGL pipeline 的渲染方案使得自定义配置非常灵活,例如 upscale 算法就有近十种可选,在我看来仅次于 madVR。Mpv 内部实现了支持各种平台的 video output 模块,比如在 Linux 上使用 GPU/OpenGL 或者 X11,在 Windows 上使用 GPU/OpenGL 或者 GPU/D3D11。
VLC
VideoLAN 组织开发的视频播放器,具体什么技术栈我没研究过,不过由于 libVLC 调用十分方便,一众套壳播放器和 UWP 下的播放器底层都是调用的 VLC。VLC 倾向于成为一个开箱即用的简便播放器,诸如 upscale 之类的特性没有很好的扩展性。
MPC
Windows 系统下的播放器鼻祖。MPC 使用 FFmpeg 进行解码,同时支持 DXVA 等技术,使用 Windows DirectShow 进行渲染。DirectShow 这个接口已经非常古早了,早在 Windows 7 的时候微软就已经钦定了他的替代者——Media Foundation。只是微软宅心仁厚,直到现在还一直支持着对古老技术方案的前向兼容。
当然 DirectShow 方案存活了这么久,在这上面做的文章也是最多的。著名的渲染器 madVR 也是基于这套方案。基于 MPC,后来衍生出了 MPC-HC 和 MPC-BE 两个播放器。如果你想用 madVR,搭配 MPC-HC 可能是兼容性最好的组合了。
总结一下,MPC 技术栈真的非常老了,VLC 不够 Geek,MPV 战未来。
准备工作
为了能够顺利的阅读源码,以及编译我们自己的 Mpv,一些环境是必不可少的。阅读源码我使用的是 Visual Studio,当然 VSCode 也行,只要能自动把声明定义索引到就行。
Mpv 的编译需要在 Linux 下进行,使用交叉编译环境编译到 Windows 下来使用。编译可以参考这篇文章,两种方法我都试过,mxe 环境比较适合静态链接;不需要静态链接的话,在 Windows 下使用 MSYS2 就足够了。动态链接的 mpv 编译出来以后会依赖数十个动态链接库,个人觉得仅适合尝鲜使用。
不想编译也没关系,用 Git 把官方仓库 clone 下来即可。下一篇正式进入代码。
MPV源码探究:背景及准备工作的更多相关文章
- MPV源码探究:源码结构和调用层次
源码结构和调用层次 源码结构 从 Github 上拉取最新的源码,目录结构大致如下: H:\MPV ├─.github ├─audio │ ├─decode │ ├─filter │ └─out ├─ ...
- spring-boot-2.0.3之quartz集成,数据源问题,源码探究
前言 开心一刻 着火了,他报警说:119吗,我家发生火灾了. 119问:在哪里? 他说:在我家. 119问:具体点. 他说:在我家的厨房里. 119问:我说你现在的位置. 他说:我趴在桌子底下. 11 ...
- spring-cloud-sleuth+zipkin源码探究
1. spring-cloud-sleuth+zipkin源码探究 1.1. 前言 粗略看了下spring cloud sleuth core源码,发现内容真的有点多,它支持了很多类型的链路追踪, ...
- Vue源码探究-全局API
Vue源码探究-全局API 本篇代码位于vue/src/core/global-api/ Vue暴露了一些全局API来强化功能开发,API的使用示例官网上都有说明,无需多言.这里主要来看一下全局API ...
- Vue源码探究-事件系统
Vue源码探究-事件系统 本篇代码位于vue/src/core/instance/events.js 紧跟着生命周期之后的就是继续初始化事件相关的属性和方法.整个事件系统的代码相对其他模块来说非常简短 ...
- Vue源码探究-状态初始化
Vue源码探究-状态初始化 Vue源码探究-源码文件组织 Vue源码探究-虚拟DOM的渲染 本篇代码位于vue/src/core/instance/state.js 继续随着核心类的初始化展开探索其他 ...
- Vue源码探究-源码文件组织
Vue源码探究-源码文件组织 源码探究基于最新开发分支,当前发布版本为v2.5.17-beta.0 Vue 2.0版本的大整改不仅在于使用功能上的优化和调整,整个代码库也发生了天翻地覆的重组.可见随着 ...
- SpringBoot读取配置文件源码探究
1. SpringBoot读取配置文件源码探究 1.1. 概览 springboot的源码是再原来的Spring源码上又包了一层,看过spring源码都知道,当我们从入口debug进去的时候,原来的S ...
- @Async源码探究
1. @Async源码探究 1.1. 上代码 @SpringBootApplication @EnableAsync public class SpringbootLearnApplication { ...
随机推荐
- SpringBoot项目集成Hystrix
Hystrix Hystrix是由Netflix开源的一个服务隔离组件,通过服务隔离来避免由于依赖延迟.异常,引起资源耗尽导致系统不可用的解决方案. 1.什么是服务熔断 服务熔断就是对该服务的调用 ...
- Composer安装和使用
Composer 是 PHP 的一个依赖管理工具.它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们.Composer 不是一个包管理器.是的,它涉及 "packages" ...
- 在ubuntu18.04中安装opencv_contrib-3.2.0采坑教程
由于最近要在OpenCV3中使用SIFT和SURF特征提取,而自从OpenCV2升级到OpenCV3版本后,SIFT.SURF等这些算法都被移出opencv默认项目库,而被放到叫opencv_cont ...
- 漫谈边缘计算(三):5G的好拍档
边缘计算的热度迅速攀升,还有一个不得不提的因素,就是5G的发展. [5G推动云计算从集中化向分布式演进] 在第一篇文章(<漫谈边缘计算(一):边缘计算是大势所趋>)中我提到,传统的云计算技 ...
- react-native-splash-screen 隐藏statusbar
目录 android ios android android/app/src/main/java/项目名/MainActivity.java @Override protected void onCr ...
- 大数据之Linux基本指令
1:文件操作类指令 ls 是英文单词list 的简写, 其功能为列出目录的内容,是最常用的命令之一 -a all 显示指定目录下所有子目录与文件, 包含隐藏文件 -l 以列表方式显示文件的详细信息 - ...
- [TimLinux] JavaScript 取消异步请求
1. xhr.abort() 这个函数可以用来取消XMLHttpRequest()发起的异步请求,不是xhr.close()哦. 2. 场景 比如说,在关闭一个模态框后,数据可能还没有过来,这个时候需 ...
- python 金融应用(四)金融时间序列分析基础
1.1.创建DataFrame df=pd.DataFrame(list(range(10,50,10)),columns=['num'],index=['a','b','c','d']) df Ou ...
- 每个pool pg数计算
ceph PGs per Pool Calculator 原文档:http://xiaqunfeng.cc/2017/09/18/ceph-PGs-per-Pool-Calculator/ 2017- ...
- Spring面试题总结及答案
Spring面试总结 Spring是什么? Spring框架是一个java平台,提供全面基础设施支持开发java应用程序. Spring的主要模块有哪些? Spring Code:基础模块,主要提供I ...