![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Jun 2011
Сообщений: 127
|
Взял пример из документации http://help.adobe.com/ru_RU/as3/dev/...0204-7d1d.html в котом показано как записать звук с микрофона в ByteArray, а потом проиграть его в наушники.
const DELAY_LENGTH:int = 10000; var mic:Microphone = Microphone.getMicrophone(); mic.setSilenceLevel(0, DELAY_LENGTH); mic.gain = 100; mic.rate = 44; mic.codec=SoundCodec.NELLYMOSER; var soundBytes:ByteArray=new ByteArray(); mic.addEventListener(StatusEvent.STATUS, onMicStatus); Security.showSettings("microphone"); var timer:Timer = new Timer(DELAY_LENGTH); function micSampleDataHandler(event:SampleDataEvent):void { while(event.data.bytesAvailable) { var sample:Number = event.data.readFloat(); soundBytes.writeFloat(sample); } } var sound:Sound = new Sound(); var channel:SoundChannel; function timerHandler(event:TimerEvent):void { mic.removeEventListener(SampleDataEvent.SAMPLE_DATA, micSampleDataHandler); timer.stop(); soundBytes.position = 0; sound.addEventListener(SampleDataEvent.SAMPLE_DATA, playbackSampleHandler); channel = sound.play(); channel.addEventListener( Event.SOUND_COMPLETE, playbackComplete ); } function playbackSampleHandler(event:SampleDataEvent):void { for (var i:int = 0; i < 8192 && soundBytes.bytesAvailable > 0; i++) { //trace(sample); var sample:Number = soundBytes.readFloat(); event.data.writeFloat(sample); event.data.writeFloat(sample); } } function playbackComplete( event:Event ):void { trace( "Playback finished."); } function onMicStatus(event:StatusEvent):void { if (event.code == "Microphone.Unmuted") { mic.addEventListener(SampleDataEvent.SAMPLE_DATA, micSampleDataHandler); timer.addEventListener(TimerEvent.TIMER, timerHandler); timer.start(); trace("Microphone access was allowed."); } else if (event.code == "Microphone.Muted") { trace("Microphone access was denied."); try { if(this.loaderInfo.loader!=null) this.loaderInfo.loader.unloadAndStop(); } catch(er:Error){} this.parent.removeChild(this); } } Добавлено через 4 минуты Если в примере выше просто заменить то в наушниках голос будет слышен так как будто человек наглотался гелия. |
|
|||||
|
Скорость воспроизведения можно варьировать количеством данных в семпле (то что у вас в виде "магического числа" 8192). Необходимую длину семпла вы можете узнать по длине семпла в micSampleDataHandler.
__________________
משיח לא בא משיח גם לא מטלפן |
|
|||||
|
Регистрация: Jun 2011
Сообщений: 127
|
Спасибо, alatar. Натолкнули на мысль. Не совсем так как вы сказали. Если просто изменить 8192 на меньшее значение, то Sound будет обращаться за данными как только они закончатся в буфере. Поэтому нужно записать 8192, но прочитать меньше.
Вот мой конвертер частоты в пару строчек))). soundBytes.position = 0; var samples:Array=new Array(); while(soundBytes.bytesAvailable > 0) samples.push(soundBytes.readFloat()); var C:Number=44100/16000; var total:uint=Math.floor(samples.length*C); soundBytes.clear(); for(var i:uint=0; i<total; i++) soundBytes.writeFloat(samples[Math.round(i/C)]); soundBytes.position=0; Вот очень хорошая статься на тему звука во флеш http://blog.andreanaya.com/lang/en/2...-sound-part-1/ Добавлено через 53 минуты _buffer.position = 0; var s:Array=new Array(); while(_buffer.bytesAvailable > 0) s.push(_buffer.readFloat()); var C:Number=44100/16000; var total:uint=Math.floor(s.length*C); _buffer.clear(); for(var i:uint=2; i<total-2; i++) _buffer.writeFloat(( 7*s[Math.round((i-2)/C)]+48*s[Math.round((i-1)/C)]+68*s[Math.round(i/C)]+48*s[Math.round((i+1)/C)]+7*s[Math.round((i+2)/C)])/178); _buffer.position=0; |
![]() |
![]() |
Часовой пояс GMT +4, время: 00:18. |
|
|
« Предыдущая тема | Следующая тема » |
|
|