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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 08.03.2012, 15:34
Андрей911 вне форума Посмотреть профиль Отправить личное сообщение для Андрей911 Найти все сообщения от Андрей911
  № 1  
Ответить с цитированием
Андрей911
 
Аватар для Андрей911

Регистрация: Jun 2011
Сообщений: 127
По умолчанию Как проиграть звук записанный с использованием кодека Speex в объекте Sound?

Взял пример из документации http://help.adobe.com/ru_RU/as3/dev/...0204-7d1d.html в котом показано как записать звук с микрофона в ByteArray, а потом проиграть его в наушники.
Код AS3:
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);
	} 
}
Если звук пишется на частоте 44кГ, то пример работает (это с использованием кодека NELLYMOSER). Но с ним кроме голоса присутствует значительный шум. Чтобы его подавить попытался использовать другой кодек Speex, который работает в более узком частотном диапазоне и работает только на частоте 16кГ. Как преобразовать полученный byteArray чтобы его можно было проиграть в Sound?

Добавлено через 4 минуты
Если в примере выше просто заменить
Код AS3:
mic.codec=SoundCodec.NELLYMOSER;
на
mic.codec=SoundCodec.SPEEX;
то в наушниках голос будет слышен так как будто человек наглотался гелия.

Старый 08.03.2012, 16:48
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 2  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Скорость воспроизведения можно варьировать количеством данных в семпле (то что у вас в виде "магического числа" 8192). Необходимую длину семпла вы можете узнать по длине семпла в micSampleDataHandler.
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 08.03.2012, 22:48
Андрей911 вне форума Посмотреть профиль Отправить личное сообщение для Андрей911 Найти все сообщения от Андрей911
  № 3  
Ответить с цитированием
Андрей911
 
Аватар для Андрей911

Регистрация: Jun 2011
Сообщений: 127
Спасибо, alatar. Натолкнули на мысль. Не совсем так как вы сказали. Если просто изменить 8192 на меньшее значение, то Sound будет обращаться за данными как только они закончатся в буфере. Поэтому нужно записать 8192, но прочитать меньше.
Вот мой конвертер частоты в пару строчек))).
Код AS3:
        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;
Добавлено через 2 минуты
Вот очень хорошая статься на тему звука во флеш http://blog.andreanaya.com/lang/en/2...-sound-part-1/

Добавлено через 53 минуты
Код AS3:
_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;
Добавил сглаживание методом наименьших квадратов многочленом второго порядка. Так звучание стало лучше

Старый 09.03.2012, 02:00
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 4  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Вполне мог и напутать, давно звуком не занимался.
__________________
משיח לא בא
משיח גם לא מטלפן

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

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

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


 


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


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