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

posted on 2014-11-05 10:31  Bean.Hsiang  阅读(437)  评论(0编辑  收藏  举报