用mpv实现多视频同步播放

本文方法使用的场景是多个视频在同一个屏幕上同步播放。这在对比多个比较相似的视频时非常有用。比如:在研究视频插帧方法时,对比同一个视频不同帧率的流畅度。
mpv是一款免费的视频播放软件,它具有强大的命令行控制功能。本文介绍了如何通过命令行,使用mpv实现多个视频的同步播放。步骤如下:

1. 下载安装mpv

从这里下载https://mpv.io/installation/,Windows平台的可以直接选第一个下载地址sourceforge平台的安装包。
当然,也可以直接下载安装SVP,里面自带有mpv。
安装好后记得将mpv.exe的路径加到系统环境变量中。

2. 两个视频同步播放

打开命令行,输入下面的命令:

mpv.exe a.mp4 --external-file=b.mp4 --lavfi-complex="[vid1] [vid2] hstack [vo]" --loop

其中,要将a.mp4b.mp4替换成自己的视频名字,分别会显示在左边和右边。最后面的--loop表示循环播放。效果如下:

在这里插入图片描述

3. 四个视频同步播放

打开命令行,输入下面的命令:

mpv.exe a.mp4 --external-file=b.mp4 --external-file=c.mp4 --external-file=d.mp4 --lavfi-complex="[vid1] [vid2] hstack [t1];[vid3] [vid4] hstack [t2]; [t1] [t2] vstack [vo]" --loop

效果如下:

在这里插入图片描述

4. mpv常用命令

  • { },按2的倍数调节播放速度
  • , .,前进或者后退一帧
  • space,暂停或播放

5. 批处理

可以将命令保存到.bat文件方便经常使用,以播放两个视频为例:

start mpv.exe a.mp4 --external-file=b.mp4 --lavfi-complex="[vid1] [vid2] hstack [vo]" --loop
pause

6. 【可选】解释一下:–lavfi-complex

该命令设置了一个复杂的libavfilter的filter,然后构建出一个可以输入多个视频或音频轨道的图(graph),这个图输出只有一个音频或(和)一个视频轨道。规则如下:

  • 名为aidN这样的标签指定了N个音轨输入,例如aid1
  • 名为vidN这样的标签指定了N个视频轨道输入,
  • 名为ao的标签指定了声音输出
  • 名为vo的标签指定了视频输出

注意输入的视频大小需要一致,如果不一致会报错。当然,也可以使用scale filter缩放成相同大小。这里不做过多介绍,有兴趣可以参考官方文档。

7. 参考

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Qt中,我们可以使用mpv库来实现视频倒退功能。首先,确保已经正确安装并集成了mpv库到Qt项目中。 1. 在Qt项目中创建一个QObject派生的类,用于处理mpv相关操作。 ```cpp class MpvPlayer : public QObject { Q_OBJECT public: explicit MpvPlayer(QObject *parent = nullptr); public slots: void initialize(); // 初始化mpv void loadVideo(QString filePath); // 加载视频文件 void startReverse(); // 开始倒退 void stopReverse(); // 停止倒退 private: void reverseVideo(); // 倒退视频 mpv_handle *mpv; // mpv句柄 QTimer *reverseTimer; // 用于定时倒退 }; ``` 2. 在实现文件中,首先创建一个mpv的实例,并初始化。 ```cpp #include <QTimer> MpvPlayer::MpvPlayer(QObject *parent) : QObject(parent) { mpv = mpv_create(); if (!mpv) { // 初始化mpv失败处理 } } void MpvPlayer::initialize() { // 设置mpv选项,例如窗口ID等 int32_t res = mpv_initialize(mpv); if (res < 0) { // 初始化mpv失败处理 } } ``` 3. 定义倒退视频的函数,并使用QTimer定时执行。 ```cpp void MpvPlayer::startReverse() { reverseTimer = new QTimer(this); connect(reverseTimer, &QTimer::timeout, this, &MpvPlayer::reverseVideo); reverseTimer->start(40); // 每40毫秒倒退一次,可根据需要调整 } void MpvPlayer::stopReverse() { reverseTimer->stop(); reverseTimer->deleteLater(); } void MpvPlayer::reverseVideo() { mpv_command(mpv, reinterpret_cast<const char **>("seek", "-10", "relative+", "exact")); // 根据需要调整倒退时间,此处倒退10秒 } ``` 4. 在其他地方使用MpvPlayer类来实现倒退视频的功能。 ```cpp MpvPlayer player; player.initialize(); // 初始化 player.loadVideo("video.mp4"); // 加载视频文件 player.startReverse(); // 开始倒退 // 等待倒退完成 player.stopReverse(); // 停止倒退 ``` 通过以上步骤,我们可以实现Qt中使用mpv库来倒退视频的功能。注意在实际项目中可能需要处理更多细节和异常情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

superbin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值