如何编码XNA DirectShow将正常播放的.wmv文件?

时间:2013-06-18 14:10:12

标签: xna ffmpeg directshow.net

我正在使用XNA DirectShow从文件中流式传输视频而不是将其加载到我的项目中(顺便说一下,我完全了解XNA MediaPlayer类)。它播放它带来的示例视频没有问题。当我尝试从一系列PNG文件制作我自己的.wmv时,我使用ffmpeg视频播放但是全部为蓝色(应该大部分为黄色)。像素格式错了吗?错误的编解码器?我当然不是这些水域的专家。

示例视频显然是VC-1 WMV3,我认为我不能复制它?我应该使用什么编码/编解码器/文件格式?

另外!如果透明的视频背景是可能的,那将是惊人的。是吗?

1 个答案:

答案 0 :(得分:0)

好的我已经解决了 - 我只是在DirectShow创建输出纹理时切换顺序像素。在VideoPlayer类中,我将UpdateBuffer更改为:

 private void UpdateBuffer()
    {
        int waitTime = avgTimePerFrame != 0 ? (int)((float)avgTimePerFrame / 10000) : 20;

        int samplePosRGBA = 0;
        int samplePosRGB24 = 0;

        while (true)
        {
            for (int y = 0, y2 = videoHeight - 1; y < videoHeight; y++, y2--)
            {
                for (int x = 0; x < videoWidth; x++)
                {
                    samplePosRGBA = (((y2 * videoWidth) + x) * 4);
                    samplePosRGB24 = ((y * videoWidth) + x) * 3;

                    //make transparent if pixel matches a certain colour
                    if (WhiteTransparent && bgrData[samplePosRGB24 + 2] > 200 && bgrData[samplePosRGB24 + 1] > 200 && bgrData[samplePosRGB24 + 0] > 200)
                    {
                        //transparent pixel
                        videoFrameBytes[samplePosRGBA + 0] = 0;
                        videoFrameBytes[samplePosRGBA + 1] = 0;
                        videoFrameBytes[samplePosRGBA + 2] = 0;
                        videoFrameBytes[samplePosRGBA + 3] = 0;
                    }
                    else
                    {
                        //modified pixel format order - switch the 2,1,0 on the right for other formats..
                        videoFrameBytes[samplePosRGBA + 0] = bgrData[samplePosRGB24 + 2];
                        videoFrameBytes[samplePosRGBA + 1] = bgrData[samplePosRGB24 + 1];
                        videoFrameBytes[samplePosRGBA + 2] = bgrData[samplePosRGB24 + 0];
                        videoFrameBytes[samplePosRGBA + 3] = alphaTransparency;
                    }
                }
            }

            frameAvailable = false;
            while (!frameAvailable)
            { Thread.Sleep(waitTime); }
        }
    }

如果我添加到类中的bool - WhiteTransparent为true,它还会在最终图像中显示任何白色区域为透明。原油我知道,但它正在为我做伎俩。如果不需要,只需使用else语句中的行。