Delphi OpenH264解码

ldfqzlk8  于 2023-05-22  发布在  其他
关注(0)|答案(2)|浏览(159)

我使用思科OpenH264编解码器在编码和解码过程中,编码阶段工作得很好,我可以正确地读取我的编码H.264文件,问题是我的解码过程,主要是从I420到ARGB的转换,请任何人帮助解决这个问题。
下面是我的Decoding函数(来自OpenH264 Package 器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;

非常感谢。

xcitsw88

xcitsw881#

步长(int dst_stride_frame),你给予H264Decoder_decode()必须是width * 3
也就是说,因为您要转换为24位RGB图像,其中一个像素占用3字节(24位/ 8)。
使用width * 2,转换后的图像将仅包含2/3的数据,从而生成您的图像。width * 4将生效,如果你想转换为32位RGB。

92vpleto

92vpleto2#

非常感谢,我解决了这个问题;问题是我刚刚设置:

Image.Picture.Bitmap.PixelFormat := pf24bit;

但正确的PixelFormat is the pf32bit

相关问题