2017-05-18 69 views
0

如何翻转SharpDX.Databox而不将其转换为位图? 我正在使用SharpDX和媒体基础进行屏幕录制。以下是我如何获得Databox的代码。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 - 是用于存储一行像素的内存宽度 - 您的计算videoWidth * BYTES_PER_PIXEL不正确,因为对于Windows RGB格式,跨度可以小于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#我猜你是C++程序员。但我会尝试你的解决方案。并让你知道结果谢谢。 – kripto

+0

您使用'MFExtern' - 它只是用于C#代码上MediaFoundation的C函数映射的包装。试试找到'MFExtern.MFGetStrideForBitmapInfoHeader'。 –

+0

对不起,但我仍然无法使我的输出正确。我不擅长使用媒体基础。图片来源已经倒过来了,在我的贴子上有一个附件,我忘了重命名链接。你可以在底部看到它。我实际上可以使用 – kripto