将 this->player->setVideoOutput(this->video_widget);输出到ui->pictrue_lab->show();
时间: 2024-05-16 09:16:57 浏览: 116
这两个操作是不同的,不能直接替换。
语句"this->player->setVideoOutput(this->video_widget);"是将视频播放器的输出窗口设置为this->video_widget,也就是将视频显示在this->video_widget上。
而语句"ui->picture_lab->show();"是显示ui界面上名为"picture_lab"的控件,它是一个 QLabel 控件,用于显示图片,不是视频播放器的输出窗口。
如果要将视频显示在 QLabel 上,可以考虑将视频帧转换成 QImage 格式,然后使用 QLabel 的 setPixmap() 函数来显示图片。具体实现方法可以参考以下代码:
```cpp
QImage img = QImage(frame.data, frame.cols, frame.rows, QImage::Format_RGB888).rgbSwapped();
ui->picture_lab->setPixmap(QPixmap::fromImage(img));
ui->picture_lab->show();
```
其中,frame 是从视频中读取到的帧,数据格式为 RGB888。第一行将帧数据转换为 QImage 对象,第二行将 QImage 对象转换为 QPixmap 对象并设置到 QLabel 上,第三行显示 QLabel 控件。
相关问题
error: no matching function for call to 'QMediaPlayer::setVideoOutput(QLabel*&)' this->player->setVideoOutput(this->ui->pictrue_lab);
这个错误是因为 `QMediaPlayer` 的 `setVideoOutput` 函数需要一个 `QVideoWidget` 或者 `QGraphicsVideoItem` 类型的参数,但你传递的是一个 `QLabel` 类型的参数。你可以使用 `QVideoWidget` 类型的控件作为视频输出或者使用 `QGraphicsVideoItem` 类型的图形项。如果你想使用 `QLabel` 作为视频输出,你可以将视频帧作为 `QImage` 对象绘制在 `QLabel` 上。
以下是使用 `QVideoWidget` 的示例代码:
```cpp
QVideoWidget *videoWidget = new QVideoWidget;
this->player->setVideoOutput(videoWidget);
ui->verticalLayout->addWidget(videoWidget);
```
以下是使用 `QLabel` 的示例代码:
```cpp
QImage image = frame.image(); // 获取视频帧
QPixmap pixmap = QPixmap::fromImage(image);
this->ui->picture_lab->setPixmap(pixmap);
```
connect(this->player, &QMediaPlayer::videoFrameChanged, [=]() { QImage image = QImage(this->player-->surfaceFormat().size(), QImage::Format_ARGB32); QPainter painter(&image); this->player->videoSurface()->surfaceFormat().videoFrameToPixmap(this->player->currentVideoFrame()).toImage().scaled(image.size()).swap(image); painter.end(); ui->pictrue_lab->setPixmap(QPixmap::fromImage(image)); });error: 'videoFrameChanged' is not a member of 'QMediaPlayer' connect(this->player, &QMediaPlayer::videoFrameChanged, [=]() {
看起来这个错误是因为 QMediaPlayer 没有名为 videoFrameChanged 的成员。我猜测你可能想要使用 QAbstractVideoSurface::videoFrameChanged 信号,这是在视频帧更改时发出的信号。你需要创建一个自定义的 QAbstractVideoSurface 子类,并将其设置为 QMediaPlayer 的视频输出面。然后,你可以连接 QAbstractVideoSurface::videoFrameChanged 信号到一个槽函数,该函数会在视频帧更改时被调用,从而更新显示的图像。以下是一个基本的示例:
```
class VideoSurface : public QAbstractVideoSurface {
Q_OBJECT
public:
VideoSurface(QObject *parent = nullptr) : QAbstractVideoSurface(parent) {}
QList<QVideoFrame::PixelFormat> supportedPixelFormats(QAbstractVideoBuffer::HandleType handleType) const override {
Q_UNUSED(handleType);
return QList<QVideoFrame::PixelFormat>() << QVideoFrame::Format_ARGB32;
}
bool present(const QVideoFrame &frame) override {
if (frame.isValid()) {
QImage image(frame.bits(), frame.width(), frame.height(), frame.bytesPerLine(), QVideoFrame::imageFormatFromPixelFormat(frame.pixelFormat()));
emit videoFrameChanged(image);
return true;
}
return false;
}
signals:
void videoFrameChanged(const QImage &image);
};
```
然后在你的代码中使用该类:
```
VideoSurface *surface = new VideoSurface(this);
player->setVideoOutput(surface);
connect(surface, &VideoSurface::videoFrameChanged, [=](const QImage &image) {
ui->pictrue_lab->setPixmap(QPixmap::fromImage(image));
});
```
这样每当视频帧更改时,就会发出 VideoSurface::videoFrameChanged 信号,并将新图像传递给槽函数来更新 QLabel 中的图像。
阅读全文