16k Star!一个开源的命令行视频播放器

来源:高效程序员

mpv 是一个免费、开源、跨平台的多媒体播放器,可用于 Windows、Linux、MacOS、BSD 以及 Android 等平台。

mpv 带有极简的 GUI 界面以及丰富的命令行控制,它支持各种媒体文件格式、音频和视频编解码器以及字幕类型。

mpv 介绍

mpv 是由 Vincent Lang(首席开发者)在 2012 年从 mplayer2 fork 出来的,而 mplayer2 是在 2010 年从 MPlayer fork 出来的。至于 fork 的动机:主要是(通过删除不可维护的代码以及放弃对老旧系统的支持)鼓励开发者,让大家保持活跃性。

毫不意外,mpv 一经推出,便受到了很高的评价,并获得了大量的贡献。截至目前,已获得了 16K+ Star。

mpv 的几个主要网址:

其主要特性有:

  • 屏幕控制器

    虽然 mpv 力求简约,并没有提供真正的 GUI,但它在视频顶部有一个小控制器,用于基本控制。

  • 高品质视频输出

    mpv 具有基于 OpenGL、Vulkan 和 D3D11 的视频输出,能够支持视频发烧友喜爱的许多功能,例如:使用流行的高质量算法进行视频缩放、色彩管理、帧时序、插值、HDR 等。

  • GPU 视频解码

    mpv 可以利用所有平台上的大多数硬件解码 API,硬件解码可在运行时按需启用。

  • 可嵌入

    mpv 从头开始设计了一个简单的 C API,使其可以作为一个库使用,并便于和其他应用轻松集成。

基于 mpv 的应用

mpv 的用户群很广,这里有个第三方应用列表https://github.com/mpv-player/mpv/wiki/Applications-using-mpv),简单列举几个:

项目 介绍 地址
Baka MPlayer 免费、开源、跨平台,基于 libmpv 的多媒体播放器(Qt5) https://github.com/u8sand/Baka-MPlayer/
Bomi 强大易用的多媒体播放器(Qt5) https://bomi-player.github.io/
GNOME MPV 简单的 mpv 前端(GTK+3) https://github.com/celluloid-player/celluloid
SMPlayer Qt 写的拥有额外特性的多媒体播放器(CSS 主题、YouTube 整合等)(Qt5) https://www.smplayer.info/
Deepin Movie 由深度开发的全功能视频播放器,支持多种视频格式的本地和流媒体播放(Qt5) https://github.com/linuxdeepin/deepin-movie-reborn

SMPlayer 挺好用的,支持大部分的音视频文件。可进行音频轨道切换,允许亮度、对比度、色调等调节,并按照倍速、4倍速等多种速度回放,还可进行音频和字幕延迟调整以实现它们之间的同步。

和 VLC 很像,有木有!!

安装 mpv

mpv 是一个常用应用,已加入到了大多数 Linux 发行版的默认仓库中。

以 Ubuntu 为例,执行以下命令便可以快速安装 mpv:

$ sudo apt update
$ sudo apt install mpv
$ sudo apt install libmpv-dev

完成之后,可通过以下命令查看 mpv 的帮助信息:

$ mpv --help

如果要查看其支持的选项,可执行以下命令:

$ mpv --list-options

选项有很多,总共 400 多个。所以千万不要小看它,尽管 mpv 播放器只有极简的界面,但它的功能超级强大,其主要能力都来自于命令行。

使用 mvp 播放器

打开 mpv 播放器,拖放一个本地媒体文件到窗口中,即可自动进行播放。

注意: 界面没有任何菜单项,只能通过拖放媒体文件来操作。

可以看到,mpv 的界面很简洁,只有一个控制面板(在鼠标移动到播放窗口上才会显示),该面板上有播放/暂停、快进/快退以及全屏等功能。

若要播放在线视频,只能使用命令行模式:
$ mpv http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4

注意:mpv 的默认大小,取决于所播放的视频画质。比如一个 240p 的视频,播放窗口会比较小,而在全高清显示器上播放 1080p 视频时,几乎会占满整个屏幕。

基于 libmvp 二次开发

如果想基于 libmpv 进行二次开发 ,可以从官方提供的 demo 着手https://github.com/mpv-player/mpv-examples),几乎各种语言版本的都有,例如:C#、Java、Qt、SDL、wxWidgets ...... 当然,也可参考上面提到的第三方应用。

下面以 Qt 为例,编写一个简单的 mpv 播放器:

源码如下:

#include <QApplication>
#include <QWidget>
#include <QtDebug>

#include <mpv/client.h>

static inline void checkError(int status)
{
    if (status < 0) {
        qWarning() << QString("mpv error: %1").arg(mpv_error_string(status));
        exit(1);
    }
}

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);

    /*
     * QApplication 设置了 setlocale(LC_ALL, ""),
     * 但 mpv 需要将 LC_NUMERIC 设置为 "C",所以得改回来。
    */
    std::setlocale(LC_NUMERIC, "C");

    // 创建一个 Qt 界面
    QWidget widget;
    widget.setMinimumSize(640, 480);

    // 创建 mpv 实例
    mpv_handle *mpv = mpv_create();
    if (mpv == nullptr) {
        qWarning() << "failed creating context";
        return 1;
    }

    // 设置播放句柄
    WId wid = widget.winId();
    mpv_set_property(mpv, "wid", MPV_FORMAT_INT64, &wid);

    /*
     * 启用默认的按键绑定,这样就可以与播放器交互了
     * 例如:{ 和 } 倍速播放、P/SPACE 键暂停/恢复
     * 通常使用 mpv 作为后台的播放器,会实现自己的按键绑定
    */
    mpv_set_option_string(mpv, "input-default-bindings", "yes");

    // 启用 X11 窗口的键盘输入
    mpv_set_option_string(mpv, "input-vo-keyboard", "yes");

    // 设置音量
    double volume = 60.0;
    checkError(mpv_set_property(mpv, "volume", MPV_FORMAT_DOUBLE, &volume));

    // 初始化 mpv 实例
    checkError(mpv_initialize(mpv));

    // 启用日志(级别为 Info 或更高)
    checkError(mpv_request_log_messages(mpv, "info"));

    // 播放文件
    QString fileName = "/home/waleon/video/big_buck_bunny.mkv";
    QByteArray file = fileName.toUtf8();
    const char *args[] = {"loadfile", file.constData(), Q_NULLPTR};
    mpv_command_async(mpv, 0, args);

    // 显示界面
    widget.show();

    int ret = app.exec();

    // 释放 mpv 实例
    mpv_terminate_destroy(mpv);

    return ret;
}

是不是很简单,只要几十行代码就搞定了!

开源前哨 日常分享热门、有趣和实用的开源项目。参与维护 10万+ Star 的开源技术资源库,包括:Python、Java、C/C++、Go、JS、CSS、Node.js、PHP、.NET 等。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容