如何将 Openh264 解码帧无延迟输出格式转换为 OpenCV 矩阵
How to convert Openh264 DecodeFrameNoDelay output format to OpenCV matrix?
我想将DecodeFrameNoDelay
函数的输出格式转换为yuvData
并bufferInfo
到OpenCV矩阵,我可以使用imshow
函数在窗口上显示框架
链接 git to DecodeFrameNoDelay 详细信息:https://github.com/cisco/openh264/wiki/ISVCDecoder#decodeframenodelay
以下是我使用 Openh264 解码帧的代码
ISVCDecoder *decoder;
SBufferInfo bufferInfo;
SDecodingParam decodingParam;
uint8_t** yuvData;
void init(int width, int height) {
WelsCreateDecoder(&decoder);
decodingParam = {0};
decodingParam.sVideoProperty.eVideoBsType = VIDEO_BITSTREAM_AVC;
decoder->Initialize(&decodingParam);
bufferInfo = {0};
bufferInfo.iBufferStatus = 1;
yuvData = new uint8_t*[3];
yuvData[0] = new uint8_t[width * height];
yuvData[1] = new uint8_t[width * height / 4];
yuvData[2] = new uint8_t[width * height / 4];
}
bool decode(const unsigned char* rawEncodedData, int rawEncodedDataLength, uint8_t** yuvData, char *name) {
int err = decoder->DecodeFrameNoDelay(rawEncodedData, rawEncodedDataLength, yuvData, &bufferInfo);
if (err != 0) {
std::cout << "H264 decoding failed. Error code: " << err << "." << std::endl;
parseErrorCode(err);
return false;
}
printf("H264 decoding success, err: %d, name: %s, status: %dn", err, name, bufferInfo.iBufferStatus);
return true;
}
任何帮助,不胜感激。
谢谢和最好的问候。
执行复制时应考虑一个stride
参数。这是一个将帧解码为 opencv cv::Mat
的代码:
inline void copyWithStride(
void* dst, const void* src,
size_t width, size_t height, size_t stride
) {
for (size_t row = 0; row < height; ++row) {
uint8_t* posFrom = (uint8_t*)src + row * stride;
uint8_t* posTo = (uint8_t*)dst + row * width;
memcpy(posTo, posFrom, width);
}
}
cv::Mat decode(const unsigned char* rawEncodedData, int rawEncodedDataLength) {
SBufferInfo sDstBufInfo;
memset(&sDstBufInfo, 0, sizeof(SBufferInfo));
unsigned char *pData[3] = {nullptr, nullptr, nullptr};
int rv = decoder->DecodeFrameNoDelay(
rawEncodedData,
rawEncodedDataLength,
pData,
&sDstBufInfo
);
int stride0 = sDstBufInfo.UsrData.sSystemBuffer.iStride[0];
int stride1 = sDstBufInfo.UsrData.sSystemBuffer.iStride[1];
cv::Mat imageYuvCh[3];
cv::Mat imageYuvMiniCh[3];
copyWithStride(imageYuvCh[0].data, pData[0], width, height, stride0);
copyWithStride(imageYuvMiniCh[1].data, pData[1], width/2, height/2, stride1);
copyWithStride(imageYuvMiniCh[2].data, pData[2], width/2, height/2, stride1);
cv::resize(imageYuvMiniCh[1], imageYuvCh[1], cv::Size(width, height));
cv::resize(imageYuvMiniCh[2], imageYuvCh[2], cv::Size(width, height));
cv::Mat resultYuv;
cv::merge(imageYuvCh, 3, resultYuv);
cv::Mat result;
cvtColor(imgYUV, result, cv::COLOR_YUV2BGR);
return result;
}
相关文章:
- 十进制到八进制递归C++.以标准::字符串格式输出
- 如何将非空终止字符串输出到 iostream,但保持格式
- 保证最大输出长度为双精度,并设置默认输出格式的精度
- 输出使用 cout 转换为 ASCII 的文本时输出格式不正确,C++
- 将 Tcl 中的命令输出重定向到文件时,文件以 DOS 格式生成
- 如何将 Openh264 解码帧无延迟输出格式转换为 OpenCV 矩阵
- 输出类似于 FORTRAN 的无格式C++
- 以一定格式输出
- 为什么int8_t的输出格式使用 4 个字节?
- qDebug - 如何以位(二进制格式)输出数据
- 音频缓冲区列表,用于输出流格式已压缩的 AUHAL 单元
- 使用setW和setFill的输出格式
- 二次方程求解器输出以未知格式输出
- 格式输出C 带有setW
- 如何以C++格式输出已保存.html文件中<a href>标签中的所有链接?
- C++:更改单个输出操作的格式输出
- 使用特定格式输出从 Main 间接调用函数
- C ++如何以二进制格式输出Ply文件
- 以C++格式输出格式
- 流操作,用于以不同格式输出对象数据