如何翻转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);
我正在使用c#我猜你是C++程序员。但我会尝试你的解决方案。并让你知道结果谢谢。 – kripto
您使用'MFExtern' - 它只是用于C#代码上MediaFoundation的C函数映射的包装。试试找到'MFExtern.MFGetStrideForBitmapInfoHeader'。 –
对不起,但我仍然无法使我的输出正确。我不擅长使用媒体基础。图片来源已经倒过来了,在我的贴子上有一个附件,我忘了重命名链接。你可以在底部看到它。我实际上可以使用 – kripto