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是自己实现的一个求最小公倍数的函数)

你可能感兴趣的:(actionscript)