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 { ...
随机推荐
- Gzip,BZip2,Lzo,Snappy总结
gzip,bzip2,lzo,snappy是hadoop中比较常见的文件压缩格式,可以节省很多硬盘存储,以下是Gzip , BZip2 , Lzo Snappy 四种方式的优缺点 和使用场景 Gzip ...
- Servlet+Ajax实现搜索框智能提示
简介:搜索框相信大家都不陌生,几乎每天都会在各类网站进行着搜索.有没有注意到,很多的搜索功能,当输入内容时,下面会出现提示.这类提示就叫做搜索框的智能提示,本门课程就为大家介绍如何使用Servlet和 ...
- 批量更新Linux文件后缀名
#!/bin/bash#Create_Time 2019-08-06#use: small_wei #查找并,批量修改文件后缀 #后缀为 .txt 修改为 .log find /opt -name & ...
- 【数据结构】之散列链表(Java语言描述)
散列链表,在JDK中的API实现是 HashMap 类. 为什么HashMap被称为“散列链表”?这与HashMap的内部存储结构有关.下面将根据源码进行分析. 首先要说的是,HashMap中维护着的 ...
- 使用 cAdvisor 主机上的容器
目录 前言 安装测试 安装 docker 安装docker-ce 启动 cAdvisor 容器 访问测试 prometheus 服务端配置 使用 promtool 检查配置文件 重新加载配置文件 前言 ...
- 解决mysql java.sql.SQLException: The server time zone value‘XXXXXX' is unrecognized or represents...
解决 java.sql.SQLException: The server time zone value 'XXXXXX' is unrecognized or represents more tha ...
- react-starter-projects
react-starter-projects These are repositories that you copy and modify to create your own React app. ...
- Thymeleaf语法
Thymeleaf 官网:https://www.thymeleaf.org/ 1.入门示例 (1)在controller编写一个请求,放进去一些数据: @RequestMapping("/ ...
- Codeves-5037线段树4加强版(线段树? 。。。分块)
维护一个序列,要求支持下列2种操作: add a b c:区间[a,b]中每个数加上c count a b:查询区间[a,b]中有多少数是k的倍数(k为给定常数) 输入描述 Input Descrip ...
- CodeForces845G-Shortest PathProblem?
You are given an undirected graph with weighted edges. The length of some path between two vertices ...