媒体基础无损视频编辑 - 了解IMFStreamSink

时间:2016-03-21 22:02:08

标签: c++ video ms-media-foundation

是啊,严肃地说,这是我第一次尝试使用Media Foundation MP4媒体接收器:

(简化的)

IMFSourceReader * pReader;
MFCreateSourceReaderFromURL( filename,0,&pReader );

IMFMediaType * pType;
MFCreateMediaType( &pType );
pType->SetGUID( MF_MT_MAJOR_TYPE, MFMediaType_Video );
pType->SetGUID( MF_MT_SUBTYPE, MFVideoFormat_H264 );
pReader->SetCurrentMediaType( /*...*/, pType );

//...
//IMFByteStream * pByteStream
IMFMediaSink * pSink;
MFCreateMPEG4MediaSink( pByteStream, MFVideoFormat_H264, 0, &pSink );
//...

//IMFPresentationClock * pClock
pClock->Start( 0 );

for ( int i=0; i<32; ++i )
{
    IMFSample * pSample=0;
    hr=pSourceReader->ReadSample( /*...*/, &pSample );
    if ( SUCCEEDED( hr ))
        hr=pSink->ProcessSample( pSample );
    SAFE_RELEASE( pSample );
    if ( FAILED(hr) )
        break;
}
pClock-Stop();

所以我得到的是S_OK,直到程序结束。读取的样本大小为399 271字节,但写入文件的大小仅为300 745字节。显然有些东西写了但不确定它是什么?

我已经为MP4阅读器部分编写了一个包装器,所以我应该知道:尝试打开我自己的MP4给我错误

MF_E_UNSUPPORTED_BYTESTREAM_TYPE

令我担心的是MF媒体接收器使用的拉模型。坦率地说,我正在尝试实现一个有利于推送模型的包装器。

我正在学习,但对于这个简单的无损(无再压缩,编辑〜剪辑)作家的任何建议都将不胜感激。我是否有机会使用如图所示的plain for循环来使其工作?

0 个答案:

没有答案