Erfassen von Soundeingaben

Flash Player 9 und höher, Adobe AIR 1.0 und höher

Mit der Microphone-Klasse kann Ihre Anwendung eine Verbindung zu einem Mikrofon oder einem anderen Sound-Eingabegerät des Benutzersystems herstellen und die eingegangenen Audiosignale an die Systemlautsprecher übertragen oder an einen Remote-Server, z. B. einen Flash Media Server, senden. Sie können auf die Raw-Audiodaten vom Mikrofon zugreifen und sie aufnehmen oder verarbeiten. Außerdem können Sie die Audiodaten direkt an die Lautsprecher des Systems senden oder komprimierte Audiodaten an einen Remote-Server senden. Für das Senden der Daten an einen Remote-Server können Sie den Speex- oder Nellymoser-Codec verwenden. (Der Speex-Codec wird ab Flash Player 10 und Adobe AIR 1.5 unterstützt.)

Zugriff auf ein Mikrofon

Das Microphone-Klasse hat keine Konstruktor-Methode. Stattdessen verwenden Sie die statische Microphone.getMicrophone() -Methode, um eine neue Microphone-Instanz zu erstellen, wie im Folgenden dargestellt:

var mic:Microphone = Microphone.getMicrophone();

Das Aufrufen der Microphone.getMicrophone() -Methode ohne einen Parameter gibt das erste auf dem Benutzersystem erfasste Sound-Eingabegerät zurück.

Es können mehrere Sound-Eingabegeräte an ein System angeschlossen sein. Ihre Anwendung kann mithilfe der Microphone.names -Eigenschaft ein Array mit den Namen aller verfügbaren Sound-Eingabegeräte erstellen. Dann ruft sie die Microphone.getMicrophone() -Methode mit dem index -Parameter auf, der dem Indexpositionswert eines Gerätenamens im Array entspricht.

Es kann auch sein, dass weder ein Mikrofon noch ein anderes Sound-Eingabegerät an das System angeschlossen ist. Mit der Microphone.names -Eigenschaft oder der Microphone.getMicrophone() -Methode können Sie prüfen, ob im System des Benutzers ein Sound-Eingabegerät installiert ist. Wenn der Benutzer kein Sound-Eingabegerät installiert hat, weist das names -Array eine Länge von Null auf und die getMicrophone() -Methode gibt den Wert null zurück.

Wenn Ihre Anwendung die Microphone.getMicrophone() -Methode aufruft, zeigt Flash Player das Dialogfeld „Flash Player-Einstellungen“ an. In diesem Dialogfeld wird der Benutzer aufgefordert, Flash Player den Zugriff auf an das System angeschlossene Sound-Eingabegeräte entweder zu gestatten oder zu verweigern. Nachdem der Benutzer auf die Schaltfläche „Zulassen“ oder „Verweigern“ geklickt hat, wird ein StatusEvent ausgelöst. Die code -Eigenschaft dieser StatusEvent-Instanz gibt an, ob der Zugriff auf das Mikrofon zugelassen oder verweigert wurde. Dies wird im Folgenden gezeigt:

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."); 
    } 
}

Die StatusEvent.code -Eigenschaft enthält „Microphone.Unmuted“, wenn der Zugriff zugelassen wurde, oder „Microphone.Muted“, wenn der Zugriff verweigert wurde.

Die Microphone.muted -Eigenschaft ist auf true eingestellt, wenn der Benutzer den Zugriff auf das Mikrofon gestattet, oder auf false , wenn der Zugriff verweigert wurde. Die muted -Eigenschaft der Microphone-Instanz wird jedoch erst nach dem Auslösen von StatusEvent eingestellt. Ihre Anwendung muss also auch auf das StatusEvent.STATUS -Ereignis warten, bevor sie die Microphone.muted -Eigenschaft überprüft.

Damit Flash Player das Einstellungsdialogfeld anzeigt, muss das Anwendungsfenster groß genug sein (mindestens 215 x 138 Pixel). Andernfalls wird der Zugriff automatisch verweigert.

Inhalt, der in der AIR-Anwendungs-Sandbox ausgeführt wird, benötigt keine Erlaubnis des Benutzers für den Zugriff auf das Mikrofon. Deshalb werden nie Statusereignisse ausgelöst, wenn der Ton des Mikrofons ein- oder ausgeschaltet wird. Inhalt, der in AIR außerhalb der Anwendungs-Sandbox ausgeführt wird, benötigt die Erlaubnis des Benutzers, sodass diese Statusereignisse ausgelöst werden können.

Leiten des Audioeingangs von einem Mikrofon an die lokalen Lautsprecher

Durch Aufrufen der Microphone.setLoopback() -Methode mit dem Parameterwert true kann der Audioeingang von einem Mikrofon an das lokale Lautsprechersystem geleitet werden.

