Directshow里面声音在经过mpeg layer-3 编码之后,还能够用Grab来截取数据吗?

frankgogoland 2003-08-21 05:57:06
在没有经过编码之前我可以得到数据,但是在编码之后我发现
调用connect(outputpin,inputpin)的时候就会出现错误。

该怎么实现呢?
...全文
65 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xielm 2003-08-26
  • 打赏
  • 举报
回复

{//²¶×½ÓïÒô

IAMStreamConfig *pConfig;
hr = m_pBuild->FindInterface(NULL,&MEDIATYPE_Audio, m_pASrcFilter, IID_IAMStreamConfig, (void **)&pConfig);
int nCount;
int nSize;
AUDIO_STREAM_CONFIG_CAPS Caps;
hr = pConfig->GetNumberOfCapabilities(&nCount,&nSize);
AM_MEDIA_TYPE *pmt;
int i = 0 ;
WAVEFORMATEX *pwf;
for (i = 0;i < nCount; i ++)
{
pConfig->GetStreamCaps(i,&pmt,(BYTE *)&Caps);
pwf = (WAVEFORMATEX *)pmt->pbFormat;
if (pwf->nSamplesPerSec == 8000 && pwf->nChannels == 1 && pwf->nBlockAlign == 2)
{
pConfig->SetFormat(pmt);
break;
}

}
pConfig->Release();

}

选择你要的格式。上面是音频的,视频类似
frankgogoland 2003-08-26
  • 打赏
  • 举报
回复
我尝试了一下可以了,但我是这么做的
CComQIPtr< IBaseFilter, &IID_IBaseFilter > pGrabBaseAudio( m_pGrabberAudio );
// find the two pins and connect them
//pCapOut = GetOutPin( m_pAudioSrc, 0 );
pCapOut = GetOutPin( m_pAudioSrc, 0 );
//pGrabIn = GetInPin( pGrabBaseAudio, 0 );
IPin *pCompress = GetInPin( m_pAudioCompressor, 0 );
hr = m_pGraph->Connect( pCapOut, pCompress );

if( FAILED( hr ) )
{
return FALSE;
}
}

pCompress = GetOutPin( m_pAudioCompressor, 0 );
pGrabIn = GetInPin( pGrabBaseAudio, 0 );

hr = m_pGraph->Connect( pCompress, pGrabIn );

pOutPin = GetOutPin( pGrabBaseAudio, 0 );
hr = m_pGraph->Render( pOutPin );
if( FAILED( hr ) )
{
OutputDebugString( "Could not render sample grabber output pin" );
return FALSE;
}
// ask for the connection media type so we know how big
// it is, so we can write out bitmaps
//
m_pGrabberAudio->SetOneShot( FALSE );
m_pGrabberAudio->SetCallback(m_pGrabCBAudio, 1 );


但是我在初始化的时候该怎么设置呢,还有我该怎么去检验我通过GRAB函数BufferCB得到的值正确与否。


//process audio
// create a sample grabber
hr = m_pGrabberAudio.CoCreateInstance( CLSID_SampleGrabber );
if( !m_pGrabberAudio )
{
OutputDebugString( "Could not create SampleGrabber Audio (is qedit.dll registered?)" );
return FALSE;
}
CComQIPtr< IBaseFilter, &IID_IBaseFilter > pGrabBaseAudio( m_pGrabberAudio );

m_pAStreamControl->GetFormat(&am);
CMediaType AudioType;
AudioType.SetType(&MEDIATYPE_Audio); //这个地方对吗???
AudioType.SetSubtype(&am->subtype);

hr = m_pGrabberAudio->SetMediaType( &AudioType ); // shouldn't fail
if( FAILED( hr ) )
{
OutputDebugString( "Could not set media type audio" );
return FALSE;
}
// add the grabber to the graph


谢谢
xielm 2003-08-26
  • 打赏
  • 举报
回复
绝对可以的。
//audio sample grab
_bstr_t GrabberFilterName = L"@device:sw:{083863F1-70DE-11D0-BD40-00A0C911CE86}\\{C1F400A0-3F08-11D3-9F0B-006008039E37}";
m_pAudioGrabberFilter = CFilterUtils::GetFilter(GrabberFilterName);//
m_pGraph->AddFilter(m_pAudioGrabberFilter,L"Audio Sample Grabber");

m_pAudioGrabberFilter->QueryInterface(IID_ISampleGrabber, (void**)&pGrabber);
hr = pGrabber->SetOneShot(false);
hr = pGrabber->SetBufferSamples(true);
hr = pGrabber->SetCallback((CAudioCaptureListener *)this,0);
SAFE_RELEASE(pGrabber);

hr = CFilterUtils::ConnectFilters(m_pGraph,m_pASrcFilter,m_pACompressFilter);
hr = CFilterUtils::ConnectFilters(m_pGraph,m_pACompressFilter,m_pAudioGrabberFilter);




// FilterUtils.cpp: implementation of the CFilterUtils class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "FilterUtils.h"


#pragma comment(lib, "strmiids.lib")
#pragma comment(lib, "Quartz.lib")
#pragma comment(lib, "Strmbasd.lib ")


//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CFilterUtils::CFilterUtils()
{

}

CFilterUtils::~CFilterUtils()
{

}
//*******************************************************************
//
// FUNCTION: - GetFilterList
//
// RETURNS: -
//
// PARAMETERS: - REFCLSID clsidFilterClass [Filter Categories], FILTERINFOLIST &filterInfoList
//
// COMMENTS: - ¸ù¾Ý Filter Categories µÄGUID·µ»Ø£¬ÄÚ²¿filterµÄÁбí
//
//
//*******************************************************************

