200分: 采用DivX压缩格式的视频直播如何降低延迟???

gxqcdit 2004-01-29 08:21:02
服务器端的视频采用DivX 5.0.5压缩,在客户端接收数据包后按序组成各个视频帧.
数据包上有时间信息,我将这些时间设置到帧信息中,在FillBuffer()中设置:
pSample->SetTime(&m_llTimeStart, &m_llTimeEnd);

如上处理则视频有7-8秒的延迟.

如何降低视频播放的延迟呢?
...全文
195 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
gxqcdit 2004-02-03
  • 打赏
  • 举报
回复

我真傻,真的, 我原本以为客户端的数据是可以直接播放的, 却未料到在客户端也需要设置media time, 我真傻......
_____________________________________
                 祥林嫂

eivanlee 2004-02-03
  • 打赏
  • 举报
回复
恭喜楼主!

能否再讲的详细点,通俗点?“采集的频率”是什么?
gxqcdit 2004-02-03
  • 打赏
  • 举报
回复
终于解决了!!!!!!!!!!!!!!!!!!!!
原来是播放时间的设置问题!!!!!!!!!!!!!!!
需要按采集的频率播放!!!!!!!!!!!!!!!!!!!!!!!!1
gxqcdit 2004-02-03
  • 打赏
  • 举报
回复
ding.
cctv512 2004-02-03
  • 打赏
  • 举报
回复
祝贺!
gxqcdit 2004-02-02
  • 打赏
  • 举报
回复
音频采用SetTime(0,0)则音频立即播放之延迟很小;
视频采用SetTime(0,0)则客户端的视频Filte Graph几乎不启动!
cctv512 2004-02-02
  • 打赏
  • 举报
回复
音频采用SetTime(0,0)则音频立即播放之延迟很小;
视频采用SetTime(0,0)则客户端的视频Filte Graph几乎不启动!
show 2004-02-02
  • 打赏
  • 举报
回复
用SetTimer(0,0)试试.用SetTimer(0,0)试试.
用SetTimer(0,0)试试.用SetTimer(0,0)试试.
show 2004-02-02
  • 打赏
  • 举报
回复
可能是编码部分的问题。可能是编码部分的问题。
可能是编码部分的问题。可能是编码部分的问题。
gxqcdit 2004-02-02
  • 打赏
  • 举报
回复
??????
redleaves 2004-01-30
  • 打赏
  • 举报
回复
延迟和网络有十分大的关系.不考虑网络的情况下,这个延迟可以控制在0.1s以内.可是有网络的情况下就很不好办.不知道你说的情况是否考虑了网络延迟?通常,加上网络延迟,大概可以控制在3s以内(其实一般都在1s以内,只是有时候会卡).
gxqcdit 2004-01-30
  • 打赏
  • 举报
回复
客户程序的ChenkMediaType()如下:
HRESULT CRecvVideoSrcOutputPin::CheckMediaType(const CMediaType *pMediaType)
{
if (pMediaType == NULL)
return E_FAIL;

if(pMediaType->majortype != MEDIATYPE_Video)
{
return VFW_E_INVALIDMEDIATYPE;
}

if(pMediaType->subtype != MEDIASUBTYPE_DIVX)
{
return VFW_E_INVALIDMEDIATYPE;
}

if ((pMediaType->formattype == FORMAT_VideoInfo) &&
(pMediaType->cbFormat >= sizeof(VIDEOINFOHEADER)) &&
(pMediaType->pbFormat != NULL))
{
VIDEOINFOHEADER *pVih = (VIDEOINFOHEADER*)pMediaType->pbFormat;

if(pVih->AvgTimePerFrame == 333333 &&
pVih->bmiHeader.biBitCount == 24 &&
pVih->bmiHeader.biClrImportant == 0 &&
pVih->bmiHeader.biClrUsed == 0 &&
pVih->bmiHeader.biCompression == 808802372 &&
pVih->bmiHeader.biHeight == 240 &&
pVih->bmiHeader.biPlanes == 1 &&
pVih->bmiHeader.biSize == 40 &&
pVih->bmiHeader.biSizeImage == 460800 &&
pVih->bmiHeader.biWidth == 320 &&
pVih->bmiHeader.biXPelsPerMeter == 0 &&
pVih->bmiHeader.biYPelsPerMeter == 0)
{
return S_OK;
}
}

return E_FAIL;
}
gxqcdit 2004-01-30
  • 打赏
  • 举报
