2017-05-18 57 views
0

SharpDX.Databoxをビットマップに変換せずに反転させるにはどうすればよいですか? SharpDXとMedia Foundationを使用して画面を録画しています。以下は、私がデータボックスを入手する方法のコードです。SharpDX MapSubresourceが垂直に反転されているC#

mapSource = device.ImmediateContext.MapSubresource(screenTexture, 0,SharpDX.Direct3D11.MapMode.Read, SharpDX.Direct3D11.MapFlags.None);

しかし、私はmediafoundation.netでのMapSourceを通過したとき、私は垂直方向の映像を制作。あなたのコードで

 IMFSample sample = null; 
     IMFMediaBuffer buffer = null; 

     IntPtr data = new IntPtr(); 
     int bufferMaxLength; 
     int bufferCurrentLength; 

     int hr = (int)MFExtern.MFCreateMemoryBuffer(frameSizeBytes, out buffer); 

     if (Succeeded(hr)) hr = (int)buffer.Lock(out data, out bufferMaxLength, out bufferCurrentLength); 
     if (Succeeded(hr)) 
     { 

      hr = (int)MFExtern.MFCopyImage(data, videoWidth * BYTES_PER_PIXEL, mapSource.DataPointer, videoWidth * BYTES_PER_PIXEL, videoWidth * BYTES_PER_PIXEL, videoHeight); 
     } 
     if (Succeeded(hr)) hr = (int)buffer.Unlock(); 
     if (Succeeded(hr)) hr = (int)buffer.SetCurrentLength(frameSizeBytes); 
     if (Succeeded(hr)) hr = (int)MFExtern.MFCreateSample(out sample); 
     if (Succeeded(hr)) hr = (int)sample.AddBuffer(buffer); 
     if (Succeeded(hr)) hr = (int)sample.SetSampleTime(frame.prevRecordingDuration.Ticks);//(TICKS_PER_SECOND * frames/VIDEO_FPS); 
     if (Succeeded(hr)) hr = (int)sample.SetSampleDuration((frame.recordDuration-frame.prevRecordingDuration).Ticks); 
     if (Succeeded(hr)) hr = (int)sinkWriter.WriteSample(streamIndex, sample); 
     if (Succeeded(hr)) frames++; 

     COMBase.SafeRelease(sample); 
     COMBase.SafeRelease(buffer); 

enter image description here

答えて

1

MFCopyImageとコードに誤りがあります。 MFCopyImage functionによると、 _In_ LONG lDestStride, _In_ const BYTE *pSrc, _In_ LONG lSrcStride,を設定する必要があります。lDestStrideとlSrcStrideはピクセルの1行を保存するためのメモリの幅です.Window RGB形式のストライドはvideoWidth * BYTES_PER_PIXELよりも広くなる可能性があるため、計算videoWidth * BYTES_PER_PIXELは正しくありません。あなたは、機能MFGetStrideForBitmapInfoHeaderによってあなたはあなたからイメージソースコードを入手することができますソースストライドを先ストライドを計算しなければならない - 私はあなたのコードを知らないが、私のプロジェクトのために私は

D3D11_MAPPED_SUBRESOURCE resource; 
       UINT subresource = D3D11CalcSubresource(0, 0, 0); 
       ctx->Map(mDestImage, subresource, D3D11_MAP_READ_WRITE, 0, &resource); 
       LOG_INVOKE_MF_FUNCTION(MFCopyImage, 
        aPtrData, 
        mStride, 
        (BYTE*)resource.pData, 
        resource.RowPitch, 
  • RowPitchを使用しました。

よろしくお願いいたします。

P.S.デスティネーションストライドmStrideは負の値にすることができます。つまり、最後の行から最初の行に書き込む必要があります。それは宛先ポインタの次の変更によって行うことができます - aPtrData += (mHeight - 1)*mStride;

+0

私はあなたがC + +プログラマだと思います。しかし、私はあなたの解決策を試みます。結果を教えてくださいありがとうございました。 – kripto

+0

'MFExtern'を使用します。これはC#コードのMediaFoundationのC関数をマッピングするためのラッパーです。 'MFExtern.MFGetStrideForBitmapInfoHeader'を見つけてみてください。 –

+0

申し訳ありませんが、まだ出力を正しく行うことはできません。私はメディアファンデーションの専門家ではありません。私のポストに添付ファイルがあるように、イメージのソースはすでに反転されていますが、リンクの名前を変更するのを忘れてしまいました。あなたは一番下にそれを見ることができます。私は実際に使用することができます – kripto

関連する問題