欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > Android下QVideoFrame转QImage不成功记录

Android下QVideoFrame转QImage不成功记录

2025/9/16 3:14:21 来源:https://blog.csdn.net/huzhifei/article/details/139768332  浏览:    关键词:Android下QVideoFrame转QImage不成功记录

1.由于QVideoFrame::image() const : unsupported pixel format Format_ABGR32 ,在转换时需要做个特殊处理如下,增加了android手机下的特殊格式处理:

if(frame.pixelFormat() == QVideoFrame::Format_ABGR32)  此部分代码

QImage imageFromVideoFrame(QVideoFrame &frame)
{qDebug() << "resolution:(" << frame.width() << ", " << frame.height() << ")";QImage image;if(frame.map(QAbstractVideoBuffer::ReadOnly)){QImage::Format fmt = QVideoFrame::imageFormatFromPixelFormat(frame.pixelFormat());if(fmt != QImage::Format_Invalid){qDebug() << "not invalid format.";image = QImage(frame.bits(), frame.width(), frame.height(), /*v.bytesPerLine(),*/fmt);}else if(frame.pixelFormat() == QVideoFrame::Format_ABGR32){const auto max = frame.width() * frame.height() * 4;std::vector< uchar > buf;buf.reserve( max );uchar * bits = frame.bits();static const size_t i1 = ( Q_BYTE_ORDER == Q_LITTLE_ENDIAN ? 2 : 0 );static const size_t i2 = ( Q_BYTE_ORDER == Q_LITTLE_ENDIAN ? 1 : 3 );static const size_t i3 = ( Q_BYTE_ORDER == Q_LITTLE_ENDIAN ? 0 : 2 );static const size_t i4 = ( Q_BYTE_ORDER == Q_LITTLE_ENDIAN ? 3 : 1 );for( auto i = 0; i < max; ){buf.push_back( bits[ i1 ] );buf.push_back( bits[ i2 ] );buf.push_back( bits[ i3 ] );buf.push_back( bits[ i4 ] );bits += 4;i += 4;}image = QImage( &buf[ 0 ], frame.width(), frame.height(), frame.bytesPerLine(),QImage::Format_ARGB32 ).copy();}else{int nbytes = frame.mappedBytes();qDebug() << "invalid format. nbytes=" << nbytes;image = QImage::fromData(frame.bits(), nbytes);//image = frame.image();}frame.unmap();}return image.mirrored(true, true);
}

2.在Android下QVideoFrame转QImage转换的结果如下:

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词