void Widget::on_choose_btn_clicked() { QString path = QFileDialog::getOpenFileName(nullptr, "Open Video", QDir::homePath(), "Videos (*.avi *.mp4 *.wmv)"); this->player->setMedia(QMediaContent(QUrl(path))); QVideoWidget *video_widget = new QVideoWidget(this); this->player->setVideoOutput(video_widget); QAbstractVideoSurface *surface = video_widget->videoSurface(); QLabel *label = new QLabel(this); label->setFixedSize(640, 480); // 设置标签大小 label->show(); QMetaObject::invokeMethod(this->player, "play"); // 异步播放视频 connect(surface, &QAbstractVideoSurface::frameChanged, [label, surface]() { QVideoFrame frame = surface->currentFrame(); if (!frame.isValid()) { return; } QImage image = QVideoFrameToImage(frame); QPixmap pixmap = QPixmap::fromImage(image); label->setPixmap(pixmap); }); } QImage Widget::QVideoFrameToImage(QVideoFrame &frame) { if (frame.map(QAbstractVideoBuffer::ReadOnly)) { QImage::Format format = QVideoFrame::imageFormatFromPixelFormat(frame.pixelFormat()); QImage image(frame.bits(), frame.width(), frame.height(), frame.bytesPerLine(), format); image = image.copy(); // 强制深拷贝 frame.unmap(); return image; } return QImage(); }
时间: 2023-06-26 16:05:24 浏览: 212
这是一个基于 Qt 的视频播放器的槽函数,当用户点击选择按钮时,会弹出文件选择对话框,让用户选择视频文件。选好后,将视频文件的路径设置给 QMediaPlayer 对象,并设置 QVideoWidget 作为视频播放输出设备,然后异步播放视频。同时,还连接了 QAbstractVideoSurface::frameChanged 信号,每当视频帧发生变化时,会调用 QVideoFrameToImage 函数将视频帧转换为 QImage 对象,并显示到标签上。
QVideoFrameToImage 函数会将 QVideoFrame 对象转换为 QImage 对象,首先通过 QAbstractVideoBuffer::map 函数将帧数据映射到内存中,并根据像素格式创建 QImage 对象,然后将帧数据拷贝到 QImage 对象中,最后通过 QAbstractVideoBuffer::unmap 函数解除映射。若映射失败,则返回一个空的 QImage 对象。
相关问题
//选择视频 void Widget::on_choose_btn_clicked() { //获取视频的完整路径 // QString str="D:\Qt\Qt5.12.12\QT\QT_project\output.avi"; //QString path = "D:\Qt\Qt5.12.12\QT\QT_project\output.avi"; QString path = QFileDialog::getOpenFileName(nullptr, "Open Image", QDir::homePath(), "Images (*.avi *.mp4 *.wmv)"); //加载资源文件 this->player->setMedia(QMediaContent(QUrl(path))); //设置画面的输出 this->player->setVideoOutput(video_widget); // 将视频画面输出到pictrue_lab } //开始播放 void Widget::on_start_play_btn_clicked() { //播放视频 this->player->play(); //播放滑块的初始值 this->ui->slider->setValue(0); //启动定时器 this->timer->start(1000); }点击播放不显示画面
可能是因为视频播放器没有正确的配置。请尝试以下步骤:
1. 确认视频文件的路径是否正确,可以在打开文件对话框中选择视频文件并获取其完整路径。
2. 确认视频文件的格式是否被支持,可以查看视频文件的扩展名是否在支持的列表中(如 .avi, .mp4, .wmv)。
3. 确认视频播放器的输出是否正确设置。可以尝试将视频画面输出到其他窗口或控件上,比如主窗口或一个 QLabel 控件上,看是否能够正常显示。
4. 确认视频播放器相关的库是否正确导入。比如如果是使用 Qt 自带的 QMediaPlayer 组件,需要在项目文件中添加对 multimedia 模块的依赖。
如果以上步骤都无法解决问题,请提供更多代码和错误信息,以便更好地定位问题所在。
void Widget::on_choose_btn_clicked() { //获取视频的完整路径 // QString str="D:\Qt\Qt5.12.12\QT\QT_project\output.avi"; //QString path = "D:\Qt\Qt5.12.12\QT\QT_project\output.avi"; QString path = QFileDialog::getOpenFileName(nullptr, "Open Image", QDir::homePath(), "Images (*.avi *.mp4 *.wmv)"); //加载资源文件 this->player->setMedia(QMediaContent(QUrl(path))); //设置画面的输出 this->player->setVideoOutput(video_widget); 将视频画面输出到QLabel标签中
这段代码的作用是打开一个文件选择对话框,让用户选择一个视频文件(支持的格式为.avi、.mp4、.wmv),然后将选中的视频文件加载到QMediaPlayer对象中,最后将视频画面输出到一个QLabel标签中。
其中,第一行代码是响应“选择”按钮的槽函数,当用户点击该按钮时会执行该函数;第二行代码用于手动指定视频文件的路径,但是在实际应用中,我们一般使用QFileDialog类来弹出文件选择对话框,让用户选择文件;第三行代码就是弹出文件选择对话框的代码,其中第一个参数为父窗口指针,可以传入nullptr表示没有父窗口,第二个参数为对话框标题,第三个参数为对话框默认打开的路径,第四个参数为过滤器,用于限制用户只能选择指定格式的文件;第四行代码将选中的视频文件加载到QMediaPlayer对象中,第五行代码将视频画面输出到指定的QLabel标签中。
阅读全文