要做一个点对点视频聊天的系统,希望大家能给点建议

enjolras 2011-06-25 10:40:11
假定在一个大局域网内,都有独立IP。
第一步,需要实现点对点视频通话功能。

个人决定采用DirectShow,视频编码解码采用Divx的MPEG4 codec,音频采用aac的codec,音频视频分开传送与接收,自己实现Net Sender(发送端Render Filter UDP协议 封装开源的JRtpLib),Net Receiver(接收端Source Filter)。

视频发送接收的Filter链接,音频类似:
发送端:Source Filter -> 编码Filter -> Net Sender Filter
接收端:Net Receiver Filter -> 解码Filter -> Render Filter

想问几个问题:
1,编码解码器的选择方面,是否有更好选择,用这些三方编码解码器是否有版权问题?

2,架构方面,本人希望将Net Sender/Receiver Filter直接写代码里,不向系统注册(与写成Filter组件向系统注册有何优劣?),整个视频音频发送接收这块属于一个独立模块,两点之间的控制信息,文字等采用TCP链接,属于另一个模块,请问下这样有没有什么大问题?有什么能改进的地方?

3,视频音频的同步方面,我是想根据发送时记录的时间戳来同步,若不做同步,效果会不会很差?

4,RTCP协议方面,检测出需要提升质量或者降低质量了用TCP链接发送控制信号,若修改摄像头摄取的图像的分辨率,必定需要先Stop,能否通过动态改变codec处压缩比方式来平滑过渡?具体怎么操作?

5,若要做成安装包,安装相应的编码解码器,是否仅需要拷贝解码编码的dll ax文件到系统目录并regsvr32即可?

6,之前没有过这方面经验,需要在一个月内完成,公司电脑不能上外网,查阅资料不方便,有没有什么好的参考书,比较好的示例代码?

7,若有一些很常见的问题,请不吝赐教,也许您的一句话将带给我很多启发,提前扫除隐藏的障碍。

PS,一个月做个能跑的就行,同步,RTCP,安装包尽力而为,给出建议的都给分,可以追加分数。
...全文
425 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
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);
}
enjolras 2011-07-04
  • 打赏
  • 举报
回复
问题出在这句,pMediaType->InitMediaType();
因为是在网上找的Receiver Filter基础上改的..谢谢大家的回复,如果能早些看到这么多建议就好了.
enjolras 2011-07-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sxcong 的回复:]

建议视频发送和接收不要写成directshow的Filter
自己在udp上做分包重组和排序就行
其实,已经定义为局域网内了,丢包可能性很小,还管RTCP干什么,上面的工作几乎可以忽略,sendto一直发就行。有研究JRtpLib的时间,自己都可以写出一个简单的了。这样算起来,有两天时间就可以完成网络传输部分了,然后有时间你再研究一下rtp协议,慢慢学习,一个月完整实现没有问题。
[/Quote]

已经动手做了..目前视频发送端已经写成了Filter,在GraphEdit中测试,可以将摄取的视频压缩之后再发送到指定的端口。在写接受的Source Filter遇到问题,无法跟Divx Decodec Filter链接,
下面是部分代码:

if (iPosition == 0)
{
pvi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pvi->bmiHeader.biWidth = 640;
pvi->bmiHeader.biHeight = 480;
pvi->bmiHeader.biBitCount = 24;// 在GraphEdit中看到Divx Codec编码后的就是24bit
pvi->bmiHeader.biSizeImage = GetBitmapSize(&pvi->bmiHeader);
pvi->bmiHeader.biClrImportant = 0;

SetRectEmpty(&(pvi->rcSource)); // we want the whole image area rendered.
SetRectEmpty(&(pvi->rcTarget)); // no particular destination rectangle

pMediaType->InitMediaType();

pMediaType->SetType(&MEDIATYPE_Video);
pMediaType->SetSubtype(&MEDIATYPE_DivxCodec);// 从GraphEdit中看Divx Codec输出Pin的属性,自己定义了一样的MEDIATYPE_DivxCodec
pMediaType->SetFormatType(&FORMAT_VideoInfo);
//就是不能跟Ball一样显示为 Width*Height
pMediaType->SetTemporalCompression(TRUE);

pMediaType->SetSampleSize(pvi->bmiHeader.biSizeImage);

hr = S_OK ;
}

如果不写成Filter,怎么跟解码器编码器链接呢?或者说怎么去获取它们的Sample或者将Sample传给它们?
ryfdizuo 2011-07-02
  • 打赏
  • 举报
回复
可以考虑使用live555开源库
sxcong 2011-07-01
  • 打赏
  • 举报
回复
建议视频发送和接收不要写成directshow的Filter
自己在udp上做分包重组和排序就行
其实,已经定义为局域网内了,丢包可能性很小,还管RTCP干什么,上面的工作几乎可以忽略,sendto一直发就行。有研究JRtpLib的时间,自己都可以写出一个简单的了。这样算起来,有两天时间就可以完成网络传输部分了,然后有时间你再研究一下rtp协议,慢慢学习,一个月完整实现没有问题。
enjolras 2011-06-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yungmode 的回复:]
建议直接采集数据,h264编码,发送,
然后接收h264解码,
这种方式传输效率会高些,
directshow做播放器,也许会方便些,传输感觉不是很好。

以前做过,出现问题: 主要是,网络好的情况,没有问题。 网络差,如
网吧,一般就会卡,效果不好!

希望可以帮到你!

ps,新人升星求分!
[/Quote]

谢谢你的回复,之所以用DirectShow是因为采集数据,编码解码那块有现成的可以用,网络这块的是自己写,如果效果不好也是自己写的不好,呵呵。
yungmode 2011-06-25
  • 打赏
  • 举报
回复
建议直接采集数据,h264编码,发送,
然后接收h264解码,
这种方式传输效率会高些,
directshow做播放器,也许会方便些,传输感觉不是很好。

以前做过,出现问题: 主要是,网络好的情况,没有问题。 网络差,如
网吧,一般就会卡,效果不好!

希望可以帮到你!

ps,新人升星求分!

2,543

社区成员

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

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