C++11 Qt5分离视频小部件

C++11 Qt5分离视频小部件,c++11,qt5,C++11,Qt5,我试图找到一种方法来创建视频小部件并将其分为两部分,以便处理立体声视频: 第一个将播放视频的一部分 第二个将播放视频的另一部分 我目前不知道从哪里开始。我正在搜索qt多媒体模块,但我不知道如何实现这种行为 有人有主意吗 我还想构建两个视频小部件并将它们运行到两个线程中,但它们必须完全同步。其想法是使用ffmpeg将视频切割成两个,并将每个视频影响到一个视频小部件。然而,我认为实现这一点并不容易(每个帧都必须同步) 感谢您的回答。如果您的立体声视频数据是以某种特殊格式编码的,需要在编解码器/容

我试图找到一种方法来创建视频小部件并将其分为两部分,以便处理立体声视频:

  • 第一个将播放视频的一部分
  • 第二个将播放视频的另一部分
我目前不知道从哪里开始。我正在搜索qt多媒体模块,但我不知道如何实现这种行为

有人有主意吗

我还想构建两个视频小部件并将它们运行到两个线程中,但它们必须完全同步。其想法是使用
ffmpeg
将视频切割成两个,并将每个视频影响到一个视频小部件。然而,我认为实现这一点并不容易(每个帧都必须同步)


感谢您的回答。

如果您的立体声视频数据是以某种特殊格式编码的,需要在编解码器/容器格式上解码,我认为Qt中的QMultiMedia内容对于这种用例来说太基本了,因为它不允许调谐到多流传输容器的“一个流”

但是,如果在“正常”视频流中编码的每帧图像中有交替扫描线、交替帧,甚至“并排”或“上下”图像,那么您所要做的就是在解码帧时截取帧,并将帧分成两个图像,然后显示它们

这绝对是可行的

但是,根据您的视频源甚至平台,您可能需要选择不同的方法。例如,如果您使用QCamera作为视频源,您可以使用QVideoProbeQViewFinder方法。在不同的平台上,这些方法的可用性各不相同,因此首先要确定这一点

如果您正在使用QMediaPlayer解码视频,那么QVideoProbe可能是一个不错的选择

要了解如何使用不同的方法抓取帧,请查看主题中的一些示例

下面是使用
QVideoProbe
方法的一个简短示例:

videoProbe = new QVideoProbe(this);
// Here, myVideoSource is a camera or other media object compatible with QVideoProbe 
if (videoProbe->setSource(myVideoSource)) {
    // Probing succeeded, videoProbe->isValid() should be true.
    connect(videoProbe, SIGNAL(videoFrameProbed(QVideoFrame)),
            this, SLOT(processIndividualFrame(QVideoFrame)));
}

// Cameras need to be started. Do whatever your video source requires to start here
myVideoSource->start();

// [...]

// This is the slot where the magic happens (separating each single frame from video into two `QImage`s and posting the result to two `QLabel`s for example):

void processIndividualFrame(QVideoFrame &frame){
    QVideoFrame cloneFrame(frame);
    cloneFrame.map(QAbstractVideoBuffer::ReadOnly);
    const QImage image(cloneFrame.bits(),
                           cloneFrame.width(),
                           cloneFrame.height(),
QVideoFrame::imageFormatFromPixelFormat(cloneFrame.pixelFormat()));
    cloneFrame.unmap();
    QSize sz = image.size();
    const int w = sz.width();
    const int h2 = sz.height() / 2;
    // Assumes "over-and-under" placement of stereo data for simplicity.
    // If you instead need access to individual scanlines, please have a look at [this][2].
    QImage leftImage = image.copy(0, 0,   w, h2);
    QImage rightImage = image.copy(0, h2, w, h2);
    // Assumes you have a UI set up with labels named as below, and with sizing / layout set up correctly
    ui->myLeftEyeLabel.setPixmap(QPixmap::fromImage(leftImage));
    ui->myRightEyeLabel.setPixmap(QPixmap::fromImage(leftImage));
    // Should play back rather smooth since they are effectively updated simultaneously
}
我希望这是有用的


BIG-FAT警告:只有部分代码已经过测试甚至编译

你找到这个了吗?你能解释一下数据的形状吗?一个大的解压字符缓冲区?像素格式?等等,不完全,我还在试验。但我将使用opencv。我正在建造一些东西。我将张贴代码一旦完成(如果它的工作)。