代码之家  ›  专栏  ›  技术社区  ›  PPP

如何将解码后的缓冲区从ffmpeg映射到QVideoFrame?

  •  0
  • PPP  · 技术社区  · 7 年前

    QFrame 所以我可以把这个框架放进 QAbstractVideoBuffer QMediaPlayer .

    这是视频界面的代码。根据QT的文档,我只需要实现这两个函数:构造函数和 bool present ,它将帧处理为 QVideoFrame 命名 frame

    QList<QVideoFrame::PixelFormat> VideoSurface::supportedPixelFormats(QAbstractVideoBuffer::HandleType handleType = QAbstractVideoBuffer::NoHandle) const
    {
        Q_UNUSED(handleType);
    
        // Return the formats you will support
        return QList<QVideoFrame::PixelFormat>() << QVideoFrame::Format_YUV420P;
    }
    
    bool VideoSurface::present(const QVideoFrame &frame)
    {
        //Q_UNUSED(frame);
        std:: cout << "VideoSurface processing 1 frame " << std::endl; 
    
        QVideoFrame frametodraw(frame);
    
        if(!frametodraw.map(QAbstractVideoBuffer::ReadOnly))
        {
            setError(ResourceError);
            return false;
        } 
        // Handle the frame and do your processing
        const size_t bufferSize = 398304;
        uint8_t frameBuffer[bufferSize];
        this->mediaStream->receiveFrame(frameBuffer, bufferSize);
        //Frame is now in frameBuffer, we must put into frametodraw, I guess
        // ------------What should I do here?-------------
        frametodraw.unmap();
        return true;
    }
    

    this->mediaStream.decodeFrame(frameBuffer, bufferSize) frameBuffer 以YUV420P格式。

    我的想法是用 map frametodraw.bits() 函数并尝试将此指针指向另一个对象,但我不认为这是正确的方法。我想我应该复制 帧缓冲区

    所以。。。如何将缓冲区映射到 QVideoFrame视频帧 框架

    我也注意到,当我把 VideoSurface , present 从不打电话。我觉得有点不对劲,即使是 player->play()

    我也没有内部解码图像的大小 ,我只有它的总尺寸。我认为这也应该是个问题。

    我也注意到 不是可显示的元素。。。那么哪个小部件将显示我的视频?在我看来这很重要。

    0 回复  |  直到 7 年前
        1
  •  2
  •   Mike    7 年前

    我认为你误解了每个班级的角色。您正在将QAbstractVideoSurface子类化,它应该有助于访问准备好呈现的数据。在本方法中,您将获得一个已经解码的QVideoFrame。如果您想在屏幕上显示这个,那么您需要在VideoSurface类中实现它。

    您可以在QMediaPlayer上设置VideoSurface,并且媒体播放器已经处理了视频的解码和像素格式的协商。您在当前的VideoSurface中收到的QVideoFrame已经具有媒体播放器提供的高度/宽度和像素格式。媒体播放器的典型用途是加载和解码文件,并在屏幕上显示一个视频小部件。

    如果您需要使用自己定制的ffmpeg解码器,我的建议是将帧从yuv420转换为rgb(libswscale?),创建您自己的自定义小部件,您也可以传递帧数据,并且可以在加载到QPixmap后使用qpaiter在屏幕上呈现它。