ActionScript:Resampling PCM data
使用基于flash的麦克风录音,如果想在获取完PCM采样数据后,通过Sound马上回放,必须经过resampling。(注意:如果录音是采用的44KHz的话,则不需要)
因此,需要as实现一个简便的函数完成这个转换。
public function resampleSamples(sourceSamples:ByteArray, targetSamples:ByteArray, sourceRate:int, targetRate:int = 44100):void { var left:Number= Math.floor(sourceRate/1000); var right:Number= Math.floor(targetRate/1000); var lcm:Number=MathEx.lcm(left,right); var sourceMumtiple:Number=lcm/left; var targetMumtiple:Number=lcm/right; var sourceSampleCount:Number=sourceSamples.length/4; var sourceSampleIndex:Number=1; var targetSampleIndex:Number=0; sourceSamples.position=0; var sample:Number=sourceSamples.readFloat(); while(sourceSampleIndex<sourceSampleCount) { if(targetSampleIndex*targetMumtiple>sourceSampleIndex*sourceMumtiple) { sample=sourceSamples.readFloat(); sourceSampleIndex++; continue; } targetSamples.writeFloat(sample); targetSampleIndex++; } }
(MathEx.lcm是自己实现的一个求最小公倍数的函数)