@ audio/decode-mpc (英语)
将Musepack(MPC)解码为PCM浮标样本.
双节 (叹息于 evpobr/libmpc 数据)被编译为单文件的WASM ES模块——没有侧式文件,来自任何CDN,节点,工人和音频工作板的负载.
import decode, { decoder } from '@audio/decode-mpc'
let { channelData, sampleRate } = await decode(mpcBytes)
let dec = await decoder()
let head = dec.decode(chunk1) // synchronous; returns whatever the bytes seen so far allow
let tail = dec.flush()
dec.free()
解码双流世代: SV7 ()MP+ 魔法,1999-2006年时代编码器)和SV8(MPCK 魔法,电流). demuxer(容器框架,APEv2/ID3v1标签,求取表)在limpcdec内部运行;这个包只提供它的字节. 单声道或立体声,无论溪流宣布。 与 MPC_FIXED_POINT 关闭,所以自由的手回 本地浮标样本—— 没有固定点的再量化步骤.
API 密码
decode(src: Uint8Array | ArrayBuffer): Promise<AudioData>
解码一个完整的流。 如果输入从未被解析为 Musepack 则丢出( 无) MP+编号 :MPCK 魔术,或者一个标题 仍然不会分析 在一个慷慨的预算.
decoder(): Promise<MpcDecoder>
流出解码器 : decode(chunk) 返回迄今所看到的数据允许的每个完整框架的样本, flush() 解码任何安全系数 被扣在溪流的正端, free() 释放WASM记忆. errors 数帧在位流脱氧反应后被丢弃(见下方的流出——这停止了解码器,它不会再同步并跳过).
AudioData
{ channelData: Float32Array[], sampleRate: number }
流线
decode(chunk) 将字节输入WASM内部的可生长缓冲器并重试 mpc_demux_init() 在每一次通话中,直到标题解析——limpcdec's mpc_reader callback接口没有区别于"流的结束"的"尚未足够数据"的信号,一个流出缓冲字节中框的帧解码会让位流位置永久去同步(没有重试). 因此帧只解码一次至少4352字节(MAX_FRAME_SIZE,libmpcdec自己的最糟糕的压缩帧大小)被缓冲到读者光标之前——对任何块大小都是安全的,包括一次1字节.
这实际上意味着不同的版本:
- SV7 请检查URL=值 (帮助) 流 真正的渐进。 它的标题是固定的~30字节,没有前向引用,所以
decoder()一旦第一个块携带了这么多,就立即开始排放框架. - SV8 请检查URL=值 (帮助) 串流将其搜索表保留在文件的末尾
mpcenc只有在编码完成并知道最终字节偏移后,才能将标题的指针补补到它上mpc_demux_init()在实践中,SV8decoder()缓冲 (接近) 第 一帧出出前的整流.decode(chunk)永不挡住或丢弃, 但它只是返回到标题解决为止 .
无论是哪种方式,输入缓冲都不会被丢弃(SV8的求表读取可以向后跳到任何更早的偏移),所以流出不会为SV8保存内存——只为SV7保留了耐久到先解码.
计量
- 50,773字节WASM( limpcdec)
7d04739, (中文(简体) ),-Oz -flto,单文件 ES 模块). - ~86–89 dB SNR vs (英语)
ffmpeg -i x.mpc -f f32le -在SV8装置上生成mpcenc; 57–58 dB在从FFmpeg FATE套件中取出的独立SV7样本上取出(自有编码 vs. 自己解码完全相同的位数,所以较高的SV8数字只是反映了较少的解码器间分歧,而不是不同的编码忠诚. - ~12550× 实时 (以~0.4 ms为单位的0.5 s 剪接解码;以~4.6 ms为单位的 5.8 s 剪接; Apple M-series, Node 25).
许可证
ॐ • 妇女 BSD-3- 标签,匹配捆绑 双节。 。 。 .
部分 @ audio/ 代码 ——解码出家伞.
