关于DirectShow网络视频传输程序

zengliu 2009-09-25 03:26:37
我的程序结构
采集---》压缩---》拆包---》发送

我现有的程序已经将采集到的视频图片通过UDP广播的方式进行了发送
为了减轻网络压力,图片通过了JPEG格式进行了压缩发送
客户端也已经将正常还原成视频了

经测试 采集摄像头或AV混合信号都没有问题,显示也很流畅;能以每秒30帧的速度进行播放
这也是在视频的分辨率不高的情况下
当采集的视频分辨率高了 发现压缩部分产生了瓶颈
当压缩分辨率在800*600时 采集的帧数就降下来了 都不到20帧
由于视频画面的复杂程度 有时都低到10帧 播放很不流畅

现在JPEG格式压缩已经不能胜任这项工作了
我想如果通过视频流的编码方式进行压缩应该可解决此问题

但现在碰到的问题是
我已经将采集到的视频信号送到下一级compressor filter,设置为了XviD MPEG-4 Codec进行编码
然后就不知道如何从编码器中得到编码压缩后的字节流???

我之前取视频图片是通过ISampleGrabber的两个函数回调(BufferCB,SampleCB)取得的
我也试过在compressor filter(XviD MPEG-4 Codec)编码器后将视频传送到ISampleGrabber中也获得
但获得的始终是位图 和没有经过编码的大小一样

也测试过编码器后写成视频文件,查看文件果真是被压缩了
我想应该是我获取方式的问题~~~

我已经郁闷了好一阵了,求救各位高手帮我一把,由衷的感激不尽!!!
...全文
478 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zengliu 2009-09-28
  • 打赏
  • 举报
回复
我现在在测试压力及对硬件的负荷
zengliu 2009-09-28
  • 打赏
  • 举报
回复
XviD MPEG-4 Codec 这个编码器
我在GraphEdit上测试正常, 不知我程序哪里设得不对

还有一怪事 我在GraphEdit上构建好整个编解码图 用的MPEG-4编码后在解码 然后显示
采集卡--->DivX 5.0.5 Codec--->Xvid MPEG-4 Video Decoder--->Video Renderer

1280*768分辨率 GraphEdit上测试帧在20左右 看上去还是比较顺畅

我将这个图构建在程序中 运行后几乎每秒4帧左右的速度 进行编解码显示
效率不应该是和GraphEdit上一样吗...奇怪了!

后又改成
采集卡--->Microsoft MPEG-4 Video Codec V3--->Mpeg43 Decoder DMO--->Video Renderer
在GraphEdit测试 和 程序中测试又是一样 CPU也差不多
koople 2009-09-27
  • 打赏
  • 举报
回复
XviD MPEG-4 Codec 这个编码器 是要看版本的,有些版本确实是有问题! 谢的话就不用说了,我也是个新手!
koople 2009-09-27
  • 打赏
  • 举报
回复
其实你可以将类似 subtype 30355844-0000-0010-8000-00aa00389b71 后面这些数据用Google搜索一下,就可以知道它是什么类型。
zengliu 2009-09-27
  • 打赏
  • 举报
回复
问题解决了!

//原始MediaType
majortype MEDIATYPE_Video
subtype MEDIASUBTYPE_RGB32
formattype FORMAT_VideoInfo

//通过XviD MPEG-4 Codec编码 输出MediaType
majortype 73646976-0000-0010-8000-00aa00389b71 MEDIATYPE_Video
subtype 44495658-0000-0010-8000-00aa00389b71 未知
formattype 05589f80-c356-11ce-bf01-00aa0055595a FORMAT_VideoInfo

//通过DivX 5.0.5 Codec编码 输出的MediaType
majortype 73646976-0000-0010-8000-00aa00389b71 MEDIATYPE_Video
subtype 30355844-0000-0010-8000-00aa00389b71 未知
formattype 05589f80-c356-11ce-bf01-00aa0055595a FORMAT_VideoInfo

由于subtype我不知道设置成什么类型,测试过程中我没有对这个参数进行设置
测试果然通过了


XviD MPEG-4 Codec测试出现了卡着不动的问题
DivX 5.0.5 Codec 测试通过
以下是通过DivX 5.0.5 Codec输出了每帧不同大小的数据,800*600分辨率都不过几十KB一帧
0.0177775 62537
0.0514322 26717
0.0849974 26683
0.1181226 29555
0.1512417 29568
0.1841009 29581
0.2172644 29564
0.2509233 29492
0.2839309 29513
0.3168968 30933

接下来我将对这些数据进行解码测试,看能不能还原成画面.

感激koople大哥帮我解决问题,以后得多多向你请教.
zengliu 2009-09-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wwwllg 的回复:]
ISampleGrabber所在位子不对,应该在压缩器之后。
[/Quote]
谢谢您的回答

您说的压缩器是指的XviD MPEG-4 Codec编码器吗?
但我是将ISampleGrabber接在XviD MPEG-4 Codec编码器之后啊?
是不是我理解错了?

大哥 在次请教您,期望您的回答。
koople 2009-09-26
  • 打赏
  • 举报
回复
你获取下XviD MPEG-4 Codec 输出pin的 媒体类型
zengliu 2009-09-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 koople 的回复:]
你可以仔细看看文档 IMediaSample接口是直接作用于Sample之上,而ISampleGrabber 是抓取一个Sample,还要设置类型。 可能就是你的ISampleGrabber的设置的媒体类型的问题。
[/Quote]

这个媒体类型似乎是与上游的过滤器的输出类型相匹配的
如果设置成其它类型将出现 “未找到可用于建立连接的介质筛选器组合”
大哥 您知道该如何设置吗? 我现在采用的是XviD MPEG-4 Codec这个编码,它的压缩比还可以
koople 2009-09-26
  • 打赏
  • 举报
回复
你可以仔细看看文档 IMediaSample接口是直接作用于Sample之上,而ISampleGrabber 是抓取一个Sample,还要设置类型。 可能就是你的ISampleGrabber的设置的媒体类型的问题。
zengliu 2009-09-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 koople 的回复:]
你可以看看 DirectShow开发包中 DSNetWork 这个例子,我觉得你有必要 自己写一个filter
[/Quote]
这个例子刚看了一下,很有参考价值

里面的发送端所发送的数据也是来自IMediaSample
自己写一个filter来获得IMediaSample与通过ISampleGrabber获得IMediaSample我想是不是都一样?
这是里面的部分DSNetWork中的代码

HRESULT
CNetworkSend::Send (
IN IMediaSample * pIMediaSample
)
{
BYTE * pbBuffer ;
HRESULT hr ;

// should have the receiver lock

// recover the buffer pointer and send it out
hr = pIMediaSample -> GetPointer (& pbBuffer) ;
if (SUCCEEDED (hr)) {
hr = m_pNetSender -> Send (
pbBuffer,
pIMediaSample -> GetActualDataLength ()
) ;
}

return hr ;
}

和我现在写的程序一样,是不是能说明我从IMediaSample中获取数据这种方式是没有问题的
我现在怀疑是上游的问题
是不是给ISampleGrabber设置SetMediaType方法的AMMediaType参数不对而导致的呢?

谢谢两位大哥的热情帮助,期待两位大哥能解决我的疑问...!
koople 2009-09-26
  • 打赏
  • 举报
回复
你可以看看 DirectShow开发包中 DSNetWork 这个例子,我觉得你有必要 自己写一个filter
UDX协议 2009-09-25
  • 打赏
  • 举报
回复
ISampleGrabber所在位子不对,应该在压缩器之后。

2,543

社区成员

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

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