我有一个应用程序需要编码一些MP3格式的音频文件,320 kbps比特率。我正在使用DirectShow来完成这项任务并且使用了FS-3.99.5 DirectShow过滤器。
问题在于,即使我在GraphEdit中设置lameDS-3.99.5 DirectShow过滤器以使用恒定比特率 - 320 kbps,编码也始终以128 kbps进行。
我需要的是一种以语法方式设置lameDS-3.99.5 DirectShow过滤器的比特率的方法。
我调查了所有网络,但我没有找到这样做的例子。
我发现的一些建议是在过滤器的输出引脚上使用IAMStreamConfig接口,但我没有找到任何代码示例来实现这一点。
感谢您帮助我。
@Roman
非常感谢您的回复。
请找到我的功能:
HRESULT CDShowGraph::AddLAMEMP3EncoderFilter( CComPtr<IBaseFilter>& spCodec )
{
HRESULT hr = spCodec.CoCreateInstance( IID_LAMEAudioEncoder_Filter );
if (FAILED(hr) )
{
return hr;
}
IEnumPins *pEnum = NULL;
IPin *pPin = NULL;
hr = spCodec->EnumPins(&pEnum);
if (FAILED(hr))
{
}
while (S_OK == pEnum->Next(1, &pPin, NULL))
{
PIN_DIRECTION pinDir;
PIN_DIRECTION dir = PINDIR_OUTPUT;
hr = pPin->QueryDirection(&pinDir);
if (SUCCEEDED(hr))
{
if(pinDir == dir)
{
IAMStreamConfig * pamconfig = 0;
hr = pPin->QueryInterface(IID_IAMStreamConfig, (void **)&pamconfig);
if(FAILED(hr)) {}
else
{
AM_MEDIA_TYPE *pmt={0};
hr = pamconfig->GetFormat(&pmt);
if(FAILED(hr)) {}
else
{
//audio_set_capformat(pmt);
WAVEFORMATEX *format = (WAVEFORMATEX *) pmt->pbFormat;
format->nAvgBytesPerSec = 320*1024;
hr = pamconfig->SetFormat(pmt);
DeleteMediaType(pmt);
}
}
pamconfig->Release();
}
}
}
hr = m_ptrGraph->m_pGraphBuilder->AddFilter( spCodec, NULL );
return hr;
}
直到这里:
AM_MEDIA_TYPE *pmt={0};
hr = pamconfig->GetFormat(&pmt);
对于pmt,我得到0x00000000 Bad Ptr,然后成功执行下一个代码:
AM_MEDIA_TYPE *pmt={0};
hr = pamconfig->GetFormat(&pmt);
对于我得到的格式的所有字段:
wFormatTag CXX0030:错误:无法评估表达式
nChannels CXX0030:错误:无法评估表达式
nSamplesPerSec CXX0030:错误:无法评估表达式
nAvgBytesPerSec CXX0030:错误:无法评估表达式
nBlockAlign CXX0030:错误:无法评估表达式
wBitsPerSample CXX0030:错误:无法计算表达式
cbSize CXX0030:错误:无法评估表达式
答案 0 :(得分:0)
IAMStreamConfig::SetFormat
- Sample rate and bit rate of a wave file created by DirectShow IAMStreamConfig
个用于设置视频媒体类型的多个代码段,音频格式设置方式相同,另一个例子是here IAMStreamConfig
,但还有另一种方法可以指定输出详细信息Configure LAME MP3 encoder in DirectShow application using IAudioEncoderProperties