最新的 ffmpeg 2.8 其实连yuy2数据包都不能正确转换

说了你也不相信,我用 directx 采集到的数据是从web camera来的 yuy2 数据,我用自己写的转换程序可以成功转换正确的图像rgb24, yuy2 -> rgb24 -> I420 都可以,但是用ffmpeg的sws__scale 怎么也无法正确转换。

sws__scale 的解码过程如下

void scaleYUY2toI420(const void *pSrc, int widthSrc, int heightSrc,
    void *pDest, int widthDest, int heightDest, bool bQualityImportant/* = false*/)
{
    struct SwsContext *pctx;
    AVPicture picSrc = { 0 };
    AVPicture picDst = { 0 };
    enum AVPixelFormat fmtSrc = AV_PIX_FMT_YUYV422;
    enum AVPixelFormat fmtDst = AV_PIX_FMT_YUV420P;
    avpicture_fill(&picSrc, (uint8_t*)pSrc, fmtSrc, widthSrc, heightSrc);   //
    avpicture_fill(&picDst, (uint8_t*)pDest, fmtDst, widthDest, heightDest);
    pctx = sws_getContext(widthSrc, heightSrc, fmtSrc,
        widthDest, heightDest, fmtDst,
        bQualityImportant ? SWS_BICUBIC : SWS_POINT, NULL, NULL, NULL);
    if (pctx == NULL)
        return;
    sws_scale(pctx, picSrc.data, picSrc.linesize, 0, heightSrc, picDst.data, picDst.linesize);
    sws_freeContext(pctx);

}

问题在哪里始终不得要领,希望专家们不吝赐教。

为了验证问题,我用 ffmpeg 转换 rgb24 -> I420每问题,是不是ffmpeg不支持 yuy2 packed 包到 i420?但是我看它的像素格式定义, AV_PIX_FMT_YUYV422 排在最前面啊

1个回答

我今天又测试了一下,貌似是ffmpeg在转换的过程中丢失了图像细节。我的转换过程是

CaptureDevice -> YUY2 -> RGB24 -> H264 encoder -> decoder -> I420 -> RGB24 -> display

在第一个 RGB24 时没有问题,显示的第一章图片是正常的,但是第二张的指针是紫色的,明显的丢失了YUV信息了
编码和解码器过滤后会损失一些细节的,但是不会让指针颜色变化这么大。
我尝试了,在 16bpp 和 32bpp 下是正常的,只有在24bpp下才会如此

看下图
图片说明

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问