Geluidsinvoer vastleggen

Flash Player 9 of hoger, Adobe AIR 1.0 of hoger

Via de klasse Microphone kan uw toepassing verbinding maken met een microfoon of een ander geluidsinvoerapparaat op het systeem van de gebruiker, en de invoeraudio vervolgens naar de luidsprekers van dat systeem verzenden of de audiogegevens naar een externe server verzenden, zoals Flash Media Server. U kunt de onbewerkte audiogegevens van de microfoon benaderen en deze opnemen of bewerken. U kunt de audio ook rechtstreeks naar de luidsprekers van het systeem sturen of gecomprimeerde audiogegevens naar een externe server zenden. U kunt de codec Speex of Nellymoser gebruiken voor gegevens die worden verzonden naar een externe server. (De Speex-codec wordt ondersteund vanaf Flash Player 10 en Adobe AIR 1.5.)

Een microfoon gebruiken

De klasse Microphone heeft geen constructormethode. In plaats daarvan gebruikt u de statische methode Microphone.getMicrophone() om een nieuwe instantie Microphone te verkrijgen, zoals hieronder wordt weergegeven:

var mic:Microphone = Microphone.getMicrophone();

Als de methode Microphone.getMicrophone() zonder parameter wordt aangeroepen, wordt het eerste geluidsinvoerapparaat geretourneerd dat op het systeem van de gebruiker wordt gedetecteerd.

Er kan meer dan één geluidsinvoerapparaat op een systeem aangesloten zijn. Uw toepassing kan de eigenschap Microphone.names gebruiken om een array met de namen van alle beschikbare geluidsinvoerapparaten op te vragen. Vervolgens kan de toepassing de methode Microphone.getMicrophone() aanroepen, waarbij de parameter index overeenkomt met de indexwaarde van de naam van een apparaat in de array.

Het is mogelijk dat er geen microfoon of ander geluidsinvoerapparaat op een systeem is aangesloten. U kunt de eigenschap Microphone.names of de methode Microphone.getMicrophone() gebruiken om na te gaan of de gebruiker een geluidsinvoerapparaat heeft geïnstalleerd. Als de gebruiker geen geluidsinvoerapparaat heeft geïnstalleerd, heeft de array names een lengte van nul, en retourneert de methode getMicrophone() de waarde null .

Wanneer uw toepassing de methode Microphone.getMicrophone() aanroept, wordt in Flash Player het dialoogvenster Flash Player Settings weergegeven, waarin de gebruiker wordt gevraagd om Flash Player al dan niet toegang tot de camera en microfoon op het systeem te verlenen. Nadat de gebruiker in dit dialoogvenster op de knop Allow of de knop Deny heeft geklikt, wordt de gebeurtenis StatusEvent verzonden. De eigenschap code van die StatusEvent-instantie geeft aan of microfoontoegang wordt toegestaan dan wel geblokkeerd, zoals wordt weergegeven in dit voorbeeld:

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

De eigenschap StatusEvent.code bevat de waarde Microphone.Unmuted als er toegang wordt verleend, en Microphone.Muted als toegang wordt geweigerd.

De eigenschap Microphone.muted wordt respectievelijk op true of false ingesteld wanneer de gebruiker microfoontoegang toestaat of blokkeert. De eigenschap muted wordt echter pas voor de instantie Microphone ingesteld nadat de gebeurtenis StatusEvent is verzonden, zodat uw toepassing ook moet wachten tot de gebeurtenis StatusEvent.STATUS is verzonden alvorens de waarde van de eigenschap Microphone.muted op te vragen.

Flash Player kan het instellingenvenster alleen weergeven als het toepassingsvenster groot genoeg is (minimaal 215 x 138 pixels). Anders wordt de toegang automatisch geweigerd.

Voor in de AIR-toepassingssandbox uitgevoerde inhoud is geen toestemming van de gebruiker nodig om de microfoon te benaderen. Er worden dus nooit statusgebeurtenissen voor het dempen en dempen ongedaan maken van de microfoon verzonden. Voor in AIR buiten de toepassingssandbox uitgevoerde inhoud is wel toestemming van de gebruiker nodig en deze statusgebeurtenissen kunnen dus worden verzonden.

Microfoonaudio naar lokale luidsprekers leiden

Audio-invoer van een microfoon kan naar de lokale systeemluidsprekers worden geleid door de methode Microphone.setLoopback() met parameterwaarde true aan te roepen.

