对silverlight不感兴趣。 Flash / javascript / html5解决方案是可以接受的。
如果您不知道这样的解决方案,请问您是否可以这样做?
对silverlight不感兴趣。 Flash / javascript / html5解决方案是可以接受的。
如果您不知道这样的解决方案,请问您是否可以这样做?
一个简单的谷歌搜索引导我到这些网站:
Aurora和FLAC.js - 使用Web Audio API的音频编解码器
信不信由你,并不是那么难。
差点忘了:
检查 HTML5Test 比较浏览器的性能/兼容性 <audio>
标签和它的兄弟姐妹。
当我不得不在浏览器中玩FLAC时,我的出发点也是 Aurora框架。
然而,Aurora播放器正在使用 ScriptProcessorNode 在运行中解码大量的音频。由于许多原因,这并没有成功。
我的解决方案是使用精简的Aurora.js Assset类+依赖项将Flac解码为原始16位PCM音频。
查看源代码 Asset.get('format',回调), Asset.fromFile,和 Asset.prototype.decodeToBuffer。
接下来,获取音频数据以及提取的采样率和通道数值,并构建WAVE文件。这可以使用HTML5音频元素播放,通过音频图形发送 createMediaElementSource,或者你可以用本机支持的音频格式做任何事情。
注意:替换clz函数 decoder.js 与本地人 Math.clz32 提高性能,以及旧浏览器的polyfill clz32。
坏处
解码时间。大约5秒钟,在~100%CPU上获得“平均”4分钟的歌曲。
优点
这是构建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'} ) );
}