19,464
社区成员
发帖
与我相关
我的任务
分享
HRESULT hr = m_pGraph.CoCreateInstance( CLSID_FilterGraph
, NULL
, CLSCTX_INPROC_SERVER
);
if( FAILED(hr) )
return FALSE;
// AudioResampleFilter 是重新采样Filter, 我试过将它移除,结果也一样
hr = m_pAudioResamplerFilter.CoCreateInstance( CLSID_AudioResampleFilter
, NULL
, CLSCTX_INPROC_SERVER
);
if( FAILED(hr) )
return FALSE;
hr = m_pVorbisEncoderFilter.CoCreateInstance( CLSID_VorbisEncodeFilter
, NULL
, CLSCTX_INPROC_SERVER
);
if( FAILED(hr) )
return FALSE;
hr = m_pOggMuxFilter.CoCreateInstance( CLSID_OggMuxFilter
, NULL
, CLSCTX_INPROC_SERVER
);
if( FAILED(hr) )
return FALSE;
hr = m_pGraph->AddFilter( m_pAudioResamplerFilter, _T("Audio Resampler"));
if( FAILED(hr) )
return FALSE;
hr = m_pGraph->AddFilter( m_pVorbisEncoderFilter, _T("Vorbis Encoder"));
if( FAILED(hr) )
return FALSE;
hr = m_pGraph->AddFilter( m_pOggMuxFilter, _T("Ogg mux"));
if( FAILED(hr) )
return FALSE;
//////////////////////////////////////////////////////////////////////////
CComPtr<IPin> pOutPin, pInPin;
pOutPin = FindPin( m_pAudioResamplerFilter, PINDIR_OUTPUT);
pInPin = FindPin( m_pVorbisEncoderFilter, PINDIR_INPUT);
if( pInPin && pOutPin )
m_pGraph->Connect( pOutPin, pInPin);
pOutPin = FindPin( m_pVorbisEncoderFilter, PINDIR_OUTPUT);
pInPin = FindPin( m_pOggMuxFilter, PINDIR_INPUT);
if( pInPin && pOutPin )
m_pGraph->Connect( pOutPin, pInPin);
hr = m_pGraph->RenderFile( lpszSrcFile, NULL);
if( FAILED(hr) )
return FALSE;
// 下面的代码被注释掉了,同样也不能工作, 所以不是这段设置引起的
/*
//////////////////////////////////////////////////////////////////////////
// find the pin connecting to the resample filter output pin
CComPtr<IPin> pOutPin, pInPin;
pOutPin = FindPin( m_pAudioResamplerFilter, PINDIR_OUTPUT);
if( !pOutPin )
return FALSE;
hr = pOutPin->ConnectedTo(&pInPin);
if( FAILED(hr) )
return FALSE;
// disconnect first
hr = m_pGraph->Disconnect(pOutPin);
if( FAILED(hr) )
return FALSE;
hr = m_pGraph->Disconnect(pInPin);
if( FAILED(hr) )
return FALSE;
// set the parameters
CComQIPtr<IAudioResampleSettings> pAudioResampleSettings = m_pAudioResamplerFilter;
if( pAudioResampleSettings )
{
sAudioResampleParams stResampleParams = {0};
stResampleParams.desiredNumChannels = nChannels;
stResampleParams.desiredVorbisQuality = nQuality;
IAudioResampleSettings::eSettingsResult emRet = pAudioResampleSettings->setParams(stResampleParams);
if( emRet != IAudioResampleSettings::SETS_OK &&
emRet != IAudioResampleSettings::SETS_ACCEPTED_MODIFIED )
{
return FALSE;
}
}
// reconnect the pin again
hr = m_pGraph->Connect( pOutPin, pInPin);
if( FAILED(hr) )
return FALSE;
//////////////////////////////////////////////////////////////////////////
CComQIPtr<IVorbisEncodeSettings> pVorbisEncodeSettings = m_pVorbisEncoderFilter;
if( pVorbisEncodeSettings )
{
hr = pVorbisEncodeSettings->setQuality(nQuality);
if( FAILED(hr) )
return FALSE;
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
*/
CComQIPtr<IFileSinkFilter> pFileSinkFilter = m_pOggMuxFilter;
if( pFileSinkFilter )
{
hr = pFileSinkFilter->SetFileName( lpszDestFile, NULL);
if( FAILED(hr) )
return FALSE;
}
CComQIPtr<IMediaControl> pMediaControl = m_pGraph;
hr = pMediaControl->Run();
if( FAILED(hr) )
return FALSE;
CComQIPtr<IMediaEvent> pMediaEvent = m_pGraph;
long nCode = 0;
while (nCode != EC_COMPLETE) {
pMediaEvent->WaitForCompletion(1000, &nCode);
// Report Progress
}
// 到这里为止,所有的返回值都是S_OK, 而且WaitForCompletion在持续了30秒后才结束。
// 但目标文件没有创建成功