1

プロジェクトにビデオをロードするのではなく、ファイルからビデオをストリーミングするために XNA DirectShow をいじっています (ちなみに、XNA MediaPlayer クラスについては十分に認識しています)。付属のサンプル動画は問題なく再生されます。一連の PNG ファイルから独自の .wmv を作成しようとすると、ffmpeg を使用してビデオが再生されますが、すべて青です (ほとんど黄色である必要があります)。ピクセル形式が間違っていますか? コーデックが間違っていますか?私は確かにこれらの海域の専門家ではありません..

サンプル動画は見かけ上 VC-1 WMV3 ですが、再現できないのでしょうか? どのエンコーディング/コーデック/ファイル形式を使用すればよいですか?

また!透明なビデオの背景が可能であれば、それは素晴らしいことです. それは...ですか?

4

1 に答える 1

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 ステートメントの行を使用してください。

于 2013-06-19T14:57:21.827 に答える