我正在尝试在Firefox上测试基本的getUserMedia()函数。我的测试得到了最奇怪的结果。
我正在运行以下Javascript代码:
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia
|| navigator.mozGetUserMedia || navigator.msGetUserMedia;
/*
* Set up desired constraints
*/
var constraints = { audio:false,video:true };
/*
* This function to be called upon successful stream creation(?)
*/
function madeStream(aStream) {
var video = document.querySelector("video");
window.stream = aStream;
video.src = window.URL.createObjectURL(aStream);
/*
* At this point, we play the video!
*/
video.play();
}
/*
* This function is to be called should the attempt to create the stream fail.
*/
function failureWarning(theFail) {
alert("Failed to get user media! "+theFail);
}
if(navigator.getUserMedia) {
navigator.getUserMedia(constraints,madeStream,failureWarning);
}
else
{
alert("This video function is not supported on this browser!");
}
我的HTML文件使用基本视频标记:
<video autoplay></video>
我已经针对API文档多次检查了代码。据我所知,我正确使用它。
问题是,视频在我的浏览器中表现不一致。这种不一致不是在不同的浏览器之间,而是在同一浏览器的安装之间!
我试图在4台不同的机器上运行此测试:
计算机1是运行Firefox版本31.0的Macintosh
Machine 2是运行Windows 7和Firefox版本31.0的Windows计算机
Machine 3是运行Windows 8.0和Firefox版本31.0的Windows笔记本电脑
Machine 4是运行Windows 81和Firefox版本31.0的Windows笔记本电脑
强调注意:所有计算机都使用Firefox版本31.0。
所有机器在访问网页时都正确地请求访问摄像机(注意:在我的约束条件下,音频设置为false)。
当我在机器1上授予访问权限时,我会看到本地视频。
当我在机器2上授予访问权限时,我什么都没看到。
当我在机器3上授予访问权限时,我会看到本地视频。
当我在Machine 4上授予访问权限时,我什么都没看到。
重要提示:相机会在所有机器上开启。调试Javascript代码,我看到成功获取了MediaStream对象,并且成功调用了视频播放功能。
进一步调试显示动态更改视频源以反映所获取的MediaStream对象。将对象添加到视频标记的典型结果如下所示:
<video src="mediastream:f7b34f2e-55d5-9148-ae7c-dfec4e436dde" autoplay=""></video>
这一切在所有机器上都以相同的方式发生,同样所有机器都运行相同版本的Firefox。
我进一步发现,当视频标记首次在浏览器上呈现时,它显示为空的Flash对象。在计算机1和3上,此对象在视频标记源更改时更改为正在运行的MediaStream视频。出于某种原因,在计算机2和4上,视频标记不会更新,但会继续显示为保持为空的Flash对象(似乎没有显示任何内容)。
这显然是Firefox浏览器的不一致行为。不幸的是,虽然我知道发生了什么,但我不知道为什么会这样。我确信机器2和4上有一些东西导致他们无法更新视频标签,但我看不出它可能是什么。我需要了解这些机器是什么,它们决定了MediaStream视频是否会显示,以便让所有机器都能保持一致。
它不是Firefox版本,因为它们都是相同的版本。
这不是操作系统,因为一个正在使用Macintosh而另一个正在使用Windows版本。
有人能想到导致视频在一台计算机上运行而另一台计算机出现故障的其他因素或配置吗?
有人请指教。