Wanneer geluid uit een lokale microfoon naar lokale luidsprekers wordt geleid, zou een audiofeedbacklus kunnen ontstaan, waardoor harde piepgeluiden worden afgegeven en de geluidshardware beschadigd kan raken. Als de methode Microphone.setUseEchoSuppression() met parameterwaarde true wordt aangeroepen, wordt de kans op audiofeedback kleiner, maar blijft aanwezig. Het wordt aanbevolen om Microphone.setUseEchoSuppression(true) altijd aan te roepen voordat Microphone.setLoopback(true) wordt aangeroepen, tenzij u er zeker van bent dat de gebruiker het geluid via een hoofdtelefoon of andere apparatuur dan luidsprekers afspeelt.

In de volgende code ziet u hoe u de audio van een lokale microfoon naar de lokale systeemluidsprekers kunt leiden:

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

Microfoonaudio aanpassen

Uw toepassing kan de audiogegevens die uit een microfoon afkomstig zijn, op twee manieren aanpassen. Ten eerste kan de versterking van het invoergeluid worden gewijzigd, waarbij in feite de invoerwaarden met een opgegeven factor worden vermenigvuldigd om een harder of zachter geluid te bereiken. De eigenschap Microphone.gain accepteert numerieke waarden van 0 tot en met 100. De waarde 50 fungeert als vermenigvuldigingsfactor 1, waarmee het basisvolume wordt opgegeven. De waarde 0 fungeert als vermenigvuldigingsfactor 0, waarmee de invoeraudio volledig wordt gedempt. Bij waarden van meer dan 50 wordt het volume verhoogd.

Uw toepassing kan ook de bemonsteringsfrequentie van de invoeraudio wijzigen. Hogere bemonsteringsfrequenties corresponderen met hogere geluidskwaliteit, maar leiden ook tot zwaardere gegevensstreams die meer resources voor overdracht en opslag gebruiken. De eigenschap Microphone.rate vertegenwoordigt de audiobemonsteringsfrequentie gemeten in kilohertz (kHz). De standaardbemonsteringsfrequentie is 8 kHz. U kunt de eigenschap Microphone.rate op een hogere waarde dan 8 kHz instellen als uw microfoon de hogere frequentie ondersteunt. Als de eigenschap Microphone.rate bijvoorbeeld op 11 wordt ingesteld, wordt de samplingfrequentie ingesteld op 11 kHz; bij een waarde van 22 wordt de samplingfrequentie ingesteld op 22 kHz enzovoort. Welke samplingfrequenties beschikbaar zijn, is afhankelijk van de geselecteerde codec. Wanneer u de codec Nellymoser gebruikt, kunt u 5, 8, 11, 16, 22 en 44 kHz opgeven als samplingfrequentie. Wanneer u Speex-codec gebruikt (beschikbaar vanaf Flash Player 10 en Adobe AIR 1.5), bent u beperkt tot 16 kHz.

Microfoonactiviteit detecteren

Om bandbreedte en verwerkingsresources te besparen, probeert Flash Player na te gaan wanneer er geen geluid door een microfoon wordt overgebracht. Wanneer het activiteitsniveau van de microfoon gedurende een bepaalde tijdsperiode onder het stiltedrempelniveau blijft, stopt Flash Player met de overdracht van audio-invoer en wordt in plaats daarvan de eenvoudige gebeurtenis ActivityEvent verzonden. Als u de Speex-codec gebruikt (beschikbaar in Flash Player 10 of hoger en Adobe AIR 1.5 of hoger), stelt u het stilteniveau in op 0 om ervoor te zorgen dat de toepassing continu audiogegevens overzendt. Bij de detectie van Speex-spraakactiviteit wordt de bandbreedte automatisch gereduceerd.

Opmerking: Een Microphone-object verzendt alleen Activity-gebeurtenissen wanneer uw toepassing de microfoon controleert. Als u dus niet setLoopBack( true ) aanroept, een listener toevoegt voor voorbeeldgegevensgebeurtenissen of de microfoon koppelt aan een NetStream-object, worden er geen Activity-gebeurtenissen verzonden.

Drie eigenschappen van de klasse Microphone volgen en controleren de activiteitsdetectie:

  • De alleen-lezen-eigenschap activityLevel vertegenwoordigt de hoeveelheid geluid die door de microfoon wordt gedetecteerd, op een schaal van 0 tot 100.

  • Via de eigenschap silenceLevel wordt opgegeven hoeveel geluid nodig is om de microfoon te activeren en de gebeurtenis ActivityEvent.ACTIVITY te verzenden. Ook voor de eigenschap silenceLevel wordt een schaal van 0 tot 100 gebruikt; de standaardwaarde is 10.

  • Met de eigenschap silenceTimeout wordt opgegeven gedurende hoeveel milliseconden het activiteitsniveau onder het stilteniveau moet blijven voordat de gebeurtenis ActivityEvent.ACTIVITY wordt verzonden ter indicatie dat er nu geen geluid uit de microfoon komt. De standaardwaarde voor silenceTimeout is 2000.

