音频SourceFilter问题

土豆吞噬者 2010-03-29 09:28:29
我写了一个音频编码Filter,编码后用Sokcet发送
Graph流程如下
采集filter->我的音频编码Filter->Avi Mux->File Write 后面的Avi Mux和File Write 是测试用的

然后又写了一个SourceFilter用于接受音频数据,解码,填充缓冲区
我的音频解码Filter->Audio Render

可是最后播放出来的不仅断断续续而且压根不是正常的声音
我是用本地TCP测试的,所以通信应该不会有问题,况且一次才200多字节
后来干脆不解码 直接发送PCM数据 结果还是老样子
请各位看下是什么原因产生的?
代码如下
HRESULT CMyAudioSourceStream::FillBuffer(IMediaSample *pms)
{
CheckPointer(pms,E_POINTER);
BYTE *pData;
int DataLen;
pms->GetPointer(&pData);
DataLen=pms->GetSize();
int MyRecv=recv(aClient,buffer,AVCODEC_MAX_AUDIO_FRAME_SIZE,0);
if (MyRecv>0)
{
//int out_size=avcodec_decode_audio(c,(int16_t *)pData,&DataLen,(uint8_t *)&buffer[0],MyRecv);
//if (out_size>0 && DataLen>0)
//{
// pms->SetActualDataLength(DataLen);
// fwrite(pData,DataLen,1,TestFile);
//}
CopyMemory(pData,buffer,MyRecv);
//pms->SetSyncPoint(TRUE);
//pms->SetTime(0,0);
}
return NOERROR;
}


HRESULT CMyAudioEncoderFilter::Transform(IMediaSample *pIn, IMediaSample *pOut)
{
BYTE *DestBuffer=NULL;
BYTE *SourceBuffer=NULL;

//获取缓冲区指针
pIn->GetPointer(&SourceBuffer);
pOut->GetPointer(&DestBuffer);

//编码
//int out_size=avcodec_encode_audio(c,DestBuffer,pOut->GetSize(),(short *)SourceBuffer);

////如果编码成功
//if (out_size>0)
//{
// //fwrite(DestBuffer,out_size,1,TestFile);
// send(MyClient,(char *)DestBuffer,out_size,0);

//}
send(MyClient,(char *)SourceBuffer,pIn->GetActualDataLength(),0);
CopyMemory(DestBuffer,SourceBuffer,pIn->GetActualDataLength());
pOut->SetActualDataLength(pIn->GetActualDataLength());

return S_OK;
}



...全文
206 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
土豆吞噬者 2010-03-29
  • 打赏
  • 举报
回复
是不停的在发送和接受啊
fillbuffer是一直在调用的
Transform也是的啊
zhy987916 2010-03-29
  • 打赏
  • 举报
回复
很明显的问题啊,你要不停的发送和接收数据。发送方和接收方都要做循环的。
rageliu 2010-03-29
  • 打赏
  • 举报
回复
1。确定本地File Write 正确。
2。在1的前提下,socket传输后加个File Write ,看写出来的文件是否正确。
3。通过12基本能确定问题所在,再修改
土豆吞噬者 2010-03-29
  • 打赏
  • 举报
回复
顶到有人来看!
土豆吞噬者 2010-03-29
  • 打赏
  • 举报
回复
来人看看啊
hali999 2010-03-29
  • 打赏
  • 举报
回复
顶。。。。。。。。。。。。。。。。。
土豆吞噬者 2010-03-29
  • 打赏
  • 举报
回复
吃饭前再给自己顶一次
应该就是编码的问题
但我不知道具体是什么地方错了
土豆吞噬者 2010-03-29
  • 打赏
  • 举报
回复
音频编码函数avcodec_encode_audio不能一次性编码好吗?

我编码视频的时候编码一帧 调用一次avcodec_encode_video就好了

下面是关于编码函数返回值的说明 大家帮看下

video的
* @return On error a negative value is returned, otherwise the number of bytes
* used or zero if no frame could be decompressed.

audio的
* @return On error a negative value is returned, on success zero or the number
* of bytes used to encode the data read from the input buffer.

我英语不好 大家看下是否是2个的返回值的意思是不是不一样?
土豆吞噬者 2010-03-29
  • 打赏
  • 举报
回复
编码后写文件 播放后发现播放时间才1秒?我至少运行了4秒啊?而且也是杂音。。。
断点发现编码的函数返回值是OK的,现在咋办?
HRESULT CMyAudioEncoderFilter::Transform(IMediaSample *pIn, IMediaSample *pOut)
{
BYTE *DestBuffer=NULL;
BYTE *SourceBuffer=NULL;

//获取缓冲区指针
pIn->GetPointer(&SourceBuffer);
pOut->GetPointer(&DestBuffer);

//编码
int out_size=avcodec_encode_audio(c,DestBuffer,pOut->GetSize(),(short *)SourceBuffer);

//如果编码成功
if (out_size>0)
{
fwrite(DestBuffer,out_size,1,TestFile);
send(MyClient,(char *)DestBuffer,out_size,0);

}
CopyMemory(DestBuffer,SourceBuffer,pIn->GetActualDataLength());
pOut->SetActualDataLength(pIn->GetActualDataLength());
return S_OK;
}


rageliu 2010-03-29
  • 打赏
  • 举报
回复
就是啊,险要确定问题在哪儿嘛。

那就编码后写文件,看是否对,再传输后写文件,看传输过程有没有问题,
土豆吞噬者 2010-03-29
  • 打赏
  • 举报
回复
现在没用编码解码可以正常语音通信了 只不过有回音?怀疑是播放和采集都在一起的原因?

用了CODEC_ID_AAC编码解码还是出错

2,543

社区成员

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

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