- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在浏览器中进行一些数据移动,并希望将 ImageData 从 Canvas 加载到 AudioData 中,因此我可以使用一些音频库(如金枪鱼)在数据上添加效果。
这是我迄今为止尝试过的
const canvasToBlob = (canvas) => {
let dataUrl = canvas.toDataURL('image/png');
return dataURItoBlob(dataUrl);
};
const dataURItoBlob = (dataURI) => {
// convert base64 to raw binary data held in a string
// doesn't handle URLEncoded DataURIs - see SO answer #6850276 for code that does this
let byteString = atob(dataURI.split(',')[1]);
// separate out the mime component
let mime = dataURI.split(',')[0].split(':')[1].split(';')[0];
console.log(mime);
// write the bytes of the string to an ArrayBuffer
let ab = new ArrayBuffer(byteString.length);
let ia = new Uint8Array(ab);
for (let i = 0; i < byteString.length; i++) {
ia[i] = byteString.charCodeAt(i);
};
// write the ArrayBuffer to a blob, and you're done
let blob = new Blob([ab], {type: 'audio/wav'});
return blob;
};
export default function audioConvert (canvas) {
const imageBlob = canvasToBlob(canvas);
let audioCtx = new AudioContext();
let fileReader = new FileReader();
fileReader.onloadend = () => {
console.log(fileReader.result);
audioCtx.decodeAudioData(fileReader.result).then((decodedData) => {
console.log(decodedData);
});
};
fileReader.readAsArrayBuffer(imageBlob);
};
不幸的是我只收到错误
Uncaught (in promise) DOMException: Unable to decode audio data
如何更改代码来获取 AudioContext。
或者 AudioContext 是正确的方法吗?
我想添加到图像中的一些效果是“回声”或“哇哇”,如 f.e. 所见。在大胆。
最佳答案
还没有答案,所以我刚刚添加了一个非常快速的加载图像并转换为声音缓冲区并播放。
// Stereo
var log = (data)=>console.log(data);
var audioCtx = new AudioContext(); // get audio context
var pixelPlayTime,sBuffers,ctx,can,startTime,source; // sBuffers is the wav form array
// load image
var image = new Image;
image.setAttribute('crossOrigin', 'anonymous');
image.src = "https://upload.wikimedia.org/wikipedia/commons/5/5a/Hoverfly07.jpg";
// when loaded convert to wave
image.onload = function(){
displayit.innerHTML = "";
// create a canvas to read pixel data
can = document.createElement("canvas");
can.width = this.width;
can.height = this.height;
ctx = can.getContext("2d");
ctx.drawImage(this,0,0);
var data = ctx.getImageData(0,0,this.width,this.height).data;
// get image size and workout sound buffer sizes
var pixelCount = this.width * this.height;
pixelPlayTime = pixelCount / audioCtx.sampleRate;
sBuffers = audioCtx.createBuffer(2, pixelCount, audioCtx.sampleRate);
// left gets red full vol and blue half
var channel1 = sBuffers.getChannelData(0); // get channel 0
var i = 0;
while(i < pixelCount){
// get red and some of green for this channel
var sample = ((data[i*4]/128) - 1 + (data[i*4+2]/255) - 0.5) / 1.5;
channel1[i] = sample < -1 ? -1 : sample > 1 ? 1 : sample;
i ++
}
// Right gets green full vol and blue half
var channel2 = sBuffers.getChannelData(1); // get channel 1
i = 0;
while(i < pixelCount){
// get blue and some of green for this channel
var sample = ((data[i*4 + 1]/128) - 1 + (data[i*4+2]/255) - 0.5) / 1.5;
channel2[i] = sample < -1 ? -1 : sample > 1 ? 1 : sample;
i ++
}
// sound buffers created prep to play
source = audioCtx.createBufferSource(); // for playing the buffer
source.buffer = sBuffers; // point to the buffer
source.connect(audioCtx.destination); // connect
// show image as canvas
can.style.width = Math.floor(this.width / 4) + "px"
can.style.height = Math.floor(this.height / 4) + "px"
displayit.innerHTML = "Click image to hear it<br>";
displayit.appendChild(can);
// Wait for clien click
can.addEventListener("click",()=>{
requestAnimationFrame(startSounds);
});
}
// start playing the sount
function startSounds(time){
if(startTime === undefined){
startTime = time;
pixelPlayTime *= 1000; // convert from seconds to micro seconds
source.start(); // and play dat phunky fly
requestAnimationFrame(update);
ctx.fillStyle = "white";
}
}
// display where the sound data is on the image.
// Basic timing use to show at what line the sound is being generated from.
function update(time){
var pos = (time - startTime) / pixelPlayTime;
var posY = Math.floor(pos * can.height);
ctx.globalCompositeOperation = "lighter";
ctx.fillRect(0,posY,can.width,4);
ctx.globalCompositeOperation = "source-over";
ctx.drawImage(image,0,posY-4,can.width,4,0,posY-4,can.width,4);
if(pos < 1){
requestAnimationFrame(update);
}
}
<div id="displayit" style="font-family:arial"><h2>Please wait loading image</h2></div>
<div style="font-family:arial">
<b><a href="https://en.wikipedia.org/wiki/User:Fir0002" title="en:User:Fir0002">fir0002</a> | <a href="http://www.flagstaffotos.com.au">flagstaffotos.com.au</a></b>
Image attribution
<table>
<tbody><tr>
<td style="width:90px;"><img alt="" src="https://upload.wikimedia.org/wikipedia/commons/thumb/7/79/CC_some_rights_reserved.svg/90px-CC_some_rights_reserved.svg.png" width="90" height="36" srcset="https://upload.wikimedia.org/wikipedia/commons/thumb/7/79/CC_some_rights_reserved.svg/135px-CC_some_rights_reserved.svg.png 1.5x, https://upload.wikimedia.org/wikipedia/commons/thumb/7/79/CC_some_rights_reserved.svg/180px-CC_some_rights_reserved.svg.png 2x" data-file-width="744" data-file-height="300"></td>
<td><span xml:lang="en"><i>This file is published under the following <a href="https://en.wikipedia.org/wiki/Creative_Commons" title="w:Creative Commons">Creative Commons</a> license:<br>
<a href="//creativecommons.org/licenses/by-nc/3.0/">Attribution <b>NonCommercial</b> Unported 3.0</a></i></span></td>
</tr>
</tbody></table>
<div style="font-family:arial">
关于javascript - 在浏览器中将 Canvas 转换为音频以进行数据传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42772766/
我正在尝试将一个字符串逐个字符地复制到另一个字符串中。目的不是复制整个字符串,而是复制其中的一部分(我稍后会为此做一些条件......) 但我不知道如何使用迭代器。 你能帮帮我吗? std::stri
我想将 void 指针转换为结构引用。 结构的最小示例: #include "Interface.h" class Foo { public: Foo() : mAddress((uint
这有点烦人:我有一个 div,它从窗口的左上角开始过渡,即使它位于文档的其他任何位置。我试过 usign -webkit-transform-origin 但没有成功,也许我用错了。有人可以帮助我吗?
假设,如果将 CSS3 转换/转换/动画分配给 DOM 元素,我是否可以检测到该过程的状态? 我想这样做的原因是因为我正在寻找类似过渡链的东西,例如,在前一个过渡之后运行一个过渡。 最佳答案 我在 h
最近我遇到了“不稳定”屏幕,这很可能是由 CSS 转换引起的。事实上,它只发生在 Chrome 浏览器 上(可能还有 Safari,因为一些人也报告了它)。知道如何让它看起来光滑吗?此外,您可能会注意
我正在开发一个简单的 slider ,它使用 CSS 过渡来为幻灯片设置动画。我用一些基本样式和一些 javascript 创建了一支笔 here .注意:由于 Codepen 使用 Prefixfr
我正在使用以下代码返回 IList: public IList FindCodesByCountry(string country) { var query =
如何设计像这样的操作: 计算 转化 翻译 例如:从“EUR”转换为“CNY”金额“100”。 这是 /convert?from=EUR&to=CNY&amount=100 RESTful 吗? 最佳答
我使用 jquery 组合了一个图像滚动器,如下所示 function rotateImages(whichHolder, start) { var images = $('#' +which
如何使用 CSS (-moz-transform) 更改一个如下所示的 div: 最佳答案 你可以看看Mozilla Developer Center .甚至还有例子。 但是,在我看来,您的具体示例不
我需要帮助我正在尝试在选中和未选中的汉堡菜单上实现动画。我能够为菜单设置动画,但我不知道如何在转换为 0 时为左菜单动画设置动画 &__menu { transform: translateX(
我正在为字典格式之间的转换而苦苦挣扎:我正在尝试将下面的项目数组转换为下面的结果数组。本质上是通过在项目第一个元素中查找重复项,然后仅在第一个参数不同时才将文件添加到结果集中。 var items:[
如果我有两个定义相同的结构,那么在它们之间进行转换的最佳方式是什么? struct A { int i; float f; }; struct B { int i; float f; }; void
我编写了一个 javascript 代码,可以将视口(viewport)从一个链接滑动到另一个链接。基本上一切正常,你怎么能在那里看到http://jsfiddle.net/DruwJ/8/ 我现在的
我需要将文件上传到 meteor ,对其进行一些图像处理(必要时进行图像转换,从图像生成缩略图),然后将其存储在外部图像存储服务器(s3)中。这应该尽可能快。 您对 nodejs 图像处理库有什么建议
刚开始接触KDB+,有一些问题很难从Q for Mortals中得到。 说,这里 http://code.kx.com/wiki/JB:QforMortals2/casting_and_enumera
我在这里的一个项目中使用 JSF 1.2 和 IceFaces 1.8。 我有一个页面,它基本上是一大堆浮点数字段的大编辑网格。这是通过 inputText 实现的页面上的字段指向具有原始值的值对象
ScnMatrix4 是一个 4x4 矩阵。我的问题是什么矩阵行对应于位置(ScnVector3),旋转(ScnVector4),比例(ScnVector3)。第 4 行是空的吗? 编辑: 我玩弄了
恐怕我是 Scala 新手: 我正在尝试根据一些简单的逻辑将 Map 转换为新 Map: val postVals = Map("test" -> "testing1", "test2" -> "te
输入: This is sample 1 This is sample 2 输出: ~COLOR~[Green]This is sample 1~COLOR~[Red]This is sam
我是一名优秀的程序员,十分优秀!