void CFilterUtils::GetFilterList(REFCLSID clsidFilterClass, FILTERINFOLIST &filterInfoList)
{
ICreateDevEnum *pDevEnum = NULL;
IEnumMoniker *pEnum = NULL;
filterInfoList.clear();

// Create the System Device Enumerator.
HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL,
CLSCTX_INPROC_SERVER, IID_ICreateDevEnum,
reinterpret_cast<void**>(&pDevEnum));
if (SUCCEEDED(hr))
{
// Create an enumerator for the video capture category.
hr = pDevEnum->CreateClassEnumerator(
clsidFilterClass,
&pEnum, 0);
if (FAILED(hr))
pDevEnum->Release();

}
else
return;


IMoniker *pMoniker = NULL;
while (pEnum->Next(1, &pMoniker, NULL) == S_OK)
{
IPropertyBag *pPropBag;
hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag,
(void**)(&pPropBag));
if (FAILED(hr))
{
pMoniker->Release();
continue; // Skip this one, maybe the next one will work.
}

FILTERINFO di;

LPOLESTR strName = NULL;
hr = pMoniker->GetDisplayName(NULL, NULL, &strName);
if (SUCCEEDED(hr))
{// Find the description or friendly name.
di.name = strName;
VARIANT varName;
VariantInit(&varName);
hr = pPropBag->Read(L"Description", &varName, 0);
if (FAILED(hr))
{
hr = pPropBag->Read(L"FriendlyName", &varName, 0);
}
di.descript = varName;
VariantClear(&varName);
filterInfoList.insert(filterInfoList.end(),di);
}

pPropBag->Release();
pMoniker->Release();
}
pDevEnum->Release();
}
//*******************************************************************
//
// FUNCTION: - GetFilter
//
// RETURNS: - IBaseFilter *
//
// PARAMETERS: - const _bstr_t &filterName [filter Moniker]
//
// COMMENTS: - ¸ù¾ÝFilter Moniker Ãû£¬µÃµ½Filter Interface
//
//
//*******************************************************************

IBaseFilter *CFilterUtils::GetFilter(const _bstr_t &filterName)
{
// Video capture category
IBindCtx *pBindCtx;
HRESULT hr = CreateBindCtx(0, &pBindCtx);

ULONG chEaten = 0;
IMoniker *pMoniker = 0;
hr = MkParseDisplayName(pBindCtx, filterName, &chEaten, &pMoniker);
pBindCtx->Release();
if (SUCCEEDED(hr))
{
// Get the display name, or bind to a DirectShow filter.
IBaseFilter *pFilter;
hr = pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter,
(void**)&pFilter);

pMoniker->Release();
return pFilter;
}

return NULL;
}
//*******************************************************************
//
// FUNCTION: - ReleaseFilter
//
// RETURNS: -
//
// PARAMETERS: - IBaseFilter * pFilter [filter object pointer]
//
// COMMENTS: - ÊÍ·Åinterface Filter
//
//
//*******************************************************************
void CFilterUtils::ReleaseFilter(IBaseFilter * pFilter)
{
SAFE_RELEASE(pFilter);
}


HRESULT CFilterUtils::GetPin(IBaseFilter *pFilter, PIN_DIRECTION PinDir, IPin **ppPin)
{
*ppPin = 0;
IEnumPins *pEnum = 0;
IPin *pPin = 0;
HRESULT hr = pFilter->EnumPins(&pEnum);
if (FAILED(hr))
{
return hr;
}
while (pEnum->Next(1, &pPin, NULL) == S_OK)
{
PIN_DIRECTION ThisPinDir;
pPin->QueryDirection(&ThisPinDir);
if (ThisPinDir == PinDir)
{
IPin *pTmp = 0;
hr = pPin->ConnectedTo(&pTmp);
if (SUCCEEDED(hr)) // Already connected, not the pin we want.
{
pTmp->Release();
}
else // Unconnected, this is the pin we want.
{
pEnum->Release();
*ppPin = pPin;
return S_OK;
}
}
pPin->Release();
}
pEnum->Release();
// Did not find a matching pin.
return E_FAIL;

}

HRESULT CFilterUtils::ConnectFilters(IGraphBuilder *pGraph, IBaseFilter *pFirst, IBaseFilter *pSecond)
{
IPin *pOut = NULL, *pIn = NULL;
HRESULT hr = GetPin(pFirst, PINDIR_OUTPUT, &pOut);
if (FAILED(hr)) return hr;
hr = GetPin(pSecond, PINDIR_INPUT, &pIn);
if (FAILED(hr))
{
pOut->Release();
return E_FAIL;
}
hr = pGraph->Connect(pOut, pIn);
pIn->Release();
pOut->Release();
if (FAILED(hr))
{
OutputDebugString("Create Filter Failed\n");
}
return hr;
}




frankgogoland 2003-08-25
  • 打赏
  • 举报
回复
能够说的根具体一些吗?我现在急需这个方案,谢谢
gxqcdit 2003-08-25
  • 打赏
  • 举报
回复
你的意思是要获得经过MP3压缩后的数据吗?
gxqcdit 2003-08-22
  • 打赏
  • 举报
回复
这时候需要调用:
hr = pSrcOut->Connect(pDecoIn, &mt);
就是将它的媒体类型指定.

2,542

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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