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 { ...
随机推荐
- LESSON 5 - Markov Sources
1. Markov sources The state of the Markov chain is used to represent the “memory” of the source ...
- kubeadm 1.16+ 初始化后 Unable to update cni config: no valid networks found in /etc/cni/net.d
问题描述: 在使用 kubeadm 工具初始化k8s后,并且安装了 flanneld 网络组建后,/var/log/messages 依旧报错, Unable to update cni config ...
- 阿里P7整理“硬核”面试文档:Java基础+数据库+算法+框架技术等
现在的程序员越来越多,大部分的程序员都想着自己能够进入大厂工作,但每个人的能力都是有差距的,所以并不是人人都能跨进BATJ.即使如此,但身在职场的我们一刻也不能懈怠,既然对BATJ好奇,那么就要朝这个 ...
- mysql 基础知识整理
什么是MySQL? MySQL 是一种关系型数据库,在Java企业级开发中非常常用,因为 MySQL 是开源免费的,并且方便扩展.阿里巴巴数据库系统也大量用到了 MySQL,因此它的稳定性是有保障的. ...
- PHP页面跳转三种实现方法
一.header()函数 header()函数是PHP中进行页面跳转的一种十分简单的方法.header()函数的主要功能是将HTTP协议标头(header)输出到浏览器.header()函数的定义如下 ...
- PHP函数include include_once require和require_once的区别
了解下include.include_once.require和require_once这4个函数: include函数:会将指定的文件读入并且执行里面的程序: require函数:会将目标文件的内容 ...
- 安装部署MySQL主从复制
Environment:{ CentOS 7 两台 安装MySQL(mariadb mariadb-server) } !!!关闭防火墙SELinux 1.查看版本信息 2.启动mysql服务,查 ...
- RubyGem 下载时连接失败的解决方法
RubyGem 下载 gem 包失败,有一定原因是 https 导致的. 搜索了很久,找到一个解决的方法. 1.下载 cacert.pem,也就是 curl 的证书. http://curl.haxx ...
- Redis面试热点之底层实现篇(续)
0.题外话 接着昨天的[决战西二旗]|Redis面试热点之底层实现篇继续来了解一下ziplist压缩列表这个数据结构. 你可能会抱有疑问:我只是使用Redis的功能并且公司的运维同事都已经搭建好了平台 ...
- [TimLinux] systemd 精通CentOS7系统启动systemd
1. 介绍 systemd: 在12种不同类型的实体单元(entity unit)间提供了一个依赖关系系统. 2. 几个概念 实体单元:为系统的启动和维护封装多种对象(object).主体单元在单元配 ...