回复
我的机器配置:
Dell Dimension4600: Windows2000; CPU2.4G; 256M内存; 网卡Intel(R)Pro/100VE
我的服务器端及客户端都在该机器上服务程序在本机的10035端口发送视频数据,客户程序从端口接收数据.
客户程序的视频接收Filter的GetMediaType()和DecideBufferSize()如下:

HRESULT CRecvVideoSrcOutputPin::GetMediaType(CMediaType *pMediaType)
{
HRESULT hr = S_OK;
RECT rct = {0, 0, 0, 0};

CheckPointer(pMediaType, E_POINTER);
CAutoLock cAutoLock(m_pFilter->pStateLock());

ASSERT(pMediaType);

pMediaType->InitMediaType() ;
pMediaType->SetType(&MEDIATYPE_Video);

pMediaType->SetSubtype(&MEDIASUBTYPE_DIVX) ;
pMediaType->SetFormatType(&FORMAT_VideoInfo);
pMediaType->bFixedSizeSamples = 0;
pMediaType->bTemporalCompression = 1;
pMediaType->lSampleSize = 1;

// Allocate enough room for the VIDEOINFOHEADER
VIDEOINFOHEADER *pVih = (VIDEOINFOHEADER*)pMediaType->AllocFormatBuffer(sizeof(VIDEOINFOHEADER));
ZeroMemory(pVih, pMediaType->cbFormat);
pVih->rcSource = rct;
pVih->rcTarget = rct;
pVih->AvgTimePerFrame = 333333;
pVih->bmiHeader.biBitCount = 24;
pVih->bmiHeader.biClrImportant = 0;
pVih->bmiHeader.biClrUsed = 0;
pVih->bmiHeader.biCompression = 808802372;
pVih->bmiHeader.biHeight = 240;
pVih->bmiHeader.biPlanes = 1;
pVih->bmiHeader.biSize = 40;
pVih->bmiHeader.biSizeImage = 460800;
pVih->bmiHeader.biWidth = 320;
pVih->bmiHeader.biXPelsPerMeter = 0;
pVih->bmiHeader.biYPelsPerMeter = 0;

pMediaType->SetFormat((unsigned char*)&pVih, sizeof(VIDEOINFOHEADER));
pMediaType->SetTemporalCompression(TRUE);

return S_OK;
}

HRESULT CRecvVideoSrcOutputPin::DecideBufferSize(IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *ppropInputRequest)
{
ALLOCATOR_PROPERTIES pp;
pp.cbAlign = 1;
pp.cbBuffer = 230400; // 320 * 240 *3
pp.cbPrefix = 0;
pp.cBuffers = 1;
pAlloc->SetProperties(&pp, ppropInputRequest);

return S_OK;
}

采用DivX5.0.5压缩,这些格式信息都是从服务器程序的发送Filter的CheckMediaType()中得到的该发送Filter从CBaseRenderer继承而来.

按如上设置则视频有7-8秒的延迟.

我在服务程序和客户程序中均采用了陆其民的双缓冲结构.

由于在本机发送本机接收,所以不存在网络传输的问题.
gxqcdit 2004-01-30
  • 打赏
  • 举报
回复
在同一台机器上网络的影响应该很小.
-------------------------------------------------------------------------------
延迟和网络有十分大的关系.不考虑网络的情况下,这个延迟可以控制在0.1s以内.可是有网络的情况下就很不好办.不知道你说的情况是否考虑了网络延迟?通常,加上网络延迟,大概可以控制在3s以内(其实一般都在1s以内,只是有时候会卡).
cctv512 2004-01-30
  • 打赏
  • 举报
回复

我的服务器端的程序和客户程序都在同一台机器上,这样一来应该不考虑网络因素吧?!

bb123456789 2004-01-29
  • 打赏
  • 举报
回复
应该其他环节的问题!
MXHCXY 2004-01-29
  • 打赏
  • 举报
回复
请把你的机器配置,网络设备和具体的代码说的详细一些!
hell190109 2004-01-29
  • 打赏
  • 举报
回复
其他环节的,再讲的具体一点
karlson0211 2004-01-29
  • 打赏
  • 举报
回复
UP&&MARK

2,542

社区成员

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

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