Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 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.
Старый 08.09.2012, 21:17
themir вне форума Посмотреть профиль Отправить личное сообщение для themir Найти все сообщения от themir
  № 12  
Ответить с цитированием
themir

Регистрация: Aug 2012
Сообщений: 9
Я так понимаю нужное в функции sampleData. Звук я записывал классом MicRecorder. При попытке воспроизвести, как в функции sampleData, воспроизводится в 2-3 раза быстрее, и на фоне шума еле-еле слышна запись (тоже быстро).

Старый 08.09.2012, 22:28
fish_r вне форума Посмотреть профиль Отправить личное сообщение для fish_r Посетить домашнюю страницу fish_r Найти все сообщения от fish_r
  № 13  
Ответить с цитированием
fish_r
 
Аватар для fish_r

блогер
Регистрация: Jan 2011
Сообщений: 1,162
Записей в блоге: 4
Как видно из примера звук надо записывать в bytearray ( семплы идут в виде числа с дробной частью в диапазоне от -1 до 1, то есть тип float ), для воспроизведения, потом, нужно записать в объект data события SampleEvent требуемое кол-во float-ов, при этом надо учитывать что ожидается на входе двухканальный звук, а с микрофона идет моно, т.е. одноканальный, поэтому каждое записываемое значение надо дублировать, записывать два раза. Если семплирование звука с микрофона производится с отличной от 44100Гц ( значение rate 44 ) надо пересчитывать подачу ( я просто добивал нулями нужное кол-во ). В примере жестко задан размер буфера 8192, это в общем так и есть, но немного неправильный подход, размер буфера возможно не одинаков на разных системах, или может измениться в будущем. Поэтому хорошо бы устанавливать его размер "на лету".

Добавлено через 8 минут
Цитата:
Сообщение от themir Посмотреть сообщение
Звук я записывал классом MicRecorder
Я знаю этот класс, он делает примерно то же что и приведенный код + кодирует звук в wav-e, посмотрите код внимательно, кодирование в wav-e это очень не сложная задача. Вы его можете организовать самостоятельно ( после прослушивания и/или перед сохранением).

Старый 08.09.2012, 22:52
themir вне форума Посмотреть профиль Отправить личное сообщение для themir Найти все сообщения от themir
  № 14  
Ответить с цитированием
themir

Регистрация: Aug 2012
Сообщений: 9
Можно подробнее, как установить буфер "на лету"?

Старый 08.09.2012, 23:14
fish_r вне форума Посмотреть профиль Отправить личное сообщение для fish_r Посетить домашнюю страницу fish_r Найти все сообщения от fish_r
  № 15  
Ответить с цитированием
fish_r
 
Аватар для fish_r

блогер
Регистрация: Jan 2011
Сообщений: 1,162
Записей в блоге: 4
"Установить" не в смысле "задать", а в смысле запросить его длину ( e.data.length ).

Старый 09.09.2012, 00:00
themir вне форума Посмотреть профиль Отправить личное сообщение для themir Найти все сообщения от themir
  № 16  
Ответить с цитированием
themir

Регистрация: Aug 2012
Сообщений: 9
Спасибо вам большое! C микрофоном разобрался.

А если такая ситуация: есть mp3 (или wav) в ByteArray. Как воспроизвести?


Последний раз редактировалось themir; 09.09.2012 в 01:07.
Старый 09.09.2012, 11:51
Nooob вне форума Посмотреть профиль Отправить личное сообщение для Nooob Найти все сообщения от Nooob
  № 17  
Ответить с цитированием
Nooob
 
Аватар для Nooob

Регистрация: Mar 2007
Сообщений: 319
http://www.flexiblefactory.co.uk/fle...eloaderlib.zip
MP3ByteArray -> Sound

Sound#extract
Sound -> SoundByteArray

Старый 09.09.2012, 14:25
themir вне форума Посмотреть профиль Отправить личное сообщение для themir Найти все сообщения от themir
  № 18  
Ответить с цитированием
themir

Регистрация: Aug 2012
Сообщений: 9
C mp3 понятно. А как быть с wav? Можно по подробнее?

Старый 09.09.2012, 18:44
fish_r вне форума Посмотреть профиль Отправить личное сообщение для fish_r Посетить домашнюю страницу fish_r Найти все сообщения от fish_r
  № 19  
Ответить с цитированием
fish_r
 
Аватар для fish_r

блогер
Регистрация: Jan 2011
Сообщений: 1,162
Записей в блоге: 4
Цитата:
Сообщение от themir Посмотреть сообщение
C mp3 понятно. А как быть с wav? Можно по подробнее?
Здесь есть конвертер, сам правда не пользовался.

Создать новую тему Ответ Часовой пояс GMT +4, время: 13:11.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
microphone , sound
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 13:11.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.