我正在flash中构建视频聊天,一切都运行得很好,除了我试图检测其他用户是否正在发送工作视频流的部分。
其他用户不发送视频有几个原因。
- 其他用户没有相机
- 其他用户获得了相机,但相机目前正在被其他应用程序(Skype, Photo Booth, Google Talk等)占用
- 另一个用户有一个相机,但是不允许使用他/她的相机。
- (我猜是其他意想不到的问题…)
那么我如何检测我从其他用户接收的流是否是黑流(由于上述原因)使用NetStream类?
我想到的最接近的事情是添加一个计时器,从我从其他用户接收的流轮询currentFps()函数。但到目前为止,这看起来很不可靠,因为我可能会得到currentFps() == 0
,并因此显示一个错误,即使我在某些情况下实际上从流中获得了视频。这样做的原因是因为我每4秒轮询一次API的currentFPS函数,让我们说在00:00:04我得到"没有视频"根据轮询,但在00:00:05视频开始,因此我需要等到下一个勾选,直到错误信息消失
这是我当前的民意调查
function subscribingStatusPoll(e:TimerEvent):void {
if (subscribingStream.currentFPS == 0){
error.text = "No video found from the other user..."
} else {
error.text = "";
}
}
这是我能想到的唯一的hack I来检测这个,但这是不可靠的,我实际上更喜欢一种方法来立即检测我收到的流是否有一个工作视频附加到它,而不需要这个丑陋的轮询。
虽然我同意不从服务器端发送"空白"流,但您可能无法访问服务器端,因此它不适用于您的情况。在客户端,您可以每隔一段时间从流中抓取一个帧,并检查更改,或者只是查看时间戳(查找随时间的增加)。这些选项可能看起来有点粗糙,但它们绝对可以在Flash中工作。
如果我必须自己开发这个,我会从这个边缘检测代码开始,用播放流中的帧抓取替换网络摄像头抓取。
http://www.laserpirate.com/as3edgeandmotion/错误的做法。
尽管在接收端验证数据是一个好主意,但没有办法检测流是否是真实数据。
在你的情况下,正在发送的流不是一个真正的相机流,但它仍然是一个流。
没有此检测。
为什么不在发送客户机上处理验证呢?