Not interested in silverlight. Flash/javascript/html5 solutions are acceptable.
If you do not know such solutions, could you please say is it possible to make such that or not?
Not interested in silverlight. Flash/javascript/html5 solutions are acceptable.
If you do not know such solutions, could you please say is it possible to make such that or not?
当我不得不在浏览器中玩 FLAC 时,我的出发点也是Aurora 框架。
但是,Aurora 播放器使用ScriptProcessorNode来动态解码音频块。由于很多原因,这并没有成功。
我的解决方案是使用精简的 Aurora.js 资产类 + 依赖项将 Flac 解码为原始 16 位 PCM 音频。
查看Asset.get ('format', callback)、Asset.fromFile和Asset.prototype.decodeToBuffer的源代码。
接下来,获取音频数据以及采样率和通道数的提取值,并构建一个 WAVE 文件。这可以使用 HTML5 音频元素播放,使用createMediaElementSource通过音频图发送,或者您可以使用本机支持的音频格式执行的任何操作。
注意:将 decoder.js 中的 clz 函数替换为原生Math.clz32以提高性能,并为旧浏览器填充 clz32。
坏处
解码时间。一首“平均”4 分钟的歌曲在约 100% CPU 的情况下大约需要 5 秒。
优点
这是构建 WAVE 标头的函数,并将原始 PCM 数据转换为浏览器可以本地播放的内容。
function createWave( audioData, sampleRate, channelCount )
{
const audioFormat = 1, // 2 PCM = 1
subChunk1Size= 16, // 4 PCM = 16
bitsPerSample= 16, // 2
blockAlign = channelCount * (bitsPerSample >> 3), // 2
byteRate = blockAlign * sampleRate, // 4
subChunk2Size= blockAlign * audioData.size, // 4
chunkSize = 36 + subChunk2Size, // 4
// Total header size 44 bytes
header = new DataView( new ArrayBuffer(44) );
header.setUint32( 0, 0x52494646 ); // chunkId=RIFF
header.setUint32( 4, chunkSize, true );
header.setUint32( 8, 0x57415645 ); // format=WAVE
header.setUint32( 12, 0x666d7420 ); // subChunk1Id=fmt
header.setUint32( 16, subChunk1Size, true );
header.setUint16( 20, audioFormat, true );
header.setUint16( 22, channelCount, true );
header.setUint32( 24, sampleRate, true );
header.setUint32( 28, byteRate, true );
header.setUint16( 32, blockAlign, true );
header.setUint16( 34, bitsPerSample, true );
header.setUint32( 36, 0x64617461 ); // subChunk2Id=data
header.setUint32( 40, subChunk2Size, true );
return URL.createObjectURL( new Blob( [header, audioData], {type: 'audio/wav'} ) );
}
一个简单的谷歌搜索把我带到了这些网站:
Aurora 和 FLAC.js — 使用 Web Audio API 的音频编解码器
FLAC.js 简介:纯 JavaScript FLAC 解码器
信不信由你,这并不难。
差点忘了:
检查HTML5Test以比较浏览器与<audio>
标签及其兄弟的性能/兼容性。