Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 媒体基金会:从一个作家那里得到一个媒体接收器_C++_Ms Media Foundation - Fatal编程技术网

C++ 媒体基金会:从一个作家那里得到一个媒体接收器

C++ 媒体基金会:从一个作家那里得到一个媒体接收器,c++,ms-media-foundation,C++,Ms Media Foundation,我正在尝试将MP4文件接收器添加到拓扑。当我的MediaSource已经是MP4时,我使用MFCreateMPEG4MediaSink和MF\u MPEG4SINK\u spspsps\u PASSTHROUGH。当我的MediaSource不是MP4时(网络摄像头中的原始YUV),我想使用MFCreateSinkWriterFromURL,这样我就不必找出MP4头和其他复杂的东西 据我所知,我应该能够使用GetServiceForStream访问MediaSink,因为输入类型与输出类型不同。

我正在尝试将MP4文件接收器添加到拓扑。当我的
MediaSource
已经是MP4时,我使用
MFCreateMPEG4MediaSink
MF\u MPEG4SINK\u spspsps\u PASSTHROUGH
。当我的
MediaSource
不是MP4时(网络摄像头中的原始YUV),我想使用
MFCreateSinkWriterFromURL
,这样我就不必找出MP4头和其他复杂的东西

据我所知,我应该能够使用
GetServiceForStream
访问
MediaSink
,因为输入类型与输出类型不同。但是,它总是返回
MF\u E\u UNSUPPORTED\u服务

如何从
MediaSinkWriter
中获取底层的
MediaSink

或者,如何为任意拓扑轻松创建MP4媒体接收器

HRESULT CreateVideoFileSink(
    IMFStreamDescriptor *pSourceSD,     // Pointer to the stream descriptor.
    LPCWSTR pFilename,                  // Name of file to save to.
    IMFStreamSink **ppStream)           // Receives a pointer to the stream sink.
    HRESULT hr = S_OK;
    CComPtr<IMFAttributes> pAttr;
    CComPtr<IMFMediaTypeHandler> pHandler;
    CComPtr<IMFMediaType> pType;
    CComPtr<IMFMediaSink> pSink;
    CComPtr<IMFStreamSink> pStream;
    CComPtr<IMFSinkWriter> pSinkWriter;
    CComPtr<IMFByteStream> pByteStream;

    *ppStream = nullptr;

    // Get the media type handler for the stream.
    IFR(pSourceSD->GetMediaTypeHandler(&pHandler));

    // Get the major media type.
    GUID guidMajorType;
    IFR(pHandler->GetMajorType(&guidMajorType));

    IFR(MFCreateAttributes(&pAttr, 1));
    IFR(pAttr->SetUINT32(MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS, TRUE));

    // Create an output file 
    if (MFMediaType_Video == guidMajorType)
    {
        GUID guidSubType;
        IFR(pHandler->GetCurrentMediaType(&pType));
        IFR(pType->GetGUID(MF_MT_SUBTYPE, &guidSubType));

        if (MFVideoFormat_H264 == guidSubType)
        {
            // ... use MFCreateMPEG4MediaSink
        }
        else
        {
            IFR(MFCreateSinkWriterFromURL(pFilename, nullptr, pAttr, &pSinkWriter));
            DWORD streamIdx;
            IFR(pSinkWriter->AddStream(pType, &streamIdx));
            IFR(pSinkWriter->GetServiceForStream(MF_SINK_WRITER_MEDIASINK, GUID_NULL, IID_PPV_ARGS(&pSink)));
            IFR(pSink->GetStreamSinkByIndex(streamIdx, &pStream));
        }
    }
    else
    {
        // Don't use this stream
        IFR(E_FAIL)
    }

    // Return IMFStreamSink pointer to caller.
    *ppStream = pStream.Detach();

    return S_OK;
}
HRESULT创建视频文件链接(
IMFStreamDescriptor*psourced,//指向流描述符的指针。
LPCWSTR pFilename,//要保存到的文件的名称。
IMFStreamSink**ppStream)//接收指向流接收器的指针。
HRESULT hr=S_正常;
指挥部;
芬德勒伯爵;
CComPtr-pType;
CComPtr pSink;
CComPtr潮流;
首席pSinkWriter;
CComPtr pByteStream;
*ppStream=nullptr;
//获取流的媒体类型处理程序。
IFR(psourced->GetMediaTypeHandler(&pHandler));
//获取主要媒体类型。
GUID-guidMajorType;
IFR(pHandler->GetMajorType(&guidMajorType));
IFR(MFCreateAttributes(&pAttr,1));
IFR(pAttr->SetUINT32(MF\u READWRITE\u ENABLE\u HARDWARE\u TRANSFORMS,TRUE));
//创建一个输出文件
if(MFMediaType_视频==guidMajorType)
{
GUID-guidSubType;
IFR(pHandler->GetCurrentMediaType(&pType));
IFR(pType->GetGUID(MF_MT_子类型和guidSubType));
if(MFVideoFormat_H264==guidSubType)
{
//…使用MFCreateMPEG4MediaSink
}
其他的
{
IFR(MFCreateSinkWriterFromURL(pFilename、nullptr、pAttr和pSinkWriter));
德沃德·斯特里梅克斯;
IFR(pSinkWriter->AddStream(pType和streamIdx));
IFR(pSinkWriter->GetServiceForStream(MF_SINK_WRITER_MEDIASINK,GUID_NULL,IID_PPV_ARGS(&pSink));
IFR(pSink->GetStreamSinkByIndex(streamIdx和pStream));
}
}
其他的
{
//不要使用此流
IFR(E_失败)
}
//将IMFStreamSink指针返回给调用方。
*ppStream=pStream.Detach();
返回S_OK;
}

在写完问题后,我马上就想出来了——当然。在您调用
beginwrite
之前,
SinkWriter
没有
MediaSink

IFR(MFCreateSinkWriterFromURL(pFilename, nullptr, pAttr, &pSinkWriter));
DWORD streamIdx;
IFR(pSinkWriter->AddStream(pType, &streamIdx));
IFR(pSinkWriter->BeginWriting()); // <<----
IFR(pSinkWriter->GetServiceForStream(MF_SINK_WRITER_MEDIASINK, GUID_NULL, IID_PPV_ARGS(&pSink)));
IFR(pSink->GetStreamSinkByIndex(streamIdx, &pStream));
IFR(MFCreateSinkWriterFromURL(pFilename、nullptr、patter和pSinkWriter));
德沃德·斯特里梅克斯;
IFR(pSinkWriter->AddStream(pType和streamIdx));
IFR(pSinkWriter->BeginWriting());//GetStreamSinkByIndex(streamIdx和pStream));
(请确保在使用
StreamSink
时不要释放
SinkWriter