求问directshow中的数据传输

nosilence_2007 2008-02-27 05:21:39


dmo中的数据传输主要是通过不停调用InternalProcessInput()和InternalProcessOutput() 实现,假如我做AMR的encoder DMO,我手上的库中编码数据是每次编码160个word16的数据(while (fread (new_speech, sizeof (Word16), L_FRAME, file_speech) == 160))

但是现在我遇到一个问题,如果硬件中每次通过InternalProcessInput()穿进来的数据量是16000个byte数据,但是每个数据是16位bit表示,就是说有50帧数据,大大超过了1帧

这个时候该怎么办呢?
...全文
97 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
nosilence_2007 2008-03-03
  • 打赏
  • 举报
回复
to fire: 这个问题我已经解决了

不过真的非常感谢你



可以在没有完全输出去的时候 buffer的dwFlags=INComplete 然后等全部输出之后再重新置位 就好了
firebolt2002 2008-02-29
  • 打赏
  • 举报
回复
InternalAcceptingInput 返回 S_FALSE 等你处理完先前输入的数据后再返回 S_OK 告诉播放器可以输入新的数据了
这句话的确有毛病,呵呵。
我的意思是说播放器在输入数据之前DMO的GetInputStatus方法查询当前的状态,如果dwFlags = DMO_INPUT_STATUSF_ACCEPT_DATA 表示可以继续输入新的数据。
GetInputStatus 方法在IMediaObjectImpl的实现里会调用InternalAcceptingInput函数,InternalAcceptingInput如果返回 s-false表示不需要更多的数据
nosilence_2007 2008-02-29
  • 打赏
  • 举报
回复

“InternalAcceptingInput 返回 S_FALSE 等你处理完先前输入的数据后再返回 S_OK 告诉播放器可以输入新的数据了” 这句话没问题么?

因为我在processout中设置了一个参数numbytes,然后numbytes-=320; 等numbytes<320的时候 定义变量 nextframe=ture;然后函数改写成:

HRESULT CAMREnc::InternalFlush()
{
#ifdef yjj_debug
printf("InternalFlush()\n");
#endif

InternalDiscontinuity(0);

return S_OK;
}
HRESULT CAMREnc::InternalDiscontinuity(DWORD dwInputStreamIndex)
{
nextframe=true;
return S_OK;
}

HRESULT CAMREnc::InternalAcceptingInput(DWORD dwInputStreamIndex)
{

HRESULT hr= nextframe == true ? S_OK : S_FALSE;
if(nextframe==true)
printf("nononono\n");
if(hr==S_OK)
printf("InternalAcceptingInput() is ok\n");
return hr;
}


但是这样的话 第一次processout后,数据并没有编码完 但是还是processinput了

如果InternalDiscontinuity()中删去nextframe=true;那么就一直在执行InternalAcceptingInput()!!!!
不会调用processout()

那么剩下的数据怎么办? 你说的这种方法怎么才能成功呢?

除非在InternalAcceptingInput()函数中继续调用processout()
nosilence_2007 2008-02-28
  • 打赏
  • 举报
回复
在 processinput 里面加上:

if(m_pBuffer)
{
DWORD dataLength = 0;
// DWORD maxlength;
m_pBuffer->GetBufferAndLength(&pInData, &indatalen);
printf("indatalen=%d\n",indatalen);
memcpy(new_speech,pInData,sizeof(Word16)*L_FRAME);
/* if(indatalen-sizeof(Word16)*L_FRAME > 0)
m_pBuffer->SetLength(indatalen-sizeof(Word16)*L_FRAME);
else
m_pBuffer->SetLength(0);
*/
}

这样可以么?

谢谢
nosilence_2007 2008-02-28
  • 打赏
  • 举报
回复
to firebolt2002 :

在InternalProcessInput()函数中,HRESULT hr = pBuffer->GetBufferAndLength(&m_pbData, &m_cbData);
其中m_cbData=4000;
然后memcpy(new_fpe,m_pbData,m_cbData) 考入输入的buf中 这样的话对buffer的指针好像没影响啊


InternalAcceptingInput这样返回的肯定还是S_OK的啊
SuperKan 2008-02-28
  • 打赏
  • 举报
回复
你将输出buf设置大一点,对输入的16000个byte的数据进行多次编码,一次性输出不就行了?
nosilence_2007 2008-02-28
  • 打赏
  • 举报
回复
我这里定义这个函数是:

HRESULT CAMREnc::InternalAcceptingInput(DWORD dwInputStreamIndex)
{
#ifdef yjj_debug
printf("InternalAcceptingInput()\n");
#endif
HRESULT hr= m_pBuffer == NULL ? S_OK : S_FALSE;
if(hr==S_OK)
printf("InternalAcceptingInput() is ok\n");
return hr;
}
firebolt2002 2008-02-28
  • 打赏
  • 举报
回复
InternalAcceptingInput 的返回值和m_pBuffer有什么必然联系么?你可以自己设置一个变量来表示啊
firebolt2002 2008-02-27
  • 打赏
  • 举报
回复
InternalAcceptingInput 返回 S_FALSE 等你处理完先前输入的数据后再返回 S_OK 告诉播放器可以输入新的数据了

2,554

社区成员

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

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