是啊,严肃地说,这是我第一次尝试使用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循环来使其工作?