jaypan / web-audio-recorder.js
这是一个对 higuma/web-audio-recorder-js Github 库(https://github.com/higuma/web-audio-recorder-js)的包装器,允许通过 Composer 进行安装。
This package is not auto-updated.
Last update: 2024-09-12 16:23:03 UTC
README
这是什么?
WebAudioRecorder.js 是一个 JavaScript 库,它记录音频输入(Web Audio API AudioNode 对象)并将其编码为音频文件图像(Blob 对象)。它支持三种编码格式。
- 波形音频 (.wav)
- Ogg Vorbis (.ogg)
- MP3 (MPEG-1 Audio Layer III) (.mp3)
此库使用以下编码库作为底层。
- WavAudioEncoder.js: https://github.com/higuma/wav-audio-encoder-js
- OggVorbisEncoder.js: https://github.com/higuma/ogg-vorbis-encoder-js
- Mp3LameEncoder.js: https://github.com/higuma/mp3-lame-encoder-js
演示
麦克风录音演示。
https://higuma.github.io/web-audio-recorder-js/
库文件
库由一个主脚本和几个工作脚本组成。
lib/
包含未压缩的库文件。
WebAudioRecorder.js
: 主脚本WebAudioRecorderWav.js
: 波形音频编码的工作者WebAudioRecorderOgg.js
: Ogg Vorbis 编码的工作者WebAudioRecorderMp3.js
: MP3 编码的工作者WavAudioEncoder.min.js
: 波形音频编码(来自 WavAudioEncoder.js)OggVorbisEncoder.min.js
: Ogg Vorbis 编码(来自 OggVorbisEncoder.js)Mp3LameEncoder.min.js
: MP3 编码(来自 Mp3LameEncoder.js)OggVorbisEncoder.min.js.mem
: Ogg Vorbis 编码的内存初始化器(必须位于同一目录)Mp3LameEncoder.min.js.mem
: MP3 编码的内存初始化器(与上面相同)
lib-minified/
包含压缩后的库文件。
WebAudioRecorder.min.js
: 主脚本(压缩后)WebAudioRecorderWav.min.js
: 波形音频的工作者(与编码器连接并重新压缩)WebAudioRecorderOgg.min.js
: Ogg Vorbis 的工作者(与编码器连接并重新压缩)WebAudioRecorderMp3.min.js
: MP3 的工作者(与编码器连接并重新压缩)OggVorbisEncoder.min.js.mem
: Ogg Vorbis 编码器的内存初始化器(与上面相同)Mp3LameEncoder.min.js.mem
: MP3 编码器的内存初始化器(与上面相同)
使用库
首先从 HTML 中加载主脚本。
<script src="javascripts/WebAudioRecorder.js"></script>
在创建音频录音对象时(或通过 setEncoding()
更改编码)加载工作文件。您必须在对象构造函数上设置工作目录(有关详细信息,请参阅 API 参考)。
audioRecorder = new WebAudioRecorder(sourceNode, { workerDir: "javascripts/" // must end with slash });
API
构造函数
recorder = new WebAudioRecorder(sourceNode, configs)
创建音频录音对象。
- 参数
sourceNode
: 输入源(AudioNode 对象)configs
: 配置对象.workerDir
: 工作文件目录(默认 ="/"
).numChannels
: 通道数(默认 =2
(立体声)).encoding
: 编码(默认 ="wav"
,有关详细信息,请参阅.setEncoding()
).options
: 选项(有关详细信息,请参阅.setOptions()
)- 您还可以设置事件处理器(有关详细信息,请参阅“事件处理器”)
- 返回
- 音频录音对象
每个配置属性都有一个默认值(通常您只需要设置.workerDir
和.encoding
)。您可以在构造后通过.setEncoding()
更改编码,通过.setOptions()
更改选项。
如果您使用MP3编码,您不能从默认值(当前MP3编码器只支持立体声2通道)更改.numChannels
。
事实上,
configs
只是深拷贝到记录对象本身。
方法
recorder.setEncoding(encoding)
构造后更改编码。
- 参数
.encoding
:编码"wav"
:波形音频(默认)"ogg"
:Ogg Vorbis"mp3"
:MP3
- 返回
- (无)
当录音未运行时,您可以更改编码。如果在录音期间调用此方法,将触发.onError()
事件。
recorder.setOptions(options)
设置选项。
- 参数
options
:选项对象.timeLimit
:录音时间限制(秒)(默认 =300
).encodeAfterRecord
:编码过程模式false
:在录音后台处理编码(默认)true
:录音完成后处理编码
.progressInterval
:编码进度报告间隔(毫秒)(默认 =1000
)- (仅在
.encodeAfterRecord
为true
时使用)
- (仅在
.bufferSize
:录音缓冲区大小(默认 =undefined
(使用浏览器默认值)).wav.mimeType
:波形音频MIME类型(默认 ="audio/wav"
).ogg.mimeType
:Ogg Vorbis MIME类型(默认 ="audio/ogg"
).ogg.quality
:Ogg Vorbis质量(-0.1 .. 1)(默认 =0.5
).mp3.mimeType
:MP3 MIME类型(默认 ="audio/mpeg"
).mp3.bitRate
:MP3比特率(通常为64 .. 320,用于44100Hz)(默认 =160
)
- 返回
- (无)
当录音未运行时,您可以设置选项。如果在录音期间调用此方法,将触发.onError()
事件。
recorder.startRecording()
开始录音。
- 参数
- (无)
- 返回
- (无)
如果.encoderAfterRecord
选项为false
(默认),编码过程将在录音后台执行。
如果.encoderAfterRecord
为true
,音频数据仅存储到工作线程的缓冲区。编码过程将在录音完成后执行。
recorder.isRecording()
如果录音正在运行,则返回。
- 参数
- (无)
- 返回
false
:录音未运行true
:录音正在运行
recordingTime = recorder.recordingTime()
报告录音时间。
- 参数
- (无)
- 返回
- 录音时间(秒)或
null
(未录音)
- 录音时间(秒)或
recorder.cancelRecording()
取消当前录音而不保存。
- 参数
- (无)
- 返回
- (无)
recorder.finishRecording()
完成当前录音。
- 参数
- (无)
- 返回
- (无)
如果.encoderAfterRecord
选项为false
(默认),它将立即完成编码并创建一个Blob对象。您可以通过.onComplete()
事件获取Blob。
如果.encoderAfterRecord
为true
,它将开始编码过程。编码过程可能需要几秒钟到几分钟(取决于录音时间)。您可以通过onEncodingProgress()
事件获取编码进度。获取Blob的方式与上述相同。
recorder.cancelEncoding()
取消编码。
- 参数
- (无)
- 返回
- (无)
此方法用于当.encoderAfterRecord
为true
且工作线程在.finishRecording()
后处理编码时。您可以中断工作线程的编码过程并进行清理。
内部,它调用
worker.terminate()
来终止工作线程并创建另一个工作线程。
事件处理程序
编码工作线程的响应由事件处理程序处理。还提供了一些其他断点作为事件。以下是对事件的总结(第一个参数始终是记录对象)。
recorder.onEncoderLoading = function(recorder, encoding) { ... } recorder.onEncoderLoaded = function(recorder, encoding) { ... } recorder.onTimeout = function(recorder) { ... } recorder.onEncodingProgress = function (recorder, progress) { ... } recorder.onEncodingCanceled = function(recorder) { ... } recorder.onComplete = function(recorder, blob) { ... } recorder.onError = function(recorder, message) { ... }
您可以将事件处理程序设置为对象属性。
recorder = new WebAudioRecorder(source, { workerDir: "javascripts/" }); recorder.onComplete = function(rec, blob) { // use Blob };
您还可以从构造函数参数设置事件处理程序。
recorder = new WebAudioRecorder(source, { workerDir: "javascripts/", onEncoderLoading: function(recorder, encoding) { // show "loading encoder..." display }, onEncoderLoaded: function(recorder, encoding) { // hide "loading encoder..." display } });
事件参考
recorder.onEncoderLoading = function(recorder, encoding) { ... }
- 触发于
- 记录器将加载编码工作线程(在构造或更改编码时)
- 参数
recorder
:音频记录对象encoding
:编码
- 默认处理程序
- 空函数
这是构造过程中唯一触发的事件。为了正确捕获第一个事件,它应该从构造函数参数设置(参见上述示例)。
recorder.onEncoderLoaded = function(recorder, encoding) { ... }
- 触发于
- 编码工作线程已加载完成
- 参数
recorder
:音频记录对象encoding
:编码
- 默认处理程序
- 空函数
recorder.onTimeout = function(recorder) { ... }
- 触发于
- 录音时间超过超时限制
- 参数
recorder
:音频记录对象
- 默认处理程序
- 调用
recorder.finishRecording()
。
- 调用
recorder.onEncodingProgress = function (recorder, progress) { ... }
- 触发于
- 工作器报告编码进度(当
.encodeAfterRecord
设置为true
时)
- 工作器报告编码进度(当
- 参数
recorder
:音频记录对象progress
:进度(从0
到1
)
- 默认处理程序
- 空函数
recorder.onEncodingCanceled = function(recorder) { ... }
- 触发于
- 调用
.cancelRecording()
- 调用
- 参数
recorder
:音频记录对象
- 默认处理程序
- 空函数
recorder.onComplete = function(recorder, blob) { ... }
- 触发于
- 工作器完成编码到 Blob
- 参数
recorder
:音频记录对象blob
:Blob 对象
- 默认处理程序
- 通过
recorder.onError()
重写"您必须重写 onComplete 事件"
- 通过
这是最重要的事件。您必须重写才能获取结果。
recorder.onError = function(recorder, message) { ... }
- 触发于
- 错误
- 参数
recorder
:音频记录对象message
:错误信息
- 默认处理程序
- 通过
console.log(message)
显示消息
- 通过
许可证
该库的 Ogg Vorbis 编码部分使用由 JavaScript 转换的 libogg 和 libvorbis 代码。它们在 Xiph 的类似 BSD 许可下发布。该库的 Ogg Vorbis 编码部分遵循相同的许可证(见以下链接)。
http://www.xiph.org/licenses/bsd/
该库的 MP3 编码部分使用由 JavaScript 转换的 LAME 代码。LAME 在 LGPL 许可下发布。该库的 MP3 编码部分遵循相同的许可证(见以下链接)。
http://lame.sourceforge.net/about.php
其他所有部分均在 MIT 许可证下发布(见 LICENSE.txt)。