setlocale(LC_NUMERIC, "C");//必需要有,不然编译不过
mpv_handle *mpv = mpv_create();//创建实例
WId wid=ui->video->winId();
mpv_set_option(mpv,"wid",MPV_FORMAT_INT64,&wid);//设置播放器在哪个控件上显示
// Enable default bindings, because we're lazy. Normally, a player using
// mpv as backend would implement its own key bindings.
mpv_set_option_string(mpv, "input-default-bindings", "no");//设置默认输入键绑定
// // Enable keyboard input on the X11 window. For the messy details, see
// // --input-vo-keyboard on the manpage.
mpv_set_option_string(mpv, "input-vo-keyboard", "no");//设置默认键盘输入键绑定
mpv_set_option_string(mpv, "loop", "yes");//设置播放时循环
if (mpv_initialize(mpv) < 0)//初始化mpv
throw std::runtime_error("mpv failed to initialize");
const char *args[] = {"loadfile", filename.toUtf8().data(), NULL};
mpv_command_async(mpv, 0, args);//播放视频文件
//视频跳转到100s处
double f = 100.0;
QString tmp = QString("+%1").arg(f);
// const char *args[] = {"seek", tmp.toUtf8().constData(), "absolute", NULL};
// const char *args[] = {"seek", tmp.toUtf8().constData(), NULL};
// mpv_command_async(mpv, MPV_REPLY_COMMAND, args);//no work
mpv_set_property_async(mpv, MPV_REPLY_COMMAND, "time-pos", MPV_FORMAT_DOUBLE, &f);//work
我看别的开源播放器使用上面的跳转是可以的,我自己写的例子就不行,而使用第二种time-pos方式却可以,搞不懂。且不能在视频播放时就立马设置,要等一会设置才能生效。
设置暂停
int f = 1;
paused = !paused;
if(!paused)
{
f = 0;
}
mpv_set_property_async(mpv, 0, "pause", MPV_FORMAT_FLAG, &f);
设置静音
int f = 1;
mpv_set_property_async(mpv, MPV_REPLY_PROPERTY, "mute", MPV_FORMAT_FLAG, &f);
取消静音
int f = 0;
mpv_set_property_async(mpv, MPV_REPLY_PROPERTY, "mute", MPV_FORMAT_FLAG, &f);
设置音量
double f = value;
mpv_set_property_async(mpv, MPV_REPLY_PROPERTY, "volume", MPV_FORMAT_DOUBLE, &f);
qt使用libmpv如何捕获文件播放结束信号
初始化播放器时设置回调函数
mpv_set_wakeup_callback(mpv,callBack,this);//可以理解为有任何事件发生时都会触发
在回调函数中
static void callBack(void *ctx)
{
// qDebug() << " -----------callBack";
MpvPlayer *mpvhandler = (MpvPlayer*)ctx;
QCoreApplication::postEvent(mpvhandler, new QEvent(QEvent::User));//构建一个事件发送到事件循环中
}
bool MpvPlayer::event(QEvent *event1)
{
if(event1->type() != QEvent::User)
{
return true;
}
while(mpv)//这里循环捕获事件,理解是可能一次发出很多事件信号,
{
mpv_event *event = mpv_wait_event(mpv,0);
if(event == NULL ||
event->event_id == MPV_EVENT_NONE)
{
qDebug() << "---------------------------";
return true;
}
qDebug() << "id " << event->event_id;
switch (event->event_id)
{
case MPV_EVENT_PROPERTY_CHANGE: {
mpv_event_property *property = (mpv_event_property *)event->data;
QString propertyName = property->name;
mpv_format propertyFormat = property->format;
if (propertyName == "duration") {
//文件总长度
if (propertyFormat == MPV_FORMAT_DOUBLE) {
double time = *(double *)property->data;
uint length = time * 1000;
// thread->doEvent(1, QVariantList() << length);
qDebug() << "文件总长: " << length;
}
} else if (propertyName == "time-pos") {
//当前播放进度
if (propertyFormat == MPV_FORMAT_DOUBLE) {
double time = *(double *)property->data;
uint position = time * 1000;
// thread->doEvent(2, QVariantList() << position);
qDebug() << "当前时间: " << position;
}
} else if(propertyName == "volume")
{
qDebug() << "volume: changed ";
}
else
{
// qDebug() << TIMEMS << propertyName;
if (propertyFormat == MPV_FORMAT_NODE)
{
#if 0
QVariant data = qtmpv::node_to_variant((mpv_node *)property->data);
QJsonDocument json = QJsonDocument::fromVariant(data);
qDebug() << TIMEMS << json.toJson().data();
#endif
}
}
break;
}
//文件播放结束
case MPV_EVENT_END_FILE: {
// qDebug() << "play end";
emit playFileEnd(filePath);
break;
}
default:
break;
}
}
return true;
}
顺便记录下vlc开发捕获文件播放结束
先是设置回调
libvlc_event_manager_t *p_event_manager;
libvlc_event_type_t event_type;
// 获取事件管理器并设置事件回调
p_event_manager = libvlc_media_player_event_manager(mp);
event_type = libvlc_MediaPlayerEndReached; // 视频播放结束事件类型
libvlc_event_attach(p_event_manager, event_type, cb_player_end, this);
回调方法
void cb_player_end(const libvlc_event_t * p_event,void * user_data)
{
VlcStreamer *stream = (VlcStreamer *)user_data;
stream->PlayReachEnd();//这里可以自己处理
}