mpeg4网络视频传输
2008-12-30 11:04
579 查看
我目前搭建的mpeg4网络视频传输系统很简单:
只有视频没有音频
网络打包发送和接受的sender和receiver filter由directx9.0里面的dsnetwork例子修改而来
因此只有网络组播功能,没有rtp功能(这个功能大家可以尝试用jrtplib.lib解决)
我没有深入探讨dsnetwork的机理,只是简单把原例子的mpeg-2改成了自己所需的编码格式,实际上我是改成了DIVX格式。。实际运行中,使用不同的coder和decoder会有不同的效果,有些效果不错,有些甚至不能解码!!!我不准备探讨其中原因了,我只知道用divx代替原例中的mpeg-2效果不错(divx的版本也有影响,我用的是5.02,大家可以尝试),而用xvid则无法解码!
我的filter graph如下:
发送端:10moons sdk2000 video capture--->divx coder---->multicast sender
接受端:multicast receiver---->divx decoder----->video renderer
除了sender和receiver这两个filter,其他filter都可以从directshow直接获取
刚才说了,sender和receiver是从dsnetwork修改而来的
就是把其中的dssend.cpp和dsrecv.cpp中的getmediatype和checkmediatype函数修改了一下
将原来的mpeg2改成你所要的压缩格式
修改方法如下:
1.dssend.cpp中作如下修改,并把checkmediatype函数去掉(这是我用的简易方法,你也可以修改checkmediatype函数使之适用于你的压缩格式)
-------------------------------------------------------------------------------
CInputPin::GetMediaType (
IN int iPos,
OUT CMediaType * pmt
)
{
ASSERT (pmt) ;
if (iPos == 0) {
pmt -> InitMediaType () ;
////////修改了DSnetwork原有的MPEG2的MEDIATYPE和MEDIASUBTYPE
pmt -> SetType (& MEDIATYPE_Video) ;
pmt -> SetSubtype (& TIME_FORMAT_NONE) ;//适应任何形式
return S_OK ;
}
return VFW_S_NO_MORE_ITEMS ;
}
-------------------------------------------------------------------
2.在dsrecv.cpp中作如下修改,并把checkmediatype函数去掉
----------------------------------------------------------------------
CNetOutputPin::GetMediaType (
IN int iPosition,
OUT CMediaType * pmt
)
{
HRESULT hr ;
if (iPosition == 0) {
ASSERT (pmt) ;
pmt -> InitMediaType () ;
////////修改了DSnetwork原有的MPEG2的MEDIATYPE和MEDIASUBTYPE, 注意DIVX是在dsrecv.h定义的GUID
pmt -> SetType (& MEDIATYPE_Video) ;
pmt -> SetSubtype (& DIVX) ;
////////设置outputpin的Format
VIDEOINFO *pvi = (VIDEOINFO *) pmt->AllocFormatBuffer(sizeof(VIDEOINFO));
ZeroMemory(pvi, sizeof(VIDEOINFO));
DWORD fccXvid = '3VID';
pvi->bmiHeader.biCompression = fccXvid;
pvi->bmiHeader.biBitCount = 24;
pvi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pvi->bmiHeader.biWidth = 320;
pvi->bmiHeader.biHeight = 240;
//pvi->bmiHeader.biPlanes = 1;
pvi->bmiHeader.biSizeImage = GetBitmapSize(&pvi->bmiHeader);
SetRectEmpty(&(pvi->rcSource));
SetRectEmpty(&(pvi->rcTarget));
pmt->SetFormatType(&FORMAT_VideoInfo);
//pmt->SetTemporalCompression(FALSE);
pmt->SetSampleSize(pvi->bmiHeader.biSizeImage);
///////////////////////////
hr = S_OK ;
}
else {
hr = VFW_S_NO_MORE_ITEMS ;
}
return hr ;
}
------------------------------------------------------------------
3.在dsrecv.h中加入以下句子,注意这段guid是根据你所要的压缩格式修改的,这里用的是我使用的divx5.02版本的guid
-------------------------------------------------------------------------
DEFINE_GUID(DIVX, 0x33564944, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71);
---------------------------------------------------------------------------
ok,就改这么多东西就可以把dsnetwork变成你所需要的东西拉。。
只有视频没有音频
网络打包发送和接受的sender和receiver filter由directx9.0里面的dsnetwork例子修改而来
因此只有网络组播功能,没有rtp功能(这个功能大家可以尝试用jrtplib.lib解决)
我没有深入探讨dsnetwork的机理,只是简单把原例子的mpeg-2改成了自己所需的编码格式,实际上我是改成了DIVX格式。。实际运行中,使用不同的coder和decoder会有不同的效果,有些效果不错,有些甚至不能解码!!!我不准备探讨其中原因了,我只知道用divx代替原例中的mpeg-2效果不错(divx的版本也有影响,我用的是5.02,大家可以尝试),而用xvid则无法解码!
我的filter graph如下:
发送端:10moons sdk2000 video capture--->divx coder---->multicast sender
接受端:multicast receiver---->divx decoder----->video renderer
除了sender和receiver这两个filter,其他filter都可以从directshow直接获取
刚才说了,sender和receiver是从dsnetwork修改而来的
就是把其中的dssend.cpp和dsrecv.cpp中的getmediatype和checkmediatype函数修改了一下
将原来的mpeg2改成你所要的压缩格式
修改方法如下:
1.dssend.cpp中作如下修改,并把checkmediatype函数去掉(这是我用的简易方法,你也可以修改checkmediatype函数使之适用于你的压缩格式)
-------------------------------------------------------------------------------
CInputPin::GetMediaType (
IN int iPos,
OUT CMediaType * pmt
)
{
ASSERT (pmt) ;
if (iPos == 0) {
pmt -> InitMediaType () ;
////////修改了DSnetwork原有的MPEG2的MEDIATYPE和MEDIASUBTYPE
pmt -> SetType (& MEDIATYPE_Video) ;
pmt -> SetSubtype (& TIME_FORMAT_NONE) ;//适应任何形式
return S_OK ;
}
return VFW_S_NO_MORE_ITEMS ;
}
-------------------------------------------------------------------
2.在dsrecv.cpp中作如下修改,并把checkmediatype函数去掉
----------------------------------------------------------------------
CNetOutputPin::GetMediaType (
IN int iPosition,
OUT CMediaType * pmt
)
{
HRESULT hr ;
if (iPosition == 0) {
ASSERT (pmt) ;
pmt -> InitMediaType () ;
////////修改了DSnetwork原有的MPEG2的MEDIATYPE和MEDIASUBTYPE, 注意DIVX是在dsrecv.h定义的GUID
pmt -> SetType (& MEDIATYPE_Video) ;
pmt -> SetSubtype (& DIVX) ;
////////设置outputpin的Format
VIDEOINFO *pvi = (VIDEOINFO *) pmt->AllocFormatBuffer(sizeof(VIDEOINFO));
ZeroMemory(pvi, sizeof(VIDEOINFO));
DWORD fccXvid = '3VID';
pvi->bmiHeader.biCompression = fccXvid;
pvi->bmiHeader.biBitCount = 24;
pvi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pvi->bmiHeader.biWidth = 320;
pvi->bmiHeader.biHeight = 240;
//pvi->bmiHeader.biPlanes = 1;
pvi->bmiHeader.biSizeImage = GetBitmapSize(&pvi->bmiHeader);
SetRectEmpty(&(pvi->rcSource));
SetRectEmpty(&(pvi->rcTarget));
pmt->SetFormatType(&FORMAT_VideoInfo);
//pmt->SetTemporalCompression(FALSE);
pmt->SetSampleSize(pvi->bmiHeader.biSizeImage);
///////////////////////////
hr = S_OK ;
}
else {
hr = VFW_S_NO_MORE_ITEMS ;
}
return hr ;
}
------------------------------------------------------------------
3.在dsrecv.h中加入以下句子,注意这段guid是根据你所要的压缩格式修改的,这里用的是我使用的divx5.02版本的guid
-------------------------------------------------------------------------
DEFINE_GUID(DIVX, 0x33564944, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71);
---------------------------------------------------------------------------
ok,就改这么多东西就可以把dsnetwork变成你所需要的东西拉。。
相关文章推荐
- 网络MPEG4视频传输(基于Xvid库)Demo
- 网络高清视频监控传输:如何减少带宽消耗?
- 数字视频网络传输层协议的选择
- 通信工具的音视频的网络传输实现
- Android IOS WebRTC 音视频开发总结(五七)-- 网络传输上的一种QoS方案
- 网络协议之rtp---rtp 传输视频及加密
- 技术分析:在无线网络上传输音/视频
- 流式传输 锁定 本词条由“科普中国”百科科学词条编写与应用工作项目 审核 。 流式传输定义很广泛,现在主要指通过网络传送流媒体(如视频、音频)的技术总称。其特定含义为通过Internet 将影视节目传
- QT+Opencv视频文件TCP网络传输
- [转]数字视频网络传输层协议的选择
- (转)利用VC++实现局域网实时视频传输(网络视频)
- 网络传输Socket:用于文件传输、视频聊天
- 网络视频传输的服务质量(QoS)
- 网络视频传输协议
- 网络编程:基于TCP的socket网络传输视频(C++, python)
- 视频网络传输机制的设计(续)
- 音视频网络传输技术在安防系统中的应用
- [置顶] 基于iOS的网络音视频实时传输系统(三)- VideoToolbox编码音视频数据为H264、AAC
- rtp c++ 网络视频传输
- 网络视频传输的服务质量(QoS)