Тема: ByteArray to Sound
Показать сообщение отдельно
Старый 08.09.2012, 06:24
fish_r вне форума Посмотреть профиль Отправить личное сообщение для fish_r Посетить домашнюю страницу fish_r Найти все сообщения от fish_r
  № 11  
Ответить с цитированием
fish_r
 
Аватар для fish_r

блогер
Регистрация: Jan 2011
Сообщений: 1,162
Записей в блоге: 4
SampleData ждет именно семплы, а вы скармливаете ему кодированный звук. Так работать не будет. Почитайте хелп.

вот пример простой реализации работы со звуком с микрофона, код не комментирован, но думаю там всё очевидно

Код AS3:
 
///********************************************************************
///* Copyright © 2012 fishr (fishr.flash@gmail.com)  
///********************************************************************
 
 
package  
{
	import flash.events.Event;
	import flash.events.EventDispatcher;
	import flash.events.MouseEvent;
	import flash.events.SampleDataEvent;
	import flash.events.StatusEvent;
	import flash.media.Microphone;
	import flash.media.Sound;
	import flash.media.SoundChannel;
	import flash.system.Security;
	import flash.utils.ByteArray;
	import flash.utils.getTimer;
 
 
 
	/**
	 * ...
	 * @playerversion          Flash 10
	 * @langversion            3.0
	 * @author                 fishr
	 * @created                16.08.2012 4:54
	 * @since                  16.08.2012 4:54
	 */
	public class VRModel extends EventDispatcher
	{
 
	/**-------------------------------------------------------------------------------
	* 
	*	   						V A R I A B L E ' S 	
	* 
	* --------------------------------------------------------------------------------
	*/
	//{
		static private const AUTHOR:String = "fishr (fishr.flash@gmail.com)";
		private const _SOUND:Sound = new Sound();
		private var _mic:Microphone;
		private var _audiodata:ByteArray;
		private var _prevAccess:Boolean;
		private var _getTime:int;
		private var _timeRec:int;
		private var _soundChanel:SoundChannel;
 
 
 
	//}
 
	/**-------------------------------------------------------------------------------
	* 
	*	 						P R O P E R T I E S 	
	* 
	* --------------------------------------------------------------------------------
	*/
	//{
		public function get mic():Microphone 
		{
			return _mic;
		}
 
		public function get timeRec():int 
		{
			return _timeRec;
		}
 
 
	//}
	/**-------------------------------------------------------------------------------
	* 
	*								P U B L I C 	
	* 
	* --------------------------------------------------------------------------------
	*/
	//{
		public function VRModel( mic:Microphone, audiodata:ByteArray )
		{
			init( mic, audiodata );
		}
 
 
 
		internal function onPlay( event:RecorderEvent ):void 
		{
			if ( _SOUND.hasEventListener( SampleDataEvent.SAMPLE_DATA ) )
			{
				_SOUND.removeEventListener(SampleDataEvent.SAMPLE_DATA, sampleData );
				_soundChanel.stop();
			}
			else
			{
				selectPosRead( event.data as Number );
				_SOUND.addEventListener(SampleDataEvent.SAMPLE_DATA, sampleData );
				_soundChanel = _SOUND.play();
				_soundChanel.addEventListener(Event.SOUND_COMPLETE, soundComplete );
 
			}
		}
 
 
 
 
 
		internal function onRecord( event:RecorderEvent ):void 
		{
			if ( _mic.hasEventListener( SampleDataEvent.SAMPLE_DATA ) )
			{
				_mic.removeEventListener(SampleDataEvent.SAMPLE_DATA, sampleEvent);
				_audiodata.position = 0;
			}
			else
			{
				_audiodata.position = 0;
				_timeRec = 0;
 
				_getTime = getTimer();
 
				/// активирует передачу звука с микрофона 
				_mic.addEventListener(SampleDataEvent.SAMPLE_DATA, sampleEvent);
				_mic.setLoopBack( true );
 
				if ( !_mic )
				{
					this.dispatchEvent( new RecorderEvent( RecorderEvent.NO_MIC ) );
					_mic.removeEventListener(SampleDataEvent.SAMPLE_DATA, sampleEvent);
					return;
				}
 
				if ( _prevAccess )
				{
					Security.showSettings();
					this.dispatchEvent( new RecorderEvent( RecorderEvent.ACCESS_DENIED ) );
					_mic.removeEventListener(SampleDataEvent.SAMPLE_DATA, sampleEvent);
				}
			}
		}
 
		internal function clickStop( e:MouseEvent ):void 
		{
			_SOUND.removeEventListener(SampleDataEvent.SAMPLE_DATA, sampleData );
			if( _soundChanel )_soundChanel.stop();
 
		}
 
 
 
 
	//}
 
	/**-------------------------------------------------------------------------------
	* 
	*								P R I V A T E 	
	* 
	* --------------------------------------------------------------------------------
	*/	
	//{
		private function init(mic:Microphone, audiodata:ByteArray):void 
		{
			_mic = mic || Microphone.getMicrophone();
			_audiodata = audiodata || new ByteArray();
			_mic.setSilenceLevel( 0 );
			_mic.addEventListener(StatusEvent.STATUS, onStatusMic );
			_mic.rate = 44;
 
 
		}
 
 
 
		private function onStatusMic(event:StatusEvent):void 
		{
			if (event.code == "Microphone.Muted" )
			{
				if ( !_prevAccess )
				{
					_prevAccess = true;
					_mic.removeEventListener(SampleDataEvent.SAMPLE_DATA, sampleEvent);
					this.dispatchEvent( new RecorderEvent( RecorderEvent.ACCESS_DENIED ) );
				}
 
			}
			else if ( event.code == "Microphone.Unmuted" && _prevAccess )
			{
				_prevAccess = false;
				this.dispatchEvent( new RecorderEvent( RecorderEvent.ACCESS_ALWAYS ) );
			}
 
		}
 
		private function sampleEvent(e:SampleDataEvent):void 
		{
 
			try
			{
				while ( e.data.bytesAvailable )
				{
					const float:Number = e.data.readFloat();
					_audiodata.writeFloat( float );
 
					const wavePow:Number = Math.abs( float );
				}
			}
			catch ( err:Error )
			{
				this.dispatchEvent( new RecorderEvent( RecorderEvent.LIMIT_DATA ) );
			}
 
			_timeRec = getTimer() - _getTime;
		}
 
		private function sampleData(e:SampleDataEvent):void 
		{
 
 
			var i:uint = 8192;
			while ( i-- )
			{
				if ( !_audiodata.bytesAvailable )
				{
					break;
				}
 
				const sample:Number = _audiodata.readFloat();
				e.data.writeFloat( sample );
				e.data.writeFloat( sample );
			}
 
		}
 
		private function selectPosRead( nm:Number ):void
		{
			_audiodata.position = ( int( ( ( _audiodata.length ) / ( 4 * 8192 ) ) * nm ) * ( 4 * 8192 ) );
		}
 
		private function soundComplete(e:Event):void 
		{
			_soundChanel.stop();
			this.dispatchEvent( new RecorderEvent( RecorderEvent.END_TAPE )) ;
		}
 
 
	//}
 
 
	}
 
}


Последний раз редактировалось fish_r; 08.09.2012 в 08:54.