【发布时间】:2019-07-05 14:15:34
【问题描述】:
我正在尝试将解码后的 ffmpeg 缓冲区放入QFrame,这样我就可以将此帧放入QAbstractVideoBuffer,然后将此缓冲区放入QMediaPlayer。
这是 VideoSurface 的代码。根据QT的文档,我只需要实现这两个函数:constructor和bool present,将frame处理成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)。此行将新的 h264 帧解码为 YUV420P 格式的frameBuffer。
我的想法是使用map 函数,然后尝试使用frametodraw.bits() 函数接收缓冲区指针,并尝试将该指针指向另一事物,但我认为这不是方法。我想我应该将frameBuffer的内容复制到这个指针,但是这个指针并没有告诉我它的大小,例如,所以我想这也不是办法。
那么...我应该如何将我的缓冲区映射到名为 frame 的 QVideoFrame 中?
我还注意到,当我将 VideoSurface 实例放入 QMediaPlayer 时,永远不会调用 present。我认为有问题,即使是 player->play() 这很重要。
我也没有frameBuffer 内解码图像的大小,我只有它的总大小。我想这也应该是个问题。
我还注意到QMediaPlayer 不是可显示元素...那么哪个小部件会显示我的视频?这在我看来很重要。
【问题讨论】:
-
我可能是错的,但你可以在
QVideoWidget发布之前使用这个旧的example。