Audio 更改lameDS-3.99.5 DirectShow筛选器的默认比特率

Audio 更改lameDS-3.99.5 DirectShow筛选器的默认比特率,audio,encoding,mp3,directshow,lame,Audio,Encoding,Mp3,Directshow,Lame,我有一个应用程序,需要编码一些MP3格式的音频文件,320 kbps比特率。我正在使用DirectShow完成此任务,并使用lameDS-3.99.5 DirectShow筛选器 问题是,即使我在GraphEdit中设置了lameDS-3.99.5 DirectShow过滤器以使用常量Birate-320 kbps,编码始终以128 kbps进行 我需要的是一种按语法设置lameDS-3.99.5 DirectShow筛选器比特率的方法。 我已经调查了所有的网络,但我没有找到这样做的例子 我发现

我有一个应用程序,需要编码一些MP3格式的音频文件,320 kbps比特率。我正在使用DirectShow完成此任务,并使用lameDS-3.99.5 DirectShow筛选器

问题是,即使我在GraphEdit中设置了lameDS-3.99.5 DirectShow过滤器以使用常量Birate-320 kbps,编码始终以128 kbps进行

我需要的是一种按语法设置lameDS-3.99.5 DirectShow筛选器比特率的方法。

我已经调查了所有的网络,但我没有找到这样做的例子

我发现的一些建议是在过滤器的输出引脚上使用IAMStreamConfig接口,但我没有发现任何代码示例

谢谢你帮助我

@罗马人

非常感谢您的回复

请找到我的功能:

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;
}
对于pmt,我得到0x00000000错误的Ptr,然后执行下一个代码并获得成功:

AM_MEDIA_TYPE *pmt={0};   
hr = pamconfig->GetFormat(&pmt);
对于我获得的格式中的所有字段:

wFormatTag CXX0030:错误:无法计算表达式

nChannels CXX0030:错误:无法计算表达式

nSamplesPerSec CXX0030:错误:无法计算表达式

nAvgBytesPerSec CXX0030:错误:无法计算表达式

nBlockAlign CXX0030:错误:无法计算表达式

WBITPersample CXX0030:错误:无法计算表达式

cbSize CXX0030:错误:无法计算表达式

  • 使用
    IAMStreamConfig::SetFormat
    -
  • StackOverflow上的
    IAMStreamConfig
    有多个代码段用于设置视频媒体类型,音频格式的设置方式相同,另一个例子是
  • 这个问题(以及旧版本的信息)表明,不支持使用LAME编码器的
    IAMStreamConfig
    ,但有另一种方法指定输出细节
AM_MEDIA_TYPE *pmt={0};   
hr = pamconfig->GetFormat(&pmt);