视频流的数据量巨大,如果要在不同的进程间传输视频流就必须考虑一些数据传输的底层问题,比如尽量不要做拷贝。以及互斥问题,不能一个程序还没把一张图片读完,共享的内存就被改变了。
EGLStream就提供了这样一种功能,支持多个进程间进行无拷贝的视频流传输。
EGLStream主要原理是设置了producer和consumer。producer负责把图片放入到EGLStream流中,consumer主要是把图片从流上取出来。
流是一系列顺序执行的命令。所以一个进程可以作为上一个命令的consumer,同时又是下一个命令的producer。
大概流程是这样(把EGLStream比作一个信箱,producer负责把信放入信箱中,consumer负责把信拿出来,信箱里面最多放一张图片。):
- producer得到一张新的图片,然后检查信箱里面是否有信,如果有的话就把这封旧的信扔掉。然后把新的图片(信)放入信箱中。这个过程一直循环。
- consumer处理完上一张图片,然后检查信箱,如果没有信就把刚才处理完的信放回信箱。如果有新的信,就把刚处理完的丢弃,把信的信拿出来处理。这个过程一直循环。
情况分析:
- 如果consumer的处理速度慢于producer的生产速度:也就是consumer一个循环的时间,producer就来来回回在信箱里面放了好多张图片,又丢弃了好多张图片。这些图片相当于被consumer忽略了。相当于没有处理过来的图片就直接跳过。
- 如果consumer的处理速度快于producer的生产速度:consumer处理完一张图片后(把信拿出信箱后,信箱就空了,毕竟不能做拷贝嘛,一张图片永远只有一份,comsumer处理的时候,这张图片任何其他进程都不能动),发现没有新的图片被放入信箱,于是把处理完的图片放回另外一个信箱(consumer变成producer了),然后下一步骤的程序就可以从另外一个信箱中取出当前步骤处理后的图片。
- 最终结果就是不同步骤在同时处理不同的图片。
EGLStream具体使用方法可以参考下面的例子,EGLStream是CUDA的一个扩展,所以安装好CUDA,就可以使用EGLStream了。