彻底改版2.0
This commit is contained in:
209
video/plaympv/mpv/mpv.cpp
Normal file
209
video/plaympv/mpv/mpv.cpp
Normal file
@@ -0,0 +1,209 @@
|
||||
#include "mpv.h"
|
||||
#include "mpvtool.h"
|
||||
|
||||
MpvThread::MpvThread(QObject *parent) : QThread(parent)
|
||||
{
|
||||
setObjectName("MpvThread");
|
||||
|
||||
stopped = false;
|
||||
isPlay = false;
|
||||
|
||||
url = "rtsp://192.168.1.200:554/1";
|
||||
|
||||
mpvPlayer = NULL;
|
||||
|
||||
static bool isInit = false;
|
||||
if (!isInit) {
|
||||
isInit = true;
|
||||
qDebug() << TIMEMS << "init mpv lib ok" << " version:" << MPV_CLIENT_API_VERSION;
|
||||
}
|
||||
}
|
||||
|
||||
void MpvThread::run()
|
||||
{
|
||||
while (!stopped) {
|
||||
msleep(1);
|
||||
}
|
||||
|
||||
//线程结束后释放资源
|
||||
free();
|
||||
stopped = false;
|
||||
isPlay = false;
|
||||
//qDebug() << TIMEMS << "stop mpv thread";
|
||||
}
|
||||
|
||||
void MpvThread::setUrl(const QString &url)
|
||||
{
|
||||
this->url = url;
|
||||
}
|
||||
|
||||
QVariant MpvThread::getValue(const QString &name)
|
||||
{
|
||||
if (mpvPlayer != NULL) {
|
||||
return qtmpv::get_property(mpvPlayer, name);
|
||||
} else {
|
||||
return QVariant();
|
||||
}
|
||||
}
|
||||
|
||||
int MpvThread::setValue(const QString &name, const QVariant &value)
|
||||
{
|
||||
if (mpvPlayer != NULL) {
|
||||
return qtmpv::set_property(mpvPlayer, name, value);
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
int MpvThread::setOption(const QString &name, const QVariant &value)
|
||||
{
|
||||
if (mpvPlayer != NULL) {
|
||||
return qtmpv::set_option_variant(mpvPlayer, name, value);
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
QVariant MpvThread::command(const QVariant &args)
|
||||
{
|
||||
if (mpvPlayer != NULL) {
|
||||
return qtmpv::command_variant(mpvPlayer, args);
|
||||
}
|
||||
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
bool MpvThread::init()
|
||||
{
|
||||
//创建实例
|
||||
if (mpvPlayer == NULL) {
|
||||
mpvPlayer = mpv_create();
|
||||
}
|
||||
|
||||
MpvWidget *widget = (MpvWidget *)this->parent();
|
||||
HWND wid = (HWND)widget->winId();
|
||||
mpv_set_option(mpvPlayer, "wid", MPV_FORMAT_INT64, &wid);
|
||||
|
||||
//请求级别日志消息
|
||||
mpv_request_log_messages(mpvPlayer, "info");
|
||||
//启用默认绑定
|
||||
setValue("input-default-bindings", "yes");
|
||||
//启用键盘输入
|
||||
setValue("input-vo-keyboard", "yes");
|
||||
|
||||
//设置控制台打印
|
||||
setOption("terminal", "false");
|
||||
//设置消息级别
|
||||
setOption("msg-level", "all=v");
|
||||
|
||||
//设置硬件加速 none auto any d3d11va dxva2
|
||||
setOption("hwdec", "d3d11va");
|
||||
//设置通信协议 tcp udp
|
||||
setOption("rtsp-transport", "tcp");
|
||||
//设置网络超时时间 单位秒
|
||||
setOption("network-timeout", 3);
|
||||
|
||||
//初始化实例
|
||||
if (mpv_initialize(mpvPlayer) < 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
QByteArray data = url.toUtf8();
|
||||
const char *args[] = {"loadfile", data.data(), NULL};
|
||||
if (mpv_command_async(mpvPlayer, 0, args) < 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
//qDebug() << TIMEMS << "init mpv finsh";
|
||||
return true;
|
||||
}
|
||||
|
||||
void MpvThread::play()
|
||||
{
|
||||
isPlay = true;
|
||||
this->init();
|
||||
}
|
||||
|
||||
void MpvThread::pause()
|
||||
{
|
||||
setValue("pause", "yes");
|
||||
}
|
||||
|
||||
void MpvThread::next()
|
||||
{
|
||||
setValue("pause", "no");
|
||||
}
|
||||
|
||||
void MpvThread::free()
|
||||
{
|
||||
if (mpvPlayer != NULL) {
|
||||
mpv_terminate_destroy(mpvPlayer);
|
||||
mpvPlayer = NULL;
|
||||
}
|
||||
|
||||
//qDebug() << TIMEMS << "close mpv ok";
|
||||
}
|
||||
|
||||
void MpvThread::stop()
|
||||
{
|
||||
stopped = true;
|
||||
}
|
||||
|
||||
//实时视频显示窗体类
|
||||
MpvWidget::MpvWidget(QWidget *parent) : QWidget(parent)
|
||||
{
|
||||
thread = new MpvThread(this);
|
||||
}
|
||||
|
||||
MpvWidget::~MpvWidget()
|
||||
{
|
||||
close();
|
||||
}
|
||||
|
||||
void MpvWidget::setUrl(const QString &url)
|
||||
{
|
||||
thread->setUrl(url);
|
||||
}
|
||||
|
||||
void MpvWidget::open()
|
||||
{
|
||||
//qDebug() << TIMEMS << "open video" << objectName();
|
||||
clear();
|
||||
|
||||
thread->play();
|
||||
thread->start();
|
||||
}
|
||||
|
||||
void MpvWidget::pause()
|
||||
{
|
||||
thread->pause();
|
||||
}
|
||||
|
||||
void MpvWidget::next()
|
||||
{
|
||||
thread->next();
|
||||
}
|
||||
|
||||
void MpvWidget::close()
|
||||
{
|
||||
//qDebug() << TIMEMS << "close video" << objectName();
|
||||
if (thread->isRunning()) {
|
||||
thread->stop();
|
||||
thread->quit();
|
||||
thread->wait(3000);
|
||||
}
|
||||
|
||||
QTimer::singleShot(5, this, SLOT(clear()));
|
||||
}
|
||||
|
||||
void MpvWidget::restart()
|
||||
{
|
||||
//qDebug() << TIMEMS << "restart video" << objectName();
|
||||
close();
|
||||
QTimer::singleShot(10, this, SLOT(open()));
|
||||
}
|
||||
|
||||
void MpvWidget::clear()
|
||||
{
|
||||
update();
|
||||
}
|
||||
Reference in New Issue
Block a user