DirectShow: 转换某种格式的音频文件到OGG格式,在一台电脑上成功,一台电脑上失败。

CodeProject-Jerry 2009-02-20 10:49:39
开始我以为是代码问题, 但用GraphEdit试验后, 发现完全相同的Filter路径,居然也是1台成功。1台没生成文件

先说一下我的做法。

我需要将某种不限定的音频格式转换为OGG格式,首先加入了 Vorbis Encode Filter --> Ogg Mux Filter。
然后RenderFile,对前面那截输入以及解码部分做智能连接。

以MP3为例。
我2台电脑上,用GraphEdit得到的路径都是:
1.mp3 --> MPEG-I Stream Splitter --> MPEG Layer-3 Decoder --> Vorbis Encode Filter --> Ogg Mux Filter

但是,启动转换后, 有1台目标文件都没有创建,另一台成功。
我在代码中也是按照此逻辑调用,所有的接口都成功了,而且转换过程还持续了30s(我WaitForCompletion了)。 代码执行一切正常(检查了多有返回值)。
就是没看见文件产生。 但是另一台电脑却正常, 这是为什么?

2台都是 WIndows 2003

安装了相同版本的OGG codec, MP3的Filter都是OS自带的。

有没有人遇到类似的问题?
...全文
197 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wmpkumse 2009-02-22
  • 打赏
  • 举报
回复
是不是另一台机器上没有装有相关的库?猜的,呵呵~~~
CodeProject-Jerry 2009-02-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 warsour 的回复:]
windows2003下的directX看是否装上了,测试下DiraectDraw是不是正常的,有些时候2003为了安全和高效这些都没开启的
[/Quote]
编码转换不渲染到 DirectDraw. 而且硬件加速也全部打开了, 音频服务也启动了。
warsour 2009-02-21
  • 打赏
  • 举报
回复
windows2003下的directX看是否装上了,测试下DiraectDraw是不是正常的,有些时候2003为了安全和高效这些都没开启的
CodeProject-Jerry 2009-02-20
  • 打赏
  • 举报
回复
贴点关键代码:


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秒后才结束。
// 但目标文件没有创建成功

19,464

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