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 的應用

mpv 的用戶羣很廣,這裏有個第三方應用列表(https://github.com/mpv-player/mpv/wiki/Applications-using-mpv),簡單列舉幾個:

dBIwmH

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 等

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/l_Kzuqi4wf1945owRLyOgQ