Ses girdisini yakalama

Flash Player 9 ve üstü, Adobe AIR 1.0 ve üstü

Microphone sınıfı, uygulamanızın bir mikrofona veya kullanıcının sistemindeki başka bir ses girdisi aygıtına bağlanmasına ve girdi sesini o sistemin hoparlörlerine yayınlamasına ya da Flash Media Server gibi uzak bir sunucuya ses verileri göndermesine olanak sağlar. Mikrofondan işlenmemiş ses verisine erişebilir veya bunu kaydedebilir ya da işleyebilirsiniz. Ayrıca sesi doğrudan sistemin hoparlörlerine gönderebilir veya sıkıştırılmış ses verisini uzak bir sunucuya gönderebilirsiniz. Uzak sunucuya gönderilmiş veriler için Speex veya Nellymoser codec bileşeni kullanabilirsiniz. (Speex codec bileşeni, Flash Player 10 ve Adobe AIR 1.5'ten itibaren desteklenmektedir.)

Mikrofona erişme

Microphone sınıfı bir yapıcı yöntemine sahip değildir. Bunun yerine, aşağıda gösterildiği gibi, yeni bir Microphone örneği almak için statik Microphone.getMicrophone() yöntemini kullanırsınız:

var mic:Microphone = Microphone.getMicrophone();

Microphone.getMicrophone() yönteminin bir parametre olmadan çağrılması, kullanıcının sisteminde keşfedilen birinci ses girdisi aygıtını döndürür.

Bir sistemde, bağlı birden çok ses girdisi aygıtı bulunabilir. Uygulamanız, tüm kullanılabilir ses girdisi aygıtlarının adlarının dizisini almak için Microphone.names özelliğini kullanabilir. Bu daha sonra dizide aygıtın adının dizin değeriyle eşleşen bir index parametresiyle Microphone.getMicrophone() yöntemini çağırabilir.

Sistemde bağlı bir mikrofon veya başka bir ses girdisi aygıtı bulunmayabilir. Kullanıcının bir ses girdisi aygıtı takmış olup olmadığını kontrol etmek için Microphone.names özelliğini veya Microphone.getMicrophone() yöntemini kullanabilirsiniz. Kullanıcı bir ses girdisi aygıtı takmadıysa, names dizisi sıfır uzunluğuna sahip olur ve getMicrophone() yöntemi null değerini döndürür.

UygulamanızMicrophone.getMicrophone() yöntemini çağırdığında, Flash Player uygulaması, Flash Player'ın sistemdeki kameraya veya mikrofona erişmesine izin verip vermeyeceğini kullanıcıya soran Flash Player Ayarları iletişim kutusunu görüntüler. Kullanıcı bu iletişim kutusunda İzin Ver veya Reddet düğmesini tıklattıktan sonra bir StatusEvent gönderilir. Bu StatusEvent örneğinin code özelliği, bu örnekte gösterildiği gibi, mikrofon erişimine izin verilip verilmediğini belirtir:

import flash.media.Microphone; 
 
var mic:Microphone = Microphone.getMicrophone(); 
mic.addEventListener(StatusEvent.STATUS, this.onMicStatus); 
 
function onMicStatus(event:StatusEvent):void 
{ 
    if (event.code == "Microphone.Unmuted") 
    { 
        trace("Microphone access was allowed."); 
    }  
    else if (event.code == "Microphone.Muted") 
    { 
         trace("Microphone access was denied."); 
    } 
}

StatusEvent.code özelliği, erişime izin verildiyse “Microphone.Unmuted” öğesini içerirken, erişim reddedildiyse “Microphone.Muted” öğesini içerir.

Kullanıcı mikrofon erişimine izin verdiğinde veya mikrofon erişimini reddettiğinde Microphone.muted özelliği sırayla true veya false değerine ayarlanır. Ancak StatusEvent öğesi gönderilene kadar muted özelliği ayarlanmaz. Bu nedenle uygulamanızın Microphone.muted özelliğini kontrol etmeden önce StatusEvent.STATUS olayının gönderilmesini beklemesi gerekir.

Flash Player'ın ayarlar iletişim kutusunu görüntülemesi için uygulama penceresi bunu görüntüleyecek kadar büyük olmalıdır (en azından 215 x 138 piksel) Aksi takdirde, erişim otomatik olarak reddedilir.

AIR uygulaması sanal alanında çalışan içeriğin mikrofona erişmek için kullanıcı iznine ihtiyacı yoktur. Bu nedenle, mikrofonun sesini kapatmak ve açmak için durum olayları gönderilmez. AIR'de uygulama sanal alanının dışında çalışan içerik kullanıcıdan izin gerektirir. Bu nedenle bu durum olayları gönderilebilir.

Mikrofon sesini yerel hoparlörlere yönlendirme

Bir mikrofondan gelen ses girdisi, true parametre değeriyle Microphone.setLoopback() yöntemi çağrılarak yerel sistem hoparlörlerine yönlendirilebilir.

Yerel mikrofondan gelen ses yerel hoparlörlere yönlendirildiğinde, ses geribildirimi döngüsü oluşma riski vardır ve bu da cızırtılı seslere neden olarak ses donanımına zarar verebilir. true parametre değeriyle Microphone.setUseEchoSuppression() yönteminin çağrılması, ses geribildirimi oluşma riskini azaltır ancak tamamen ortadan kaldırmaz. Adobe, kullanıcının kulaklık kullanarak veya hoparlör dışında bir şeyle ses çaldığından emin değilseniz, Microphone.setLoopback(true) yöntemini çağırmadan önce her zaman Microphone.setUseEchoSuppression(true) yöntemini çağırmanızı önerir.

Aşağıdaki kod, yerel mikrofondan gelen sesin yerel sistem hoparlörlerine nasıl yönlendirildiğini gösterir:

var mic:Microphone = Microphone.getMicrophone(); 
mic.setUseEchoSuppression(true); 
mic.setLoopBack(true);

Mikrofon sesini değiştirme

Uygulamanız bir mikrofondan gelen ses verilerini iki şekilde değiştirebilir. İlk olarak, girdi sesinin kazanımını değiştirebilir böylece daha yüksek veya daha alçak bir ses oluşturmak için girdi değerleri belirtilen bir miktarla etkili şekilde çarpılır. Microphone.gain özelliği 0 ile 100 arasındaki sayısal değerleri kabul eder. 50 değeri, bir çarpanı gibi hareket eder ve normal ses düzeyini belirtir. Sıfır değeri, sıfır çarpanı gibi hareket eder ve girdi sesini etkili şekilde kapatır. 50'nin üzerindeki değerler, normal ses düzeyinin üzerini belirtir.

Uygulamanız da girdi sesinin örnek hızını değiştirebilir. Yüksek örnek hızları ses kalitesini artırır ancak iletim ve depolama için daha fazla kaynak kullanan daha yoğun veri akışları da oluşturur. Microphone.rate özelliği, kilohertz (kHz) cinsinden ölçülen ses örnek hızını temsil eder. Varsayılan örnek hızı 8 kHz'dir. Mikrofonunuz daha yüksek bir değeri destekliyorsa, Microphone.rate özelliğini 8 kHz'den yüksek bir değere ayarlayabilirsiniz. Örneğin, Microphone.rate özelliğinin 11 değerine ayarlanması, örnek hızını 11 kHz olarak ayarlar; 22 olarak ayarlanması, örnek hızını 22 kHz olarak ayarlar ve bu şekilde gider. Mevcut örnek hızları, seçilen codec bileşenine bağlıdır. Nellymoser codec bileşenini kullandığınızda, örnek hızı olarak 5, 8, 11, 16, 22 ve 44 kHz değerlerini belirtebilirsiniz. Speex codec bileşenini kullanırken (Flash Player 10 ve Adobe AIR 1.5'ten itibaren kullanılabilir), yalnızca 16 kHz kullanabilirsiniz.

Mikrofon etkinliğini algılama

Flash Player, bant genişliğini ve işleme kaynaklarını korumak için mikrofon tarafından herhangi bir ses iletilmediğinde bunu algılamaya çalışır. Mikrofonun etkinlik düzeyi, belirli bir süre boyunca sessizlik düzeyi eşiğinin altında kaldığında, Flash Player ses girdisini iletmeyi durdurur ve bunun yerine basit bir ActivityEvent öğesini gönderir. Speex codec bileşenini kullanırsanız (Flash Player 10 veya sonrasında ve Adobe AIR 1.5 veya sonrasında kullanılabilir), uygulamanın ses verilerini sürekli iletmesini sağlamak için sessizlik düzeyini 0'a ayarlayın. Speex ses etkinliği algılama özelliği otomatik olarak bant genişliğini azaltır.

Not: Uygulamanız mikrofonu izlerken bir Microphone nesnesi yalnızca Activity olayları gönderir. Bu nedenle, setLoopBack( true ) öğesini çağırmazsanız örnek veri olayları için bir dinleyici ekleyin veya mikrofonu bir NetStream nesnesine bağlayın. Böylece etkinlik olayları gönderilmez.

Microphone sınıfının üç özelliği, etkinliğin algılanmasını izler ve denetler:

  • Salt okunur activityLevel özelliği, mikrofonun algıladığı ses miktarını 0 ile 100 arasında bir ölçekte belirtir.

  • silenceLevel özelliği, mikrofonu etkinleştirmek ve bir ActivityEvent.ACTIVITY olayı göndermek için gereken ses miktarını belirtir. silenceLevel özelliği ayrıca 0 ile 100 arasında bir ölçek kullanır ve varsayılan değer 10'dur.

  • silenceTimeout özelliği, mikrofonun sessiz olduğunu belirtmek üzere bir ActivityEvent.ACTIVITY olayı gönderilinceye kadar etkinlik düzeyinin sessizlik düzeyinin altında kalması gerektiği milisaniye sayısını açıklar. Varsayılan silenceTimeout değeri 2000'dir.

Hem Microphone.silenceLevel özelliği hem de Microphone.silenceTimeout özelliği salt okunurdur, ancak Microphone.setSilenceLevel() yöntemi kullanılarak değerleri değiştirilebilir.

Bazı durumlarda, yeni etkinlik algılandığında mikrofonu etkinleştirme işlemi kısa bir gecikmeye neden olabilir. Mikrofonun her zaman etkin tutulması bu etkinleştirme gecikmelerini ortadan kaldırabilir. Uygulamanız, Flash Player uygulamasına ses algılanmasa da mikrofonu etkin tutmasını ve ses verisi toplamaya devam etmesini bildirmek için silenceLevel parametresi sıfıra ayarlı şekilde Microphone.setSilenceLevel() yöntemini çağırabilir. Tam tersine, silenceLevel parametresinin 100 olarak ayarlanması, mikrofonun tamamen etkinleştirilmesini önler.

Aşağıdaki örnek, mikrofonla ilgili bilgileri görüntüler ve Microphone nesnesi tarafından gönderilen etkinlik olayları ve durum olaylarıyla ilgili bildirimler gönderir:

import flash.events.ActivityEvent; 
import flash.events.StatusEvent; 
import flash.media.Microphone; 
 
var deviceArray:Array = Microphone.names; 
trace("Available sound input devices:"); 
for (var i:int = 0; i < deviceArray.length; i++) 
{ 
    trace(" " + deviceArray[i]); 
} 
 
var mic:Microphone = Microphone.getMicrophone(); 
mic.gain = 60; 
mic.rate = 11; 
mic.setUseEchoSuppression(true); 
mic.setLoopBack(true); 
mic.setSilenceLevel(5, 1000); 
     
mic.addEventListener(ActivityEvent.ACTIVITY, this.onMicActivity); 
mic.addEventListener(StatusEvent.STATUS, this.onMicStatus); 
     
var micDetails:String = "Sound input device name: " + mic.name + '\n'; 
micDetails += "Gain: " + mic.gain + '\n'; 
micDetails += "Rate: " + mic.rate + " kHz" + '\n'; 
micDetails += "Muted: " + mic.muted + '\n'; 
micDetails += "Silence level: " + mic.silenceLevel + '\n'; 
micDetails += "Silence timeout: " + mic.silenceTimeout + '\n'; 
micDetails += "Echo suppression: " + mic.useEchoSuppression + '\n'; 
trace(micDetails); 
 
function onMicActivity(event:ActivityEvent):void 
{ 
    trace("activating=" + event.activating + ", activityLevel=" +  
        mic.activityLevel); 
} 
 
function onMicStatus(event:StatusEvent):void 
{ 
    trace("status: level=" + event.level + ", code=" + event.code); 
}

Yukarıdaki örneği çalıştırdığınızda, sistem mikrofonunuza konuşursanız veya ses çıkarırsanız, sonuçta ortaya çıkan izleme deyimlerinin bir konsolda veya hata ayıklama penceresinde görüntülendiğini görürsünüz.

Medya sunucusuna ve medya sunucusundan ses gönderme

Flash Media Server gibi bir akışa alma medya sunucusuyla ActionScript kullanıldığında ek ses yetenekleri kullanılabilir.

Özellikle uygulamanız bir NetStream nesnesine Microphone nesnesini ekleyip doğrudan kullanıcının mikrofonundan sunucuya veri iletebilir. Ses verileri sunucudan bir uygulamaya akışa alınabilir ve MovieClip öğesinin parçası olarak veya bir Video nesnesi kullanılarak oynatılabilir.

Speex codec bileşeni Flash Player 10 ve Adobe AIR 1.5'ten itibaren kullanılabilir. Medya sunucusuna gönderilen sıkıştırılmış ses için kullanılan codec bileşenini ayarlamak için, codec özelliğini Microphone nesnesine ayarlayın. Bu özellik, SoundCodec sınıfında numaralandırılmış iki değere sahiptir. codec özelliğinin SoundCodec.SPEEX olarak ayarlanması, sesin sıkıştırılması için Speex codec bileşenini seçer. Özelliğin SoundCodec.NELLYMOSER (varsayılan) olarak ayarlanması, sesin sıkıştırılması için Nellymoser codec bileşenini seçer.

Daha fazla bilgi için www.adobe.com/go/learn_fms_docs_tr adresinde çevrimiçi Flash Media Server belgelerine bakın.

Mikrofon ses verilerini yakalama

Flash Player 10.1 ve AIR 2'de ya da üstünde, mikrofondan kayan nokta değerlerinin bayt dizisi olarak veri yakalayabilirsiniz. Her bir değer, mikrofon ses verilerinin bir örneğini temsil eder.

Mikrofon verilerini almak için, Microphone nesnesinin sampleData olayı için bir olay dinleyicisi ayarlayın. Mikrofon arabelleği ses örnekleriyle doldukça, Microphone nesnesi düzenli aralıklarla sampleData olayları gönderir. SampleDataEvent nesnesinin, ses örneklerinin bit dizisi olandata özelliği vardır. Örneklerin her biri, tek sesli ses örneklerini temsil eden kayan nokta değerleri olarak temsil edilir.

Aşağıdaki kod, mikrofon ses verilerini soundBytes adlı bir ByteArray nesnesinde toplar.

var mic:Microphone = Microphone.getMicrophone(); 
mic.setSilenceLevel(0, DELAY_LENGTH); 
mic.addEventListener(SampleDataEvent.SAMPLE_DATA, micSampleDataHandler); 
function micSampleDataHandler(event:SampleDataEvent):void { 
    while(event.data.bytesAvailable)     { 
        var sample:Number = event.data.readFloat(); 
        soundBytes.writeFloat(sample); 
    } 
}

Örnek baytları bir Sound nesnesi için oynatma sesi olarak tekrar kullanabilirsiniz. Bunu yaparsanız, Microphone nesnesinin rate özelliğini 44'e ayarlamalısınız, bu Sound nesneleri tarafından kullanılan örnek hızıdır. (Sound nesnesinin gerektirdiği 44 kHz hızından daha düşük bir hızda yakalanmış mikrofon örneklerini de dönüştürebilirsiniz.) Ayrıca, Microphone nesnesi tek sesli örnekler yakalarken, Sound nesnesinin stereo sesler kullandığını unutmayın. Yani, Microphone nesnesi tarafından yakalanan her bir biti Sound nesnesine iki kere yazmalısınız. Aşağıdaki örnekte 4 saniyelik mikrofon verisi yakalanmaktadır ve bir Sound nesnesi kullanılarak çalınmaktadır:

const DELAY_LENGTH:int = 4000; 
var mic:Microphone = Microphone.getMicrophone(); 
mic.setSilenceLevel(0, DELAY_LENGTH); 
mic.gain = 100; 
mic.rate = 44; 
mic.addEventListener(SampleDataEvent.SAMPLE_DATA, micSampleDataHandler); 
 
var timer:Timer = new Timer(DELAY_LENGTH); 
timer.addEventListener(TimerEvent.TIMER, timerHandler); 
timer.start(); 
 
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.addEventListener( Event.SOUND_COMPLETE, playbackComplete ); 
    channel = sound.play(); 
} 
 
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."); 
}

Ses örneği verilerinden ses çalma hakkında daha fazla bilgi için, bkz.Dinamik olarak oluşturulmuş sesle çalışma.