作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
请参阅我在http://textsnip.com/see/WAVinAS3中创建的用于在ActionScript 3.0中解析WAVE文件的类。
此类正确地从文件头和fmt块中分离信息,隔离数据块,并创建一个新的ByteArray来存储数据块。它接收格式标签为1的未压缩WAVE文件。WAVE文件通过以下Flex嵌入标签嵌入到我的SWF中:
[Embed(source="some_sound.wav", mimeType="application/octet-stream")]
public var sound_class:Class;
public var wave:WaveFile = new WaveFile(new sound_class());
最佳答案
问题出在onSampleData处理程序中。
在您的wav文件中,振幅存储为带符号的短裤,即16位整数。您正在将它们读为32位带符号的 float 。整数和浮点数在二进制文件中的表示方式有所不同,因此永远无法正常工作。
现在,玩家期望 float 。他们为什么使用浮子?不确定,但是一个很好的理由是它允许玩家接受每个样本的归一化值。这样,您就不必关心或知道播放器使用的是什么位数:最大值为1,最小值为-1,仅此而已。
因此,您的问题是必须将带符号的short转换为规范化的带符号浮点数。一个short占用16位,因此它可以存储2 ^ 16(或65,536)个不同的值。由于它是带符号的,所以符号占1位,因此最大值为2 ^15。因此,您知道输入的范围是-32,768 ... 32,767。
另一方面,样本值已标准化,并且必须在-1 ... 1的范围内。
因此,您必须规范化您的输入。这很容易。只需取读取值并将其除以最大值,即可将输入幅度转换为-1 ... 1.范围。
像这样:
private function onSampleData(evt:SampleDataEvent):void
{
var amplitude:int = 0;
var maxAmplitude:int = 1 << (bitsPerSample - 1); // or Math.pow(2, bitsPerSample - 1);
var sample:Number = 0;
var actualSamples:int = 8192;
var samplesPerChannel:int = actualSamples / channels;
for ( var c:int = 0; c < samplesPerChannel ; c++ ) {
var i:int = 0;
while(i < channels && data.bytesAvailable >= 2) {
amplitude = data.readShort();
sample = amplitude / maxAmplitude;
evt.data.writeFloat(sample);
i++;
}
}
}
关于actionscript-3 - 如何在ActionScript中播放WAV?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2933302/
我是一名优秀的程序员,十分优秀!