Тема: Резать mp3
Показать сообщение отдельно
Старый 16.07.2011, 11:33
3p.station вне форума Посмотреть профиль Отправить личное сообщение для 3p.station Найти все сообщения от 3p.station
  № 2  
Ответить с цитированием
3p.station
 
Аватар для 3p.station

блогер
Регистрация: Oct 2009
Адрес: кочевник. Киев
Сообщений: 453
Записей в блоге: 5
вникните в этот классик(изменение скорости проигрывания трека) - его можно допилить и под вашу задачу
Код AS3:
package audio
{
	import flash.events.Event;
	import flash.events.SampleDataEvent;
	import flash.media.Sound;
	import flash.net.URLRequest;
	import flash.utils.ByteArray; 
 
	public class Audio 
	{
 
		private var _sound:Sound;
 
		private var _playbackSpeed:Number = 1; 
 
		private var _mp3:Sound;
		private var _loadedMP3Samples:ByteArray;
		private var _dynamicSound:Sound;
 
		private var _phase:Number;
		private var _numSamples:int;
 
		public function Audio()
		{
		}
 
		public function play():void
		{
			var bytes:ByteArray = new ByteArray();
			_sound.extract(bytes, int(_sound.length * 44.1));
			playBytes(bytes);
		}
 
		private function playBytes(bytes:ByteArray):void
		{
			stop();
			_dynamicSound = new Sound();
			_dynamicSound.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData);
 
			_loadedMP3Samples = bytes;
			_numSamples = bytes.length / 8;
 
			_phase = 0;
			_dynamicSound.play();
		}
 
		private function onSampleData( event:SampleDataEvent ):void
		{
			var l:Number;
			var r:Number;
 
			var outputLength:int = 0;
			while (outputLength < 2048) { 
				// until we have filled up enough output buffer
 
				// move to the correct location in our loaded samples ByteArray
				_loadedMP3Samples.position = int(_phase) * 8; // 4 bytes per float and two channels so the actual position in the ByteArray is a factor of 8 bigger than the phase
 
				// read out the left and right channels at this position
				l = _loadedMP3Samples.readFloat();
				r = _loadedMP3Samples.readFloat();
 
				// write the samples to our output buffer
				event.data.writeFloat(l);
				event.data.writeFloat(r);
 
				outputLength++;
 
				// advance the phase by the speed...
				_phase += _playbackSpeed;
 
				// and deal with looping (including looping back past the beginning when playing in reverse)
				if (_phase < 0) {
					_phase += _numSamples;
				} else if (_phase >= _numSamples) {
					_phase -= _numSamples;
				}
			}
		}
 
		public function set playbackSpeed(value:Number):void
		{
			_playbackSpeed = value;
		}
 
		public function stop():void
		{
			if (_dynamicSound) {
				_dynamicSound.removeEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData);
				_dynamicSound = null;
			}
		}
 
		public function get sound():Sound 
		{ 
			 return(_sound);
		} 
 
		public function set sound(value:Sound):void 
		{ 
			 _sound = value;
		} 
 
		public function get phase():Number 
		{ 
			 return(_phase);
		} 
		public function set phase(value:Number):void 
		{ 
			 _phase = value;
		} 
 
	}
}
__________________
мира и гармонии