网络接收H.264视频 解码显示!

jixiang19850126 2010-10-13 04:47:42
设计了H.264接收端的解码显示程序。所发的包是先发送一帧size,然后发送一帧图像。经过测试,在socket接受方面没有问题,但是在显示的时候,确实只能正常显示第一帧,然后画面就变得特别混乱!我跟踪了一下,len的值一开始返回的是size的大小,但是下一帧的时候却是返回1,再下一帧又变为size大小。我不知道视频不能正常显示是不是因为这个原因!请高手分析!
主要的代码部分如下:(不好意思,没分了)


while(1)
{
if(recv(socket,&size,2,0)!=2)
{
perror("recv error")
};

if(recv(socket,&wsabuf.buf[0],size,0)!=size)
{
perror("recv error")
size=0;
};
while(size>0)
{
len=avcodec_decode_video(pcodectx,picture,&got_picture,wsabuf.buf,size);
if(len<0)
{
exit(1);
}
if(got_picture)
{
int numBytes=avpicture_get_size(PIX_FMT_RGB24, pcodectx->width, pcodectx->height);
buffer=new uint8_t[numBytes];

avpicture_fill((AVPicture *)pframeRGB,buffer, PIX_FMT_RGB24,pcodectx->width, pcodectx->width);
int ret=img_convert((AVPicture *)pframeRGB, PIX_FMT_RGB24, (AVPicture *)picture, pcodectx->pix_fmt ,pcodectx->width,pcodectx->height);
displaypicture(pframeRGB->data[0],pcodectx->width,pcodectx->height);


}
size=0
}
}
...全文
459 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lbxxjl 2012-09-25
  • 打赏
  • 举报
回复

//接收端
void CCapture::ReceiveVedio(HWND m_hWnd)
{
HRESULT hr;
CoCreateInstance(CLSID_CaptureGraphBuilder2 , NULL, CLSCTX_INPROC,
IID_ICaptureGraphBuilder2, (void **) &pCapture);
hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **)&pReceiveGrap);
hr = CoCreateInstance(CLSID_DSNetReceive, NULL, CLSCTX_INPROC_SERVER,
IID_IBaseFilter, (void**)&pReceive); //接收端
hr = CoCreateInstance(CLSID_VideoDeCompressorCategory, NULL, CLSCTX_INPROC_SERVER,
IID_IBaseFilter, (void**)&pDecodec); //解码器
hr = CoCreateInstance(CLSID_VideoRenderer,0,CLSCTX_ALL,
IID_IBaseFilter,(void**)&pReceivePreview);
hr =pReceiveGrap->AddFilter(pReceive,L"Xvid Receive");
ParameterSetReceive(pReceive);

pCapture->SetFiltergraph(pReceiveGrap);
hr =pReceiveGrap->AddFilter(pDecodec,L"Xvid Decodec");
hr =pReceiveGrap->AddFilter(pReceivePreview,L"Previvew");
//连接引脚
IPin *p1Out=FindPin(pReceive,PINDIR_OUTPUT);
IPin *p2In=FindPin(pDecodec,PINDIR_INPUT);
hr=pReceiveGrap->Connect(p1Out,p2In);

IPin *p2Out=FindPin(pDecodec,PINDIR_OUTPUT);
IPin *p3In=FindPin(pReceivePreview,PINDIR_INPUT);
hr=pReceiveGrap->Connect(p2Out,p3In);

pReceiveGrap->QueryInterface(IID_IVideoWindow,(LPVOID*)&pReceiveViewWindow);
SetVideoWindow(m_hWnd,pReceiveViewWindow);
是小刘鸭啊 2011-05-22
  • 打赏
  • 举报
回复
楼主,能不能给我发一份你的解码显示程序啊?我现在在网上到处找,都找不着,很着急啊~
sjbingyan 2010-10-15
  • 打赏
  • 举报
回复
数据长度不对的话,会发生你说的现象。
size 大小为1的那包应该不是数据,如果没有用可以丢掉。
接收到的时间戳相同的数据需要合并成一包。
jixiang19850126 2010-10-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sjbingyan 的回复:]
数据长度不对的话,会发生你说的现象。
size 大小为1的那包应该不是数据,如果没有用可以丢掉。
接收到的时间戳相同的数据需要合并成一包。
[/Quote]谢谢你的回答!我不明白的就是 华恒给的linux端的程序大概就是这个样 我是按照他们的在vc中写的!size的值没有什么特别的 只是len的值在1和size的值之间轮流出现 而got_picture的值在len等于1的时候为200 在len的值等于size时为0 !是不是因为所用的解码函数与提供的linux的不一样啊 都是ffmpeg的啊 名字也一样啊
jixiang19850126 2010-10-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sjbingyan 的回复:]
数据长度不对的话,会发生你说的现象。
size 大小为1的那包应该不是数据,如果没有用可以丢掉。
接收到的时间戳相同的数据需要合并成一包。
[/Quote]谢谢你的回答!我不明白的就是 华恒给的linux端的程序大概就是这个样 我是按照他们的在vc中写的!size的值没有什么特别的 只是len的值在1和size的值之间轮流出现 而got_picture的值在len等于1的时候为200 在len的值等于size时为0 !是不是因为所用的解码函数与提供的linux的不一样啊 都是ffmpeg的啊 名字也一样啊

1,451

社区成员

发帖
与我相关
我的任务
社区描述
多媒体/设计/Flash/Silverlight 开发 图象工具使用
社区管理员
  • 图象工具使用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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