c++ - 如何复制 IMFSample 对象

标签 c++ windows win-universal-app video-processing ms-media-foundation

我需要复制 IMFSample 对象,这样我就会有单独的独立对象。 Microsoft API 没有提供简单的方法来复制 IMFSample 视频帧。

最佳答案

这是一个示例代码:

#define MmfThrowIfError(hrVal) \
{ \
    HRESULT hrMmfTraceInternal = (hrVal); \
    if (FAILED(hrMmfTraceInternal)) \
    { \
        /* LOG_F(LS_ERROR)<<"MMF hr: 0x"<<std::hex<<hrMmfTraceInternal; */ \
        throw ref new ::Platform::Exception(hrMmfTraceInternal); \
    } \
}

MFComPtr<IMFMediaBuffer> DuplicateBuffer(const MFComPtr<IMFMediaBuffer>& srcBuf)
{
    byte* srcByteBuffer = nullptr;
    DWORD srcBuffMaxLen = 0;
    DWORD srcBuffCurrLen = 0;
    MmfThrowIfError(srcBuf->Lock(&srcByteBuffer, &srcBuffMaxLen, &srcBuffCurrLen));

    MFComPtr<IMFMediaBuffer> destBuf = nullptr;
    MmfThrowIfError(MFCreateMemoryBuffer(srcBuffCurrLen, &destBuf));

    byte* destByteBuffer = nullptr;
    MmfThrowIfError(destBuf->Lock(&destByteBuffer, nullptr, nullptr));
    memcpy(destByteBuffer, srcByteBuffer, srcBuffCurrLen);
    MmfThrowIfError(destBuf->Unlock());
    MmfThrowIfError(srcBuf->Unlock());

    MmfThrowIfError(destBuf->SetCurrentLength(srcBuffCurrLen));
    return destBuf;
}

SampleComPtr DuplicateSample(const SampleComPtr& sample)
{
    if (!sample)
        return nullptr;

    DWORD sampleFlags = 0;
    LONGLONG llVideoTimeStamp = 0;
    LONGLONG llSampleDuration = 0;
    MmfThrowIfError(sample->GetSampleFlags(&sampleFlags));
    MmfThrowIfError(sample->GetSampleTime(&llVideoTimeStamp));
    MmfThrowIfError(sample->GetSampleDuration(&llSampleDuration));

    SampleComPtr outSample;
    MFCreateSample(&outSample);
    MmfThrowIfError(outSample->SetSampleFlags(sampleFlags));
    MmfThrowIfError(outSample->SetSampleTime(llVideoTimeStamp));
    MmfThrowIfError(outSample->SetSampleDuration(llSampleDuration));

    DWORD bufferCount = 0;
    MmfThrowIfError(sample->GetBufferCount(&bufferCount));

    for (DWORD index = 0; index < bufferCount; ++index)
    {
        MFComPtr<IMFMediaBuffer> srcBuf = nullptr;
        MmfThrowIfError(sample->GetBufferByIndex(index, &srcBuf));

        MFComPtr<IMFMediaBuffer> reConstructedBuffer = DuplicateBuffer(srcBuf);
        srcBuf = nullptr;
        MmfThrowIfError(outSample->AddBuffer(reConstructedBuffer.Get()));
    }

    return outSample;
}

关于c++ - 如何复制 IMFSample 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38354857/

相关文章:

c++ - 来自 cudaGetErrorString(err) 的未知错误

c++ - 在 main() 中控制 cin

javascript - 如何从 Javascript 打开指定路径的 html 文件对话框?

java - 在 Windows/Linux/Mac 上的 Java 程序中对全局热键使用react?

xaml - 如何向 UWP 中的 MenuFlyout 添加图标?

c# - 如何调试 Windows 应用商店应用程序崩溃?

c++ - 如何防止 COM Server EXE 打开命令提示符窗口

c++ - Win32 API - 创建按钮帮助

windows - 无法显示来自 Windows 容器 : Windows 2019 Server 的 GUI 应用程序

javascript - 在 Windows 10 通用应用程序中从 JavaScript 调用 C# 组件