1

Windows Vista+ でのサイズ変更の質の悪さに対処するために、EVR レンダラーを私のプレーヤーに実装しましたが、問題が発生しました...

EVR に字幕オーバーレイの問題があります。

私が話していることを確認してみてください。オプションで EVR を設定する必要があります。

これを使用して、DirectX サーフェスを使用して 32 ビット アルファ ビットマップを VMR9 に適用しました。

private void SetVRM9MixerSettings(int width, int height, int lines)
        {
            int hr = 0;
            VMR9AlphaBitmap alphaBmp;               

            // Set Alpha Bitmap Parameters for using a Direct3D surface
            alphaBmp = new VMR9AlphaBitmap();
            alphaBmp.dwFlags = VMR9AlphaBitmapFlags.EntireDDS | VMR9AlphaBitmapFlags.FilterMode;

            // on unmanagedSurface the bitmap was drawn with transparency
            alphaBmp.pDDS = unmanagedSurface;
            alphaBmp.rDest = GetDestRectangle(width, height, lines);
            alphaBmp.fAlpha = 1.0f;
            alphaBmp.dwFilterMode = VMRMixerPrefs.BiLinearFiltering;

            // for anaglyph half SBS
            if (FrameMode == Mars.FrameMode.HalfSideBySide)
            {
                alphaBmp.rDest.left /= 2;
                alphaBmp.rDest.right /= 2;
            }

            // Set Alpha Bitmap Parameters
            hr = mixerBitmap.SetAlphaBitmap(ref alphaBmp);
            DsError.ThrowExceptionForHR(hr);

        }

ただし、プロジェクト MediaFoundation.NET には、設定する alphaBmp.pDDS ポインターがないため、directdraw サーフェスを使用できず、GDI を使用する必要があります (誰かがこれを行う方法を持っている場合は、クールになります)。しかし、GDI では、真の透過性のために 32 ビットのアルファ ビットマップを使用することはできません。このアプローチでは 1 ビットの透過性しか得られません。

 private void SetEVRMixerSettings(int width, int height, int subtitleLines)
        {
            MFVideoAlphaBitmap alphaBmp = new MFVideoAlphaBitmap();

            //alphaBitmap is a 32bit semitransparent Bitmap
            Graphics g = Graphics.FromImage(alphaBitmap);

            // get pointer to needed objects
            IntPtr hdc = g.GetHdc();
            IntPtr memDC = CreateCompatibleDC(hdc);
            IntPtr hBitmap = alphaBitmap.GetHbitmap();
            IntPtr hOld = SelectObject(memDC, hBitmap);

            alphaBmp.GetBitmapFromDC = true;
            alphaBmp.stru = memDC;
            alphaBmp.paras = new MFVideoAlphaBitmapParams();
            alphaBmp.paras.dwFlags = MFVideoAlphaBitmapFlags.Alpha | MFVideoAlphaBitmapFlags.SrcColorKey | MFVideoAlphaBitmapFlags.DestRect;

            // calculate destination rectangle
            MFVideoNormalizedRect mfNRect = new MFVideoNormalizedRect();
            NormalizedRect nRect = GetDestRectangle(width, height, subtitleLines);

            mfNRect.top = nRect.top;
            mfNRect.left = nRect.left;
            mfNRect.right = nRect.right;
            mfNRect.bottom = nRect.bottom;

            // used when viewing half side by side anaglyph video that is stretched to full width
            if (FrameMode == Mars.FrameMode.HalfSideBySide)
            {
                mfNRect.left /= 2;
                mfNRect.right /= 2;
            } 

            alphaBmp.paras.nrcDest = mfNRect;

            // calculate source rectangle (full subtitle bitmap)
            MFRect rcSrc = new MFRect();
            rcSrc.bottom = alphaBitmap.Height;
            rcSrc.right = alphaBitmap.Width;
            rcSrc.top = 0;
            rcSrc.left = 0;

            alphaBmp.paras.rcSrc = rcSrc;

            // apply 1-bit transparency 
            System.Drawing.Color colorKey = System.Drawing.Color.Black;
            alphaBmp.paras.clrSrcKey = ColorTranslator.ToWin32(colorKey);

            // 90% visible
            alphaBmp.paras.fAlpha = 0.9F;

            // set the bitmap to the evr mixer
            evrMixerBitmap.SetAlphaBitmap(alphaBmp);

            // cleanup
            SelectObject(memDC, hOld);
            DeleteDC(memDC);
            g.ReleaseHdc();

        }

質問は次のとおりです。

  • DirectDraw サーフェスを使用して EVR ビデオまたは
  • DirectDraw を使用せずに半透明のビットマップを混在させる方法は?

どうもありがとうございました!

4

1 に答える 1

2

2番目の質問に答えようとします...

アルファブレンディングはかなり単純な作業です。アルファが 0.0 から 1.0 の範囲にあると仮定します。ここで、0.0 は完全に透明であることを意味し、1.0 は完全に不透明な色を表します。

R_result = R_Source * alpha + R_destination * (1.0 - alpha)

ここでは実際には float は必要ないため、アルファを 0 ~ 255 の範囲に切り替えることができます。

R_result = ( R_Source * alpha + R_destination * (255 - alpha) ) >> 8

さらに最適化できます...それはあなた次第です。
もちろんGもBも同じです。

于 2011-05-19T09:36:44.843 に答える