使用DirectShow同时进行视频录制和播放

时间:2013-07-02 10:46:39

标签: c# c++ video directshow directshow.net

我应该开发一个记录和播放录制视频的应用程序,同时继续录制(不停止图形)。我知道如何使用和开发使用DirectShow,但我需要我的图形的架构。我应该使用哪些过滤器?

我是使用DirectShow和SampleGrabber使用原始视频做的,但是我应该压缩视频,我不知道如何在压缩视频文件中执行此操作(由于录制仍在继续,因此未关闭,因此会继续)。

我认为MPEG-2录制对我的应用来说是最好的,但请指导我应该使用的滤镜。

由于

2 个答案:

答案 0 :(得分:0)

您是否尝试过StreamBufferEngine

记录文件并同时观看它有点问题,因为Demuxer需要重新分析写入的文件,以了解新的部分。我从未见过这样的分离器。

另一个大问题是文件锁定! DirectShow文件编写器和大多数其他类似的过滤器锁定文件以进行写入。因此,没有其他进程可以打开文件进行阅读。

您正在搜索TimeShift系统。这里有一些第三方SDK。但它也可以使用自己的DirectShow过滤器实现,但您需要大量的时间和知识。我知道这是可能的,因为我已经在我公司的视频播放器中完成了它(utilius fairplay 5)。

答案 1 :(得分:0)

我在这个问题上工作了好几个星期,SBE在H264多路复用器的运输中表现不佳 我想出了一个解决方案,让我分享

首先,编码器需要具有较小的GOP,例如15而不是150,否则同步将花费一些时间,并且会被视为大问题。

这个想法是创建Directshow过滤器,从Live源过滤器开始 (https://www.codeproject.com/Articles/158053/DirectShow-Filters-Development-Part-2-Live-Source

修改了过滤器,而不是从外部程序输入帧。

添加winsock2,用于UDP绑定或多播组。 开始从实时源接收数据并将其采样到输出引脚。

建议始终使用Elecard SDk进行设置。 在发送器上,您可以使用nw渲染器,但不能在其中更改编码器GOP 所以打开图编辑并构建发送者图 桌面捕获->编码器-> mux-> nwrenderer。

您的新过滤器应该知道如何接收数据并将其显示在屏幕上

一旦有了工作,就可以继续将时移功能添加到过滤器中。

分配一个非常大的缓冲区,大小为200兆至1千兆字节,由您决定(在内存中) 发送到输出引脚的数据相同,将其复制到该缓冲区,并使用rd和wr索引使其循环。

您需要向过滤器添加界面,例如 1. GoLive 2.SetSeekPoint

我这样做的方式如下 我创建了一个从过滤器到主机(c#)的回调,该回调每1秒或更长时间发送一次时间和wr指针(取决于我需要的精度) 在主机中,我创建了这两个信息的列表。 现在在C#中,我有wr指针及其时间的列表。 易于搜索并将RD指针设置回过滤器。

过滤器具有以下两种模式: 1.实时发送当前接收到的数据 2.在搜索时,它从rd指针后面的大缓冲区发送数据。

希望它能理解