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 官網:https://mpv.io
-
mpv GitHub:https://github.com/mpv-player/mpv
-
mpv 安裝:https://mpv.io/installation
-
mpv 使用手冊:https://mpv.io/manual/master
-
mpv 維基百科:https://github.com/mpv-player/mpv/wiki
-
mpv 常見問題:https://github.com/mpv-player/mpv/wiki/FAQ
其主要特性有:
-
腳本處理
強大的腳本能力幾乎可以讓播放器做任何事情,Wiki 上有大量用戶腳本可供選擇。(https://github.com/mpv-player/mpv/wiki/User-Scripts)
-
屏幕控制器
雖然 mpv 力求簡約,並沒有提供真正的 GUI,但它在視頻頂部有一個小控制器,用於基本控制。
-
高品質視頻輸出
mpv 具有基於 OpenGL、Vulkan 和 D3D11 的視頻輸出,能夠支持視頻發燒友喜愛的許多功能,例如:使用流行的高質量算法進行視頻縮放、色彩管理、幀時序、插值、HDR 等。
-
GPU 視頻解碼
mpv 可以利用所有平臺上的大多數硬件解碼 API,硬件解碼可在運行時按需啓用。
-
可嵌入
mpv 從頭開始設計了一個簡單的 C API,使其可以作爲一個庫使用,並便於和其他應用輕鬆集成。
-
積極開發
mpv 正在積極開發中,專注於代碼重構和清理以及添加功能。想要一個功能特性?點這兒吧!(https://github.com/mpv-player/mpv/issues)
基於 mpv 的應用
mpv 的用戶羣很廣,這裏有個第三方應用列表
(https://github.com/mpv-player/mpv/wiki/Applications-using-mpv),簡單列舉幾個:
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