Wenn Sound von einem lokalen Mikrofon an lokale Lautsprecher geleitet wird, besteht das Risiko einer Audio-Feedbackschleife (Rückkopplung), die ein lautes Geräusch verursacht und die Sound-Hardware potenziell beschädigen kann. Durch das Aufrufen der Microphone.setUseEchoSuppression() -Methode mit dem Parameter true wird das Risiko einer Rückkopplung reduziert, jedoch nicht vollständig beseitigt. Es wird empfohlen, stets Microphone.setUseEchoSuppression(true) aufzurufen, bevor Microphone.setLoopback(true) aufgerufen wird, es sei denn, Sie sind sicher, dass der Benutzer den Sound über einen Kopfhörer oder ein anderes Wiedergabesystem außer Lautsprechern wiedergibt.

Im folgenden Code wird gezeigt, wie Audio von einem lokalen Mikrofon an die lokalen Systemlautsprecher geleitet wird:

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

Ändern von Mikrofonaudiodaten

Ihre Anwendung kann die von einem Mikrofon aufgenommenen Audiodaten auf zwei Arten ändern. Zunächst kann sie die Signalstärke des Eingabesounds ändern, wodurch letztlich die Eingabewerte mit einem bestimmten Wert multipliziert werden, um einen lauteren oder leiseren Sound zu erzeugen. Die Microphone.gain -Eigenschaft akzeptiert numerische Werte zwischen 0 und 100 (einschließlich). Ein Wert von 50 verhält sich wie ein Multiplikator von eins und steht für eine normale Lautstärke. Ein Wert von Null verhält sich wie ein Multiplikator von Null und schaltet das Eingangsaudio stumm. Werte oberhalb von 50 stehen für eine höhere als die normale Lautstärke.

Außerdem kann Ihre Anwendung die Abtastrate des Eingangsaudios ändern. Höhere Abtastraten ergeben eine bessere Soundqualität, erzeugen jedoch auch dichtere Datenströme, die bei der Übertragung und Speicherung mehr Ressourcen belegen. Die Microphone.rate -Eigenschaft steht für die Audio-Abtastrate, die in Kilohertz (kHz) gemessen wird. Die Standard-Abtastrate beträgt 8 kHz. Sie können die Microphone.rate -Eigenschaft auf einen Wert höher als 8 kHz einstellen, wenn Ihr Mikrofon die höhere Abtastrate unterstützt. Das Setzen der Microphone.rate -Eigenschaft auf den Wert 11 stellt die Abtastrate auf 11 kHz ein. Das Einstellen auf den Wert 22 führt zu einer Abtastrate von 22 kHz usw. Welche Abtastraten zur Verfügung stehen, hängt vom ausgewählten Codec ab. Wenn Sie den Nellymoser-Codec verwenden, können Sie als Abtastrate 5, 8, 11, 16, 22 und 44 kHz festlegen. Wenn Sie den Speex-Codec verwenden (verfügbar ab Flash Player 10 und Adobe AIR 1.5), können Sie nur 16 kHz verwenden.

Erfassen einer Mikrofonaktivität

Flash Player versucht zu erkennen, wenn kein Sound über ein Mikrofon übertragen wird, um Bandbreite und Verarbeitungsressourcen zu schonen. Bleibt die Mikrofonaktivität über einen bestimmten Zeitraum unter der Ruhelautstärke, stoppt Flash Player die Übertragung des Audioeingangs und löst stattdessen ein einfaches ActivityEvent aus. Wenn Sie den Speex-Codec verwenden (verfügbar ab Flash Player 10 und Adobe AIR 1.5), stellen Sie die Ruhelautstärke auf 0, um sicherzustellen, dass die Anwendung kontinuierlich Audiodaten überträgt. Die Speex-Tonaktivitätserkennung verringert automatisch die Bandbreite.

Hinweis: Ein Microphone-Objekt löst nur Aktivitätsereignisse aus, wenn die Anwendung das Mikrofon überwacht. Wenn Sie setLoopBack( true ) nicht aufrufen, sollten Sie deshalb einen Listener für SampleData-Ereignisse hinzufügen oder das Mikrofon einem NetStream-Objekt zuordnen. Es werden dann keine Aktivitätsereignisse ausgelöst.

Das Erfassen einer Mikrofonaktivität wird von drei Eigenschaften der Microphone-Klasse überwacht und gesteuert:

  • Die schreibgeschützte activityLevel -Eigenschaft gibt den Betrag des von einem Mikrofon erfassten Sounds auf einer Skala zwischen 0 und 100 an.

  • Die silenceLevel -Eigenschaft legt die zum Aktivieren des Mikrofons und zum Auslösen eines ActivityEvent.ACTIVITY -Ereignisses erforderliche Lautstärke fest. Auch die silenceLevel -Eigenschaft verwendet eine Skala von 0 bis 100; der Standardwert ist 10.

  • Die silenceTimeout -Eigenschaft legt einen Zeitraum in Millisekunden fest, über den die Mikrofonaktivität unter der Ruhelautstärke bleiben muss, damit ein ActivityEvent.ACTIVITY -Ereignis ausgelöst wird. Ein solches Ereignis kennzeichnet, dass das Mikrofon jetzt stumm ist. Der Standardwert für silenceTimeout ist 2000.

