为什么不Safari或Firefox能够从MediaElementSource处理音频数据?(Why

2019-07-17 10:47发布

无论是Safari或Firefox能够处理从音频数据MediaElementSource使用Web音频API。

 var audioContext, audioProcess, audioSource, result = document.createElement('h3'), output = document.createElement('span'), mp3 = '//www.jonathancoulton.com/wp-content/uploads/encodes/Smoking_Monkey/mp3/09_First_of_May_mp3_3a69021.mp3', ogg = '//upload.wikimedia.org/wikipedia/en/4/45/ACDC_-_Back_In_Black-sample.ogg', gotData = false, data, audio = new Audio(); function connect() { audioContext = window.AudioContext ? new AudioContext() : new webkitAudioContext(), audioSource = audioContext.createMediaElementSource( audio ), audioScript = audioContext.createScriptProcessor( 2048 ); audioSource.connect( audioScript ); audioSource.connect( audioContext.destination ); audioScript.connect( audioContext.destination ); audioScript.addEventListener('audioprocess', function(e){ if ((data = e.inputBuffer.getChannelData(0)[0]*3)) { output.innerHTML = Math.abs(data).toFixed(3); if (!gotData) gotData = true; } }, false); } (function setup(){ audio.volume = 1/3; audio.controls = true; audio.autoplay = true; audio.src = audio.canPlayType('audio/mpeg') ? mp3 : ogg; audio.addEventListener('canplay', connect); result.innerHTML = 'Channel Data: '; output.innerHTML = '0.000'; document.body.appendChild(result).appendChild(output); document.body.appendChild(audio); })(); 

是否有在不久的将来,以修补这个什么计划吗? 或者是有一些变通,将仍然提供了音频控制提供给用户?

对于苹果而言,这东西可以固定在,WebKit Nightlies版,否则我们将不得不等待,直到Safari浏览器8.0版来获得HTML5 <audio>与网络音频API很好地玩? 因为至少6.0版本网络音频API已在Safari中存在,我最初发布长这个问题的Safari浏览器7.0发布之前。 有没有这个是不是已经固定一个原因吗? 将它永远是固定的?

对于Mozilla,我知道你仍然在从旧音频数据API切换的过程,但是这是一个已知的问题与您的网络音频实现,并且它去的Firefox的下一个版本之前能解决吗?

Answer 1:

这个答案被引述几乎完全从我的回答一个相关的问题: 火狐25 AudioContext createJavaScriptNote不是一个函数

Firefox 没有支持MediaElementSource如果媒体附着在同源策略 ,但没有尝试使用媒体从远程起源于何时通过火狐产生误差。

规范是不是真的具体谈谈它(双关语意),但我一直在告诉我,这是一个预期的行为,这个问题实际上是与Chrome浏览器...这是眨眼实现(铬,歌剧),其需要更新要求CORS 。

MediaElementSource节点和交叉源媒体资源 :

From: Robert O'Callahan <robert@ocallahan.org>
Date: Tue, 23 Jul 2013 16:30:00 +1200
To: "public-audio@w3.org" <public-audio@w3.org>

HTML媒体元素可以从任何来源播放媒体资源。 当一个元素播放从页面的起源不同起点的媒体资源,我们必须防止网页脚本能够读取介质的内容(例如,提取视频帧或音频采样)。 特别是,我们应该防止ScriptProcessorNodes从能够访问这些媒体的音频样本。 我们也应该对在其他方面(如时序信道攻击)泄露样本信息。 目前,网络音频规范没有提到这一点。

我认为我们应该通过阻止进入网络音频任何非同源数据解决这个问题。 这将最大限度地减少攻击面和网络音频的影响。

我的建议是让MediaElementAudioSourceNode转换数据从非同一产地流沉默到来。

如果这一建议使得它成为规范这将是几乎不可能开发人员甚至没有意识到为什么他MediaElementSource不工作。 因为它的立场,现在,调用createMediaElementSource()的上<audio>的元素火狐26实际上停止 <audio>从所有工作的控制 ,并引发错误

您可以从远程起源的音频/视频数据做些什么危险的事情? 总的想法是,如果没有应用同源策略的MediaElementSource节点,一些恶意的JavaScript可以访问只有用户有权访问(会话,VPN,本地服务器,网络驱动器),并发送其内容,或者一些代表性媒体它-给攻击者。

HTML5的媒体元素没有默认情况下这些限制。 可以通过使用包括在所有浏览器远程媒体<audio><img><video>元素。 当你想操纵或提取的同源策略开始发挥作用,这些远程资源的数据这是唯一的。

[它]为您无法通过转储映像数据跨域同样的原因<canvas>媒体可能包含敏感信息,因此允许恶意网站转储和重新路由的内容是一个安全问题。 - @nmaier



Answer 2:

createMediaElementSource()不会在Safari 8.0.5正常工作(甚至更早),但固定在WebKit每日为10600.5.17,r183978



文章来源: Why aren't Safari or Firefox able to process audio data from MediaElementSource?