Åtkomst av inlästa medier som data

Flash Player 9 och senare, Adobe AIR 1.0 och senare

Använd metoderna BitmapData.draw() och SoundMixer.computeSpectrum()för att få åtkomst till inlästa data. Som standard ges inte åtkomst till pixeldata eller ljuddata från grafik- eller ljudobjekt som återges eller används av media som har lästs in i en annan sandlåda. Men du kan använda följande metoder om du vill ge åtkomst till sådana data över sandlådegränserna:

  • Anropa metoden Security.allowDomain() under återgivningen av det innehåll eller uppspelningen av de data som du vill ge åtkomst till för att ge åtkomst till innehåll i andra domäner.

  • För inläst bild, ljud eller video lägger du till en URL-principfil på servern med den inlästa filen. Denna principfil måste ge åtkomst till domänen med SWF-filen som försöker anropa metoderna BitmapData.draw() eller SoundMixer.computeSpectrum() så att data kan extraheras från filen.

I följande avsnitt beskrivs hur du får åtkomst till bitmapps-, ljud- och videodata.

Åtkomst till bitmappsdata

Med metoden draw() i objektet BitmapData kan du rita de pixlar som för tillfället visas med ett visningsobjekt. Detta kan innehålla pixlarna från objektet MovieClip, Bitmap eller något annat visningsobjekt. Följande villkor måste uppfyllas för att metoden draw() ska rita pixlar till objektet BitmapData:

  • Om det gäller ett annat källobjekt än en inläst bitmapp måste källobjektet och (om det är ett Sprite- eller MovieClip-objekt) alla underordnade objekt komma från samma domän som anropande objekt av metoden draw(). Alternativt måste de finnas i en SWF-fil som är tillgänglig för anroparen via metoden Security.allowDomain().

  • Om det gäller ett källobjekt för inläst bitmapp måste källobjektet komma från samma domän som objektet som anropar metoden draw(). Alternativt måste källservern innehålla en URL-principfil som ger behörighet till den anropande domänen.

Om villkoren inte uppfylls genereras ett SecurityError-undantag.

Om du läser in bilden med metoden load() i klassen Loader kan du ange parametern context, som är ett LoaderContext-objekt. Om du ställer in egenskapen checkPolicyFile för LoaderContext-objektet på true söker Flash Player efter en URL-principfil på servern som bilden läses in på. Om det finns en principfil och om filen godkänner domänen för den inläsande SWF-filen, får filen åtkomst till data i Bitmap-objektet, annars får den inte åtkomst.

Du kan även ange egenskapen checkPolicyFile i en bild som lästs in via taggen <img> i ett textfält. Mer information finns i Inläsning av SWF-filer och bilder via taggen <img> i ett textfält.

Åtkomst av ljuddata

Följande ljudrelaterade API:er i ActionScript 3.0 har säkerhetsbegränsningar:

  • Metoden SoundMixer.computeSpectrum() – Tillåts alltid för kod som körs i samma säkerhetssandlåda som ljudfilen. För kod som körs i andra sandlådor används säkerhetskontroller.

  • Metoden SoundMixer.stopAll() – Tillåts alltid för kod som körs i samma säkerhetssandlåda som ljudfilen. För filer i andra sandlådor finns det säkerhetskontroller.

  • Egenskapen id3 för klassen Sound – tillåts alltid för SWF-filer som finns i samma säkerhetssandlåda som ljudfilen. För kod som körs i andra sandlådor används säkerhetskontroller.

Varje ljud har två typer av associerade sandlådor; en för innehållet och en för ägaren.

  • Den ursprungliga domänen för ljudet utgör innehållssandlådan och denna avgör om data kan extraheras från ljudet via egenskapen id3 och metoden SoundMixer.computeSpectrum().

  • Objektet som startade ljuduppspelningen utgör ägarsandlådan och detta avgör om ljudet kan stoppas via metoden SoundMixer.stopAll().

Om du läser in ljudet med metoden load() i klassen Sound kan du ange parametern context, som är ett SoundLoaderContext-objekt. Om du anger egenskapen checkPolicyFile för SoundLoaderContext-objektet till true söker körningen efter en URL-principfil på den server från vilken ljudet lästes in. Om det finns en principfil som godkänner domänen för den kod som ska läsas in får koden åtkomst till egenskapen id för Sound-objektet, annars får den inte åtkomst. Genom att dessutom ange egenskapen checkPolicyFile kan metoden SoundMixer.computeSpectrum() användas för inlästa ljud.

Du kan använda metoden SoundMixer.areSoundsInaccessible() för att ta reda på om ett anrop till metoden SoundMixer.stopAll() inte kommer att stoppa alla ljud, på grund av att anroparen saknar åtkomst till sandlådan för en eller flera ljudägare.

Genom anrop av metoden SoundMixer.stopAll() stoppas dessa ljud vars ägarsandlåda är densamma som för den som anropar stopAll(). Den stoppar även de ljud vars uppspelning startades med SWF-filer som har anropat metoden Security.allowDomain() för att tillåta åtkomst av domänen med SWF-filen som anropar metoden stopAll(). Några andra ljud stoppas inte och förekomsten av dessa ljud kan upptäckas genom anrop av metoden SoundMixer.areSoundsInaccessible().

För anrop av metoden computeSpectrum() krävs att alla ljud som spelas upp antingen är från samma sandlåda som anropande objekt av metoden eller från en källa som har tilldelats behörighet till anroparens sandlåda, i annat fall genereras ett SecurityError-undantag. För ljud som lästs in från inbäddade ljud i ett bibliotek i en SWF-fil tilldelas behörighet genom ett anrop till metoden Security.allowDomain() i den inlästa SWF-filen. För ljud som lästs in från andra källor än SWF-filer (MP3-filer eller videofiler) är det en URL-principfil på källservern som beviljar tillgång till data i inlästa medier.

Mer information finns i Författarinställningar (för utvecklare) och Webbplatsinställningar (principfiler).

För åtkomst till ljuddata från RTMP-strömmar måste du tillåta åtkomst på servern. Använd egenskapen Client.audioSampleAccess för ActionScript på serversidan om du vill tillåta åtkomst till särskilda kataloger på Flash Media Server. Mer information finns i Språkreferens för ActionScript på server.

Komma åt videodata

Du kan använda metoden BitmapData.draw() för att hämta pixeldata från aktuell bildruta med video.

Det finns två typer av video:

  • Direktuppspelad video via RTMP från Flash Media Server

  • Progressiv video, som läses in från en FLV- eller F4V-fil

Om du vill använda metoden BitmapData.draw() för att extrahera grafik för körningen från RTMP-strömmar måste du tillåta åtkomst på servern. Använd egenskapen Client.videoSampleAccess för ActionScript på serversidan om du vill tillåta åtkomst till särskilda kataloger på Flash Media Server. Mer information finns i Språkreferens för ActionScript på server.

När du anropar metoden BitmapData.draw() med progressiv video som parametern source, måste anroparen av BitmapData.draw() antingen komma från samma sandlåda som FLV-filen eller så måste servern med FLV-filen ha en principfil som tilldelar behörighet till domänen med anropande SWF-fil. Du kan begära att principfilen ska laddas ned genom att ange egenskapen checkPolicyFile för NetStream-objektet med true.