Die Eigenschaften Microphone.silenceLevel und Microphone.silenceTimeout sind schreibgeschützt, ihre Werte können jedoch mithilfe der Microphone.setSilenceLevel() -Methode geändert werden.

In einigen Fällen kann das Aktivieren des Mikrofons eine kurze Verzögerung verursachen, wenn eine neue Aktivität erfasst wird. Diese Aktivierungsverzögerungen können vermieden werden, indem das Mikrofon jederzeit aktiv bleibt. Ihre Anwendung kann die Microphone.setSilenceLevel() -Methode mit einem Wert Null für den Parameter silenceLevel aufrufen, um Flash Player anzuweisen, das Mikrofon stets aktiv zu halten und Audiodaten auch dann aufzunehmen, wenn kein Sound erfasst wird. Entsprechend verhindert der Wert 100 für den Parameter silenceLevel , dass das Mikrofon überhaupt aktiviert wird.

Mit dem folgenden Beispielcode werden Informationen zum Mikrofon und Berichte zu Aktivitätsereignissen und Statusereignissen angezeigt, die von einem Microphone-Objekt ausgelöst werden:

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); 
}

Wenn Sie das oben stehende Beispiel ausführen, sprechen Sie in das Systemmikrofon oder erzeugen Sie ein Geräusch, und achten Sie dabei auf die trace-Anweisungen, die im Konsolen- oder Debugging-Fenster angezeigt werden.

Senden von Audiodaten an einen Media Server oder Empfangen von Audiodaten von einem Media Server

Wenn Sie ActionScript mit einem Streaming Media Server wie dem Flash Media Server verwenden, stehen Ihnen zusätzliche Audiofunktionen zur Verfügung.

Genauer gesagt, Ihre Anwendung kann ein Microphone-Objekt an ein NetStream-Objekt anhängen und Daten direkt vom Benutzermikrofon an den Server übertragen. Audiodaten können auch vom Server an eine Anwendung gestreamt und als Teil eines Movieclips oder mithilfe eines Video-Objekts wiedergegeben werden.

Der Speex-Codec ist ab Flash Player 10 und Adobe AIR 1.5 verfügbar. Um den Codec festzulegen, der für an den Medienserver gesendete Audiodaten verwendet wird, stellen Sie die codec -Eigenschaft des Microphone-Objekts ein. Diese Eigenschaft kann zwei Werte annehmen, die in der SoundCodec-Klasse festgelegt werden. Durch Setzen der codec-Eigenschaft auf SoundCodec.SPEEX wird der Speex-Codec für die Komprimierung von Audiodaten gewählt. Durch Setzen der Eigenschaft auf SoundCodec.NELLYMOSER (die Standardeinstellung), wird der Nellymoser-Codec für die Komprimierung von Audiodaten gewählt.

Weitere Informationen finden Sie in der Dokumentation zu Flash Media Server unter www.adobe.com/go/learn_fms_docs_de .

Erfassen von Sounddaten über ein Mikrofon

In Flash Player 10.1. und AIR 2 oder höher können Sie Sounddaten über ein Mikrofon als Byte-Array aus Gleitkommawerten erfassen. Jeder Wert entspricht einem Sample der monofonischen Audiodaten.

Zum Erfassen von Daten über ein Mikrofon legen Sie einen Ereignis-Listener für das sampleData -Ereignis des Microphone-Objekts fest. Das Microphone-Objekt löst regelmäßig sampleData -Ereignisse aus, während der Mikrofonpuffer mit Soundsamples gefüllt wird. Das SampleDataEvent-Objekt verfügt über eine data -Eigenschaft, bei der es sich um ein Byte-Array aus Soundsamples handelt. Die Samples werden als Gleitkommawerte dargestellt, die jeweils ein monofonisches Soundsample repräsentieren.

Mit dem folgenden Code werden über ein Mikrofon Sounddaten in einem ByteArray-Objekt namens soundBytes erfasst:

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); 
    } 
}

Sie können die Samplebyte zur Audiowiedergabe für ein Sound-Objekt wieder verwenden. In diesem Fall sollten Sie die rate -Eigenschaft des Microphone-Objekts auf 44 einstellen. Dies ist die von Sound-Objekten verwendete Abtastrate. (Sie können auch mit einer niedrigeren Abtastrate erfasste Mikrofonsamples in 44 kHz umwandeln, wie für das Sound-Objekt erforderlich.) Beachten Sie auch, dass das Microphone-Objekt monofonische Samples erfasst, während das Sound-Objekt Stereo verwendet. Deshalb müssen alle über das Microphone-Objekt erfassten Byte zweimal in das Sound-Objekt geschrieben werden. Im folgenden Beispiel werden Mikrofondaten mit einer Länge von 4 Sekunden erfasst und mithilfe eines Sound-Objekts wiedergegeben:

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."); 
}

Weitere Informationen zum Wiedergeben von Sound auf Grundlage von Soundsample-Daten finden Sie unter Verwenden von dynamisch generierten Audiodaten .