更改 lameDS-3.99.5 DirectShow 过滤器的默认比特率

Posted

技术标签:

【中文标题】更改 lameDS-3.99.5 DirectShow 过滤器的默认比特率【英文标题】:Change default bit-rate for lameDS-3.99.5 DirectShow filter 【发布时间】:2015-10-22 06:46:48 【问题描述】:

我有一个应用程序需要将一些音频文件编码为 MP3 格式、320 kbps 比特率。我正在使用 DirectShow 来完成这项任务和 lameDS-3.99.5 DirectShow 过滤器。

问题在于,即使我在 GraphEdit 中将 lameDS-3.99.5 DirectShow 过滤器设置为使用 Constant 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;

到这里为止:

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:错误:无法计算表达式

【问题讨论】:

【参考方案1】: 使用IAMStreamConfig::SetFormat - Sample rate and bit rate of a wave file created by DirectShow ***上有多个IAMStreamConfig的代码sn-ps用于设置视频媒体类型,音频格式设置方法相同,另一个例子是here 这个问题(以及旧版本的信息here)说不支持带有 LAME 编码器的IAMStreamConfig,但是还有另一种方法可以指定输出详细信息Configure LAME MP3 encoder in DirectShow application using IAudioEncoderProperties

【讨论】:

以上是关于更改 lameDS-3.99.5 DirectShow 过滤器的默认比特率的主要内容,如果未能解决你的问题,请参考以下文章

更改fancybox iframe的大小-我可以更改宽度但不能更改高度?

在运行时更改方向更改 ViewControllers

UIScrollView 更改 contentOffset 时更改框架

HAC集群更改IP(单节点更改全部节点更改)

HAC集群更改IP(单节点更改全部节点更改)

设备方向更改时更改 UIImage