Zowel de eigenschap Microphone.silenceLevel als de eigenschap Microphone.silenceTimeout is alleen-lezen, maar de waarden van deze eigenschappen kunnen worden gewijzigd via de methode Microphone.setSilenceLevel() .

In sommige gevallen kan het proces ter activering van de microfoon bij detectie van nieuwe activiteit tot een korte vertraging leiden. Dergelijke activeringsvertragingen kunnen worden voorkomen door de microfoon altijd actief te houden. Uw toepassing kan de methode Microphone.setSilenceLevel() met de parameter silenceLevel ingesteld op nul gebruiken om Flash Player de opdracht te geven om de microfoon actief te houden, zelfs als er geen geluid wordt gedetecteerd. Als de parameter silenceLevel daarentegen op 100 wordt ingesteld, kan de microfoon helemaal niet worden geactiveerd.

In het volgende voorbeeld wordt informatie over de microfoon weergegeven en wordt melding gemaakt van activiteitsgebeurtenissen en statusgebeurtenissen die door een object Microphone worden verzonden:

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

Wanneer u het bovenstaande voorbeeld uitvoert, moet u spreken of andere geluiden maken in uw systeemmicrofoon en de instructies trace bekijken die worden weergegeven in een console- of foutopsporingsvenster.

Audio naar en van een mediaserver verzenden

Er zijn aanvullende audiomogelijkheden beschikbaar bij gebruik van ActionScript met een streaming-mediaserver zoals Flash Media Server.

Zo kan uw toepassing bijvoorbeeld een object Microphone aan een object NetStream koppelen en gegevens rechtstreeks van de microfoon van de gebruiker naar de server verzenden. Audiogegevens kunnen ook van de server worden gestreamd naar een toepassing die is gemaakt met Flash of Flex, en worden afgespeeld als onderdeel van een filmfragment of door gebruik te maken van een Video-object.

De Speex-codec is beschikbaar vanaf Flash Player 10 en Adobe AIR 1.5. Stel de eigenschap codec van het Microphone-object in om de codec in te stellen die wordt gebruikt voor gecomprimeerde audio die naar de mediaserver is verzonden. Deze eigenschap kan twee waarden hebben die worden opgesomd in de klasse SoundCodec. Stel de eigenschap codec in op SoundCodec.SPEEX als u de codec Speex wilt selecteren voor de compressie van geluid. Stel de eigenschap codec in op SoundCodec.NELLYMOSER (standaardwaarde) als u de codec Nellymoser wilt selecteren voor de compressie van geluid.

Zie de onlinedocumentatie bij Flash Media Server op www.adobe.com/go/learn_fms_docs_nl voor meer informatie.

Geluidsgegevens van een microfoon vastleggen

In Flash Player 10.1. en AIR 2 of later kunt u geluidsgegevens van een microfoon vastleggen als een bytearray of als zwevende-kommawaarden. Elke waarde vertegenwoordigt een sample van homofone audiogegevens.

Als u microfoongegevens wilt opvragen, stel u een gebeurtenislistener in voor de gebeurtenis sampleData van het Microphone-object. Het Microphone-object verzendt periodiek sampleData -gebeurtenissen, terwijl de microfoonbuffer wordt gevuld met geluidssamples. Het SampleDataEvent-object heeft een data -eigenschap die bestaat uit een bytearray van geluidssamples. Deze samples worden allemaal vertegenwoordigd als zwevende-kommawaarden, die elk een homofoon geluidssample zijn.

In de volgende code worden geluidsgegevens van een microfoon vastgelegd in een ByteArray-object met de naam soundBytes :

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

U kunt de samplebytes hergebruiken als audio die kan worden afgespeeld voor een Sound-object. Als u dit doet, moet u de eigenschap rate van het Microphone-object op 44 instellen. Dit is de samplingfrequentie die wordt gebruikt door Sound-objecten. (Microfoonsamples die zijn vastgesteld met een frequentie die lager ligt dan de 44 kHz die wordt vereist door het Sound-object, kunnen worden geconverteerd.) Denk er ook aan dat het Microphone-object homofone samples vastlegt, terwijl het Sound-object stereogeluid gebruikt. Dit betekent dat u elke byte die door het Microphone-object wordt vastgelegd, twee keer naar het Sound-object moet schrijven. In het volgende voorbeeld worden 4 seconden aan geluidsgegevens van een microfoon vastgelegd en worden deze gegevens met een Sound-object afgespeeld:

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

Zie Werken met dynamisch gegenereerde audio voor meer informatie over het afspelen van geluiden van geluidssamplegegevens.