- objective-c - iOS 5 : Can you override UIAppearance customisations in specific classes?
- iphone - 如何将 CGFontRef 转换为 UIFont?
- ios - 以编程方式关闭标记的信息窗口 google maps iOS
- ios - Xcode 5 - 尝试验证存档时出现 "No application records were found"
我来到这里希望 SO 上可爱的人们可以帮助我解决我遇到的一些问题。
具体来说,每次我尝试使用 webkitAudioContext 的 decodeAudioData 方法时,它总是会触发带有空错误的错误处理程序。这是我目前使用的代码:
var soundArray;
var context = new webkitAudioContext();
function loadSound(soundName) {
var request = new XMLHttpRequest();
request.open('GET',soundName);
request.responseType = 'arraybuffer';
request.onload = function() {
context.decodeAudioData(this.response, function(buf) {
sounds[soundName] = buf;
},function(err) { console.log("err(decodeAudioData): "+err); });
}
request.send();
}
在这一点上,它不断地向控制台记录错误消息,说 err(decodeAudioData) = null
,主要是因为这正是我决定记录它的方式。无论如何,知道为什么会这样吗?
我正在使用 Chrome Canary v20.0.1121.0 来尝试让某些东西正常工作。但是,显然,它不起作用!那么,知道我可以做什么吗?如果需要任何新信息,请告诉我,我会根据需要进行更新。
最佳答案
真正的原因是 createBuffer 和 decodeAudioData 现在都有一个 Bug,并为它们应该正常播放的文件抛出奇怪的模糊 DOM 异常 12。但我们应该意识到这是一项新的和不断发展的技术,甚至感谢网络音频 API,因为它发生在我们身上的小奇迹。
它们缺少 header 边界上的流同步,任何合理的流式音频格式解码器都应从该开始。mp3 或许多 aac/adts 文件是流式文件格式。流媒体意味着您可以在任何地方剪切它们或插入附加任何东西(各种标签甚至图像艺术品)解码器不应该关心未知数据。解码器应该一直寻找,直到找到他知道并可以解码的 header 。
我拼凑了这个临时解决方案,该解决方案寻求最近的帧头开始并仅从该偏移量传递数据。
mp3 或 mp2 的每个音频帧(每 200 字节左右)都以 0XFFE 和 oxFFF 同步字上的 aac(adts) 开始 header ,正是出于这个原因。因此两者都将在 0xFFE 上同步。这是我目前用来播放以前未播放过的文件的代码。
我讨厌的是 arrayBuffer 没有 subarray() 像它的类型化子对象那样从不同的偏移量返回不同的 View ,而不是 slice() 返回的整个新数组副本。如果只有 webaudio api 接受 typedarrays 作为输入但不幸的是,创建 arraybuffer 的唯一方法似乎是巨大的 slice() 副本。谢天谢地,通常只需要一两次寻道。
node={};
node.url='usual_mp3_with_tags_or_album_artwork.mp3';
function syncStream(node){ // should be done by api itself. and hopefully will.
var buf8 = new Uint8Array(node.buf);
buf8.indexOf = Array.prototype.indexOf;
var i=node.sync, b=buf8;
while(1) {
node.retry++;
i=b.indexOf(0xFF,i); if(i==-1 || (b[i+1] & 0xE0 == 0xE0 )) break;
i++;
}
if(i!=-1) {
var tmp=node.buf.slice(i); //carefull there it returns copy
delete(node.buf); node.buf=null;
node.buf=tmp;
node.sync=i;
return true;
}
return false;
}
function decode(node) {
try{
context.decodeAudioData(node.buf,
function(decoded){
node.source = context.createBufferSource();
node.source.connect(context.destination);
node.source.buffer=decoded;
node.source.noteOn(0);
},
function(){ // only on error attempt to sync on frame boundary
if(syncStream(node)) decode(node);
});
} catch(e) {
log('decode exception',e.message);
}
}
function playSound(node) {
node.xhr = new XMLHttpRequest();
node.xhr.onload=function(){
node.buf=node.xhr.response;
node.sync=0;
node.retry=0;
decode(node);
}
node.xhr.open("GET", node.url, true);
node.xhr.responseType = "arraybuffer";
node.xhr.send();
}
关于javascript - decodeAudioData 返回空错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10365335/
我正在使用 AudioContext 的 decodeAudioData 方法在 Chrome、Firefox 和 Opera 中播放音频。所有浏览器都能成功解码和播放使用 Firefox 录制的音频
我正在使用网络音频 API 将 n channel 音频文件解码为单独的 channel ,然后将这些 channel 渲染到 Canvas 上以直观地创建频率计。 我正在使用 decodeAudio
我来到这里希望 SO 上可爱的人们可以帮助我解决我遇到的一些问题。 具体来说,每次我尝试使用 webkitAudioContext 的 decodeAudioData 方法时,它总是会触发带有空错误的
我想制作一个小的浏览器应用程序,它能够播放不同的音符。因此,我将声音作为 Base64 编码的 js 变量。现在我必须先解码 Base64,然后再解码 mp3 格式,以使应用程序可以使用声音。此外,我
我正在创建一个电子应用程序,允许用户剪切和重新排列多个音频样本并无缝播放它们。样本的总持续时间可能超过一小时,所以我无法将它们全部解码并将它们存储为 pcm 数据。所以这是我实现的: - 首先解码创建
我正在尝试使用 Web Audio Api 为音乐编写自定义网络播放器,但我在解码音频时遇到了问题。 我正在使用 AudioContext.decodeAudioData 函数从后端获取 .mp3 作
尝试使用我为列景观制作的小型引擎构建 webgl 音频可视化器,我认为这对于随时间的频率分布非常有用。 现在,这个从 coffeescript 编译而来的代码使选项卡崩溃: (function() {
我想从 ArrayBuffer 播放音频数据...所以我生成我的数组并用麦克风输入填充它。如果我在 Canvas 上绘制这些数据,它看起来像 --> 所以这行得通! 但是如果我想听这个数据 conte
网络音频开发人员您好, 我在 Chrome 中收到“decodeAudioData error null”和Firebug 中的“decodeAudioData 错误未定义”。 Firebug 还说“
我正在尝试在Edge浏览器中使用WebAudio API的encodeAudioData()方法解码作品文件,但出现此错误WEBAUDIO17014:解码错误:提供的流已损坏。 边缘版本详细信息: 微
我目前正在尝试使 Opus 数据包与 Web Audio API 一起工作。然而,问题是,虽然 FireFox 和 Chrome 应该原生支持它,但只有 FireFox 可以使用 Web Audio
我搜索了相关问题,但找不到任何相关信息。 我正在尝试让 Web Audio API 播放编码在另一个文件容器中的 mp3 文件,所以到目前为止我所做的是解析所述容器,并将结果二进制数据(arraybu
问题 当使用 Web Audio API 创建音频缓冲区时,会存在由 decodeAudioData 方法创建的缓冲区,这些缓冲区驻留在内存中,显然无法通过 JavaScript 访问。它们似乎在浏览
我有以下非常基本的代码,它是一个更复杂问题的一部分。 我的问题是函数:context.decodeAudioData(arrayBuffer) 在 iPhone 上不工作(在 Safari 和 上试过
我有一个 mp3 音频流播放器,在每个桌面浏览器中都运行良好,使用 MediaSourceExtensions 并为那些不支持 MSE 的浏览器回退到 WebAudioAPI。 iOS Safari
嗨我的问题是我想解码通过 HTTP 方法接收的数组缓冲区以便在浏览器中播放它我的问题请看一下我将尝试解释更多的代码。 ngOnInit() { // this service re
我正在使用 getUserMedia() 和 mediaRecorder 来录制音频,然后我将其作为 base64 编码文本存储在服务器上。稍后,它从服务器检索,存储在客户端,然后,当用户单击播放按钮
我正在尝试使用 decodeAudioData 在 javascript 中解码和播放较大的 mp3 文件的初始部分。我的第一个粗略的方法是从 mp3 的开头切下一些字节并将它们提供给 decodeA
我是一名优秀的程序员,十分优秀!