当前位置: 首页 > 知识库问答 >
问题:

通过javascript录制网站内部音频

林亦
2023-03-14

我做了这个webapp来作曲,我想添加一个功能来下载作曲作为.mp3/wav/whateverfileformatprobabile,我一直在搜索如何这样做很多次,但总是放弃,因为我找不到任何例子如何做,只有东西我找到了麦克风录音机,但我想记录最终的音频目的地的网站。我是这样播放音频的:

const a_ctx = new(window.AudioContext || window.webkitAudioContext)()
function playAudio(buf){
    const source = a_ctx.createBufferSource()
    source.buffer = buf
    source.playbackRate.value = pitchKey;
    //Other code to modify the audio like adding reverb and changing volume
    source.start(0)
}

其中buf是audiobuffer。

综上所述,我想录下整个窗口音频却想不出办法。

共有1个答案

唐炳
2023-03-14

也许您可以使用MediaStream录制API(https://developer.mozilla.org/en-us/docs/web/API/MediaStream_recording_api):

MediaStream录制API(有时简称为Media Recorder API)与Media Capture and Streams API和WebRTC API密切相关。MediaStream Recording API使得捕获由MediaStream或HTMLMediaElement对象生成的数据成为可能,以便进行分析、处理或保存到磁盘。它也出奇地容易使用。

另外,您可以看看这个主题:新的MediaRecorder(stream[,options])stream can living modify?。它似乎讨论了一个相关的问题,并可能为您提供一些见解。

<html>
<head>
<script>

const context = new(window.AudioContext || window.webkitAudioContext)()

async function run()
{
    var myArrayBuffer = context.createBuffer(2, context.sampleRate, context.sampleRate);
    // Fill the buffer with white noise;
    // just random values between -1.0 and 1.0
    for (var channel = 0; channel < myArrayBuffer.numberOfChannels; channel++) {
      // This gives us the actual array that contains the data
      var nowBuffering = myArrayBuffer.getChannelData(channel);
      for (var i = 0; i < myArrayBuffer.length; i++) {
        // audio needs to be in [-1.0; 1.0]
        nowBuffering[i] = Math.random() * 2 - 1;
      }
    }
    playAudio(myArrayBuffer)
}

function playAudio(buf){
    const streamNode = context.createMediaStreamDestination();
    const stream = streamNode.stream;
    const recorder = new MediaRecorder( stream );
    const chunks = [];
    recorder.ondataavailable = evt => chunks.push( evt.data );
    recorder.onstop = evt => exportAudio( new Blob( chunks ) );

    const source = context.createBufferSource()
    source.onended = () => recorder.stop();
    source.buffer = buf
    source.playbackRate.value = 0.2
    source.connect( streamNode );
    source.connect(context.destination);
    source.start(0)
    recorder.start();
}

function exportAudio( blob ) {
  const aud = new Audio( URL.createObjectURL( blob ) );
  aud.controls = true;
  document.body.prepend( aud );
}


</script>
</head>
<body onload="javascript:run()">
<input type="button" onclick="context.resume()" value="play"/>
</body>
</html>
 类似资料:
  • 我可以使用这个简单的脚本登录facebook、google或stackoverflow(或者根据ID的不同而略有变化)。但是,我的公司有一个网站,我无法使用powershell登录该网站。 我认为唯一的区别是该网站位于我们的“内部网”上,而不是互联网上,出于某种原因,powershell将两者区分开来。但我不确定,我仍然可以正常打开IE,进入url并查看源代码,查看标签ID等等。 有人知道我在本例

  • 我有一个批处理文件,其中有用户名和密码登录以下格式的网站在第16行第5个字是用户名,第7个字是密码。 启动VPNGUI-c-用户1000-pwd 123456 我需要一个关于JavaScript的帮助,它应该打开网站主页,阅读批量文件收集用户名和密码,自动填写用户名和密码在主页上,并使用发送键登录。我已经尝试过使用vbscript,下面是我的代码,但我需要Java版本,它应该允许用户一次点击就自动

  • 是迄今为止用Java捕获麦克风输入的最简单方法。我想对我用屏幕视频(在屏幕录制软件中)捕获的音频进行编码,以便用户可以创建教程、幻灯片盒等。 我使用对视频进行编码<他们确实有一个用视频编码音频的教程,但他们从文件中获取音频。就我而言,音频是实时的 参考文献: 1. DavaDoc for TargetDataLine:http://docs.oracle.com/javase/1.4.2/docs

  • 在微服务体系结构中,有一种称为API网关的常见模式。 我知道所有来自API网关外部的通信都被用作单个入口点。 但是我也希望从微服务到微服务的内部通信是通过API网关进行的?我的意思是,这比建立点对点连接要容易得多。 那么,是什么反对将API网关也用于整个内部通信呢?

  • 问题内容: 我需要在我的站点中显示另一个外部站点的内容。通常标签可以做到这一点。但我的要求不是全部内容,而只是该网站的一部分。例如该网站的布局有3个部分,,,。我的意思是我只想显示一部分。我该怎么做? 我试过了,但是没有用。 问题答案: 这是由于ajax跨域安全性限制,一种技巧是从服务器设置代理脚本,该脚本从不同的站点(域)下载内容,并将该代理用作javascript中的参考。 示例:(proxy

  • 这个网站的控制台打开后内容就清空了 https://www.mddcloud.com.cn/。这个用的是什么技术?