Delphi OpenH264解码
Delphi OpenH264 decode
我在编码和解码过程中使用 cisco OpenH264 编解码器,编码阶段工作得很好,我可以正确读取编码的 H.264 文件,问题出在我的解码过程,主要是从 I420 的转换到ARGB,请任何人帮助解决这个问题。
这是我的解码函数(来自 OpenH264 包装器 DLL):
/*
* [ IN ] SourceData : the encoded frame(s)
* [ OUT ] pTargetbuffer : the Target buffer
* [ OUT ] width
* [ OUT ] height
*/
{
int iStride[2];
init();
... the decoding routine : pData contains the YUV
if (ret != dsErrorFree) {
return -1;
}
if (!m_sBufferInfo.iBufferStatus) {
return -2;
}
LWidth = m_sBufferInfo.UsrData.sSystemBuffer.iWidth;
LHeight = m_sBufferInfo.UsrData.sSystemBuffer.iHeight;
*width = LWidth;
*height = LHeight;
iStride[0] = m_sBufferInfo.UsrData.sSystemBuffer.iStride[0];
iStride[1] = m_sBufferInfo.UsrData.sSystemBuffer.iStride[1];
return 0;
}
这是我的 Delphi 实现:
Image.Picture.Bitmap.PixelFormat := pf24bit;
Image.Picture.Bitmap.Width := 320;
Image.Picture.Bitmap.Height := 240;
...
Result:=H264Decoder_decode(FEncodedBuffer,
Image.Picture.Bitmap.ScanLine[Image.Picture.Bitmap.Height-1],
EncodedBufferSize,LWidth,LHeight);
if result=0 then Image.Repaint;
非常感谢。
你给H264Decoder_decode()
的步幅(int dst_stride_frame
)必须是width * 3
。
也就是说,因为要转换为 24 位 RGB 图像,其中一个像素占用 3 个字节 (24bits / 8)。
使用 width * 2
,您转换后的图像将仅包含 2/3 的数据,从而生成您的图像。 width * 4
将生效,如果你想转换成32位RGB。
非常感谢,我解决了这个问题;问题是我设置的:
Image.Picture.Bitmap.PixelFormat := pf24bit;
但是正确的PixelFormat is the pf32bit
我在编码和解码过程中使用 cisco OpenH264 编解码器,编码阶段工作得很好,我可以正确读取编码的 H.264 文件,问题出在我的解码过程,主要是从 I420 的转换到ARGB,请任何人帮助解决这个问题。
这是我的解码函数(来自 OpenH264 包装器 DLL):
/*
* [ IN ] SourceData : the encoded frame(s)
* [ OUT ] pTargetbuffer : the Target buffer
* [ OUT ] width
* [ OUT ] height
*/
{
int iStride[2];
init();
... the decoding routine : pData contains the YUV
if (ret != dsErrorFree) {
return -1;
}
if (!m_sBufferInfo.iBufferStatus) {
return -2;
}
LWidth = m_sBufferInfo.UsrData.sSystemBuffer.iWidth;
LHeight = m_sBufferInfo.UsrData.sSystemBuffer.iHeight;
*width = LWidth;
*height = LHeight;
iStride[0] = m_sBufferInfo.UsrData.sSystemBuffer.iStride[0];
iStride[1] = m_sBufferInfo.UsrData.sSystemBuffer.iStride[1];
return 0;
}
这是我的 Delphi 实现:
Image.Picture.Bitmap.PixelFormat := pf24bit;
Image.Picture.Bitmap.Width := 320;
Image.Picture.Bitmap.Height := 240;
...
Result:=H264Decoder_decode(FEncodedBuffer,
Image.Picture.Bitmap.ScanLine[Image.Picture.Bitmap.Height-1],
EncodedBufferSize,LWidth,LHeight);
if result=0 then Image.Repaint;
非常感谢。
你给H264Decoder_decode()
的步幅(int dst_stride_frame
)必须是width * 3
。
也就是说,因为要转换为 24 位 RGB 图像,其中一个像素占用 3 个字节 (24bits / 8)。
使用 width * 2
,您转换后的图像将仅包含 2/3 的数据,从而生成您的图像。 width * 4
将生效,如果你想转换成32位RGB。
非常感谢,我解决了这个问题;问题是我设置的:
Image.Picture.Bitmap.PixelFormat := pf24bit;
但是正确的PixelFormat is the pf32bit