|
|
|||||
SampleData ждет именно семплы, а вы скармливаете ему кодированный звук. Так работать не будет. Почитайте хелп.
вот пример простой реализации работы со звуком с микрофона, код не комментирован, но думаю там всё очевидно ///******************************************************************** ///* 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. |
|
|||||
Регистрация: Aug 2012
Сообщений: 9
|
Я так понимаю нужное в функции sampleData. Звук я записывал классом MicRecorder. При попытке воспроизвести, как в функции sampleData, воспроизводится в 2-3 раза быстрее, и на фоне шума еле-еле слышна запись (тоже быстро).
|
|
|||||
Как видно из примера звук надо записывать в bytearray ( семплы идут в виде числа с дробной частью в диапазоне от -1 до 1, то есть тип float ), для воспроизведения, потом, нужно записать в объект data события SampleEvent требуемое кол-во float-ов, при этом надо учитывать что ожидается на входе двухканальный звук, а с микрофона идет моно, т.е. одноканальный, поэтому каждое записываемое значение надо дублировать, записывать два раза. Если семплирование звука с микрофона производится с отличной от 44100Гц ( значение rate 44 ) надо пересчитывать подачу ( я просто добивал нулями нужное кол-во ). В примере жестко задан размер буфера 8192, это в общем так и есть, но немного неправильный подход, размер буфера возможно не одинаков на разных системах, или может измениться в будущем. Поэтому хорошо бы устанавливать его размер "на лету".
Добавлено через 8 минут Я знаю этот класс, он делает примерно то же что и приведенный код + кодирует звук в wav-e, посмотрите код внимательно, кодирование в wav-e это очень не сложная задача. Вы его можете организовать самостоятельно ( после прослушивания и/или перед сохранением). |
|
|||||
Регистрация: Aug 2012
Сообщений: 9
|
Можно подробнее, как установить буфер "на лету"?
|
|
|||||
Регистрация: Aug 2012
Сообщений: 9
|
Спасибо вам большое! C микрофоном разобрался.
А если такая ситуация: есть mp3 (или wav) в ByteArray. Как воспроизвести? Последний раз редактировалось themir; 09.09.2012 в 01:07. |
|
|||||
Регистрация: Mar 2007
Сообщений: 319
|
http://www.flexiblefactory.co.uk/fle...eloaderlib.zip
MP3ByteArray -> Sound Sound#extract Sound -> SoundByteArray |
|
|||||
Регистрация: Aug 2012
Сообщений: 9
|
C mp3 понятно. А как быть с wav? Можно по подробнее?
|
Часовой пояс GMT +4, время: 11:05. |
|
« Предыдущая тема | Следующая тема » |
Теги |
microphone , sound |
|
|