0

如何在不将其转换为位图的情况下翻转 SharpDX.Databox?我正在使用 SharpDX 和 Media Foundation 进行屏幕录制。以下是有关如何获取 Databox 的代码。

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);

在此处输入图像描述

4

1 回答 1

1

在您的代码中,带有MFCopyImage. 根据MFCopyImage 函数,您必须设置 _In_ LONG lDestStride, _In_ const BYTE *pSrc, _In_ LONG lSrcStride,- lDestStride 和 lSrcStride - 是用于存储一行像素的内存宽度 - 您的计算videoWidth * BYTES_PER_PIXEL不正确,因为对于 Windows RGB 格式,stride 可能比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,
  • 行间距。

问候。

PS Destination stridemStride可以是负数 - 这意味着它需要从最后一行写入到第一行。它可以通过目标指针的下一次更改来完成 -aPtrData += (mHeight - 1)*mStride;

于 2017-05-18T02:20:13.310 回答