背景及准备工作

一点历史

古有魏蜀吴三分天下,今有 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源码探究:背景及准备工作的更多相关文章

  1. MPV源码探究:源码结构和调用层次

    源码结构和调用层次 源码结构 从 Github 上拉取最新的源码,目录结构大致如下: H:\MPV ├─.github ├─audio │ ├─decode │ ├─filter │ └─out ├─ ...

  2. spring-boot-2.0.3之quartz集成,数据源问题,源码探究

    前言 开心一刻 着火了,他报警说:119吗,我家发生火灾了. 119问:在哪里? 他说:在我家. 119问:具体点. 他说:在我家的厨房里. 119问:我说你现在的位置. 他说:我趴在桌子底下. 11 ...

  3. spring-cloud-sleuth+zipkin源码探究

    1. spring-cloud-sleuth+zipkin源码探究 1.1. 前言   粗略看了下spring cloud sleuth core源码,发现内容真的有点多,它支持了很多类型的链路追踪, ...

  4. Vue源码探究-全局API

    Vue源码探究-全局API 本篇代码位于vue/src/core/global-api/ Vue暴露了一些全局API来强化功能开发,API的使用示例官网上都有说明,无需多言.这里主要来看一下全局API ...

  5. Vue源码探究-事件系统

    Vue源码探究-事件系统 本篇代码位于vue/src/core/instance/events.js 紧跟着生命周期之后的就是继续初始化事件相关的属性和方法.整个事件系统的代码相对其他模块来说非常简短 ...

  6. Vue源码探究-状态初始化

    Vue源码探究-状态初始化 Vue源码探究-源码文件组织 Vue源码探究-虚拟DOM的渲染 本篇代码位于vue/src/core/instance/state.js 继续随着核心类的初始化展开探索其他 ...

  7. Vue源码探究-源码文件组织

    Vue源码探究-源码文件组织 源码探究基于最新开发分支,当前发布版本为v2.5.17-beta.0 Vue 2.0版本的大整改不仅在于使用功能上的优化和调整,整个代码库也发生了天翻地覆的重组.可见随着 ...

  8. SpringBoot读取配置文件源码探究

    1. SpringBoot读取配置文件源码探究 1.1. 概览 springboot的源码是再原来的Spring源码上又包了一层,看过spring源码都知道,当我们从入口debug进去的时候,原来的S ...

  9. @Async源码探究

    1. @Async源码探究 1.1. 上代码 @SpringBootApplication @EnableAsync public class SpringbootLearnApplication { ...

随机推荐

  1. Java基础常见笔试题总结

    1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行的字节码文件 2.“sta ...

  2. 100天搞定机器学习|Day57 Adaboost知识手册(理论篇)

    Boosting算法 Boosting是一种用来提高弱分类器准确度的算法,是将"弱学习算法"提升为"强学习算法"的过程,主要思想是"三个臭皮匠顶个诸葛 ...

  3. mac 下面 vim 编辑器 开启语法高亮

    cp /usr/share/vim/vimrc ~/.vimrc 拷贝默认的配置文件 vim ~/.vimrc 编辑该文件 在文件的最后加入 syntax on 保存退出即可

  4. Netty学习——Netty和Protobuf的整合(一)

    Netty学习——Netty和Protobuf的整合 Protobuf作为序列化的工具,将序列化后的数据,通过Netty来进行在网络上的传输 1.将proto文件里的java包的位置修改一下,然后再执 ...

  5. 第五章 Unity中的基础光照(3)

    目录 1. 在Unity Shader中实现高光反射光照模型 1.1 实践:逐顶点光照 1.2 逐像素光照 1.3 Blinn-Phong光照模型 2. 召唤神龙:使用Unity内置的函数 @ 1. ...

  6. Lua的面向对象,封装,继承,多态

    概述 我们总所周知对象是由属性和方法组成的,要用lua要描述一个对象,也必然要有这两个特性,属性和方法.lua的基本结构是table,所以Lua的类,其实都是table,因为它可以存储普通的变量又可以 ...

  7. 基于Docker快速搭建ELK

    [摘要] 本文基于自建的Docker平台速搭建一套完整的ELK系统,相关的镜像直接从Docker Hub上获取,可以快速实现日志的采集和分析检索. 准备镜像 l  获取ES镜像:docker pull ...

  8. 声明式服务调用Feign

    什么是 Feign Feign 是种声明式.模板化的 HTTP 客户端(仅在 consumer 中使用).   什么是声明式,有什么作用,解决什么问题? 声明式调用就像调用本地方法一样调用远程方法;无 ...

  9. HDU5919 Sequence II(主席树)

    Mr. Frog has an integer sequence of length n, which can be denoted as a1,a2,⋯,ana1,a2,⋯,anThere are ...

  10. FlyWay工作原理

    本文译自Flyway官方文档,原文地址https://flywaydb.org/getstarted/how 当你最开始将FlyWay指向一个空数据库时. 它会试着去查找schema历史表,如果此时数 ...