Strömma film genom bytearray i flashplayer 10.1 PDF Skriv ut Skicka sidan
2010-05-12 14:32

Vi har den senaste tiden diskuterat ett case här på jobbet där vi bland annat behöver skydda film. Det har resulterat i en veckas grävande för vår ena systemutvecklare. Nu har vi gjort ett "Proof of concept", för mycket mer är det inte i dagsläget, där en .NET applikation hanterar datan (bilder, texter, filmer, etc) och en Adobe Air applikation som visar upp den. Problemet med detta är att allt som spelas upp/visas kommer att hamna temporärt på datorn någonstans och då har man ju tappat hela idéen med att skydda materialet :/. 

När det gällde just videouppspelningen så var vi länge inne på en serverlösning med Adobe Access 2.0 där drm-skyddat material strömmas till Airklienten alternativt laddas ner för uppspelning offline. Men nu lutar det åt att själva kryptera och strömma filmen till Airklienten och där dekryptera den. Problemet - fram till i förrgår - var att det inte fanns stöd i NetStream klassen för att läsa en ByteArray. Men i och med att Adobe släppte Flash Player 10.1 rc 4, så finns där stöd för att läsa in just en ByteArray och spela upp den!! För att spela upp en ByteArray kallar man på NetStream.appendBytes() som används tillsammans med NetStreamAppendBytesAction klassen.

Jag satte ihop ett exempel där jag delar upp strömmen i två lika delar, den andra delen läggs till efter 2 sekunder, så om du har ett klipp som är kortare än 4 sekunder kommer du att uppleva att bilden pausas.

För att kunna köra filmen nedan måste du ha Flash Player 10.1 release candidate 4 installerad. Har du inte den installerad men kör en debugspelare i lägre version så kommer du att få ett error, annars kommer det inte att hända något alls när du klickar.

Ladda ner och installera från labs.adobe.com.

package 
{
 import flash.display.Sprite;
 import flash.events.Event;
 import flash.events.MouseEvent;
 import flash.events.ProgressEvent;
 import flash.events.TimerEvent;
 import flash.media.Video;
 import flash.net.FileFilter;
 import flash.net.FileReference;
 import flash.net.NetConnection;
 import flash.net.NetStream;
 import flash.net.URLRequest;
 import flash.text.TextField;
 import flash.text.TextFieldAutoSize;
 import flash.text.TextFormat;
 import flash.utils.ByteArray;
 import flash.utils.Timer;
 
 /**
  * ...
  * @author Patric Jonsson
  */
 public class Main extends Sprite 
 {
 private var uploadURL:URLRequest;
        private var file:FileReference;
 
 private var firsthalf:ByteArray;
 private var secondhalf:ByteArray;
 private var netstream:NetStream;
 private var video:Video;
 private var infotext:TextField;
 
 public function Main():void 
 {
 if (stage) init();
 else addEventListener(Event.ADDED_TO_STAGE, init);
 }
 
 private function init(e:Event = null):void 
 {
 removeEventListener(Event.ADDED_TO_STAGE, init);
 // entry point
 
 var format:TextFormat = new TextFormat("_sans");
 infotext = new TextField();
 infotext.selectable = false;
 infotext.text = "Click on stage to browse for a Flash video (*.flv) to play :-)";
 infotext.autoSize = TextFieldAutoSize.CENTER;
 infotext.setTextFormat(format);
 infotext.x = (stage.stageWidth - infotext.width) / 2;
 infotext.y = (stage.stageHeight - infotext.height) / 2;
 addChild(infotext);
 
 stage.addEventListener(MouseEvent.CLICK, onClick);
 }
 
 private function onClick(e:MouseEvent):void 
 {
 uploadURL = new URLRequest();
 file = new FileReference();
 
            file.addEventListener(Event.COMPLETE, completeHandler);
            file.addEventListener(Event.SELECT, selectHandler);
            file.addEventListener(ProgressEvent.PROGRESS, progressHandler);
 
 file.browse(new Array(new FileFilter("Flash video: (*.flv)", "*.flv")));
 }
        private function selectHandler(event:Event):void 
 {
            var file:FileReference = FileReference(event.target);
            file.load();
        }
        private function progressHandler(event:ProgressEvent):void 
 {
            var file:FileReference = FileReference(event.target);
 infotext.text = Math.ceil(event.bytesLoaded / event.bytesTotal) * 100+"% loaded";
        }
 
        private function completeHandler(event:Event):void 
 {
 removeChild(infotext);
 stage.removeEventListener(MouseEvent.CLICK, onClick);
 
            var file:FileReference = FileReference(event.target);
 var bytearray:ByteArray = file.data;
 bytearray.position = 0;
 
 firsthalf = new ByteArray();
 firsthalf.writeBytes(bytearray, 0, bytearray.length / 2);
 firsthalf.position = 0;
 
 bytearray.position = 0;
 secondhalf = new ByteArray();
 secondhalf.writeBytes(bytearray, bytearray.length / 2, bytearray.length / 2);
 secondhalf.position = 0;
 
 var t:Timer = new Timer(2000,1);
 t.addEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete);
 t.start();
 
 var netconnection:NetConnection = new NetConnection();
 netconnection.connect(null);
 
 netstream = new NetStream(netconnection);
 
 var callbackClient:Object = new Object();
 callbackClient.onMetaData = onMetaData;
  
 netstream.client = callbackClient;
 netstream.play(null);
 netstream.appendBytes(firsthalf);
 
 video = new Video();
 video.attachNetStream(netstream);
 
 addChild(video);
 }
 
 private function onTimerComplete(e:TimerEvent):void 
 {
 e.currentTarget.removeEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete);
 netstream.appendBytes(secondhalf);
 }
 
 public function onMetaData(info:Object):void
 {
 video.width = info.width;
 video.height = info.height;
 video.x = (stage.stageWidth - video.width) / 2;
 video.y = (stage.stageHeight - video.height) / 2;
 }
 }
}

 

 

Källa: bytearray.org


Bedöm artikeln:
( 1 Bedömning )
Skapad 2010-05-12 14:32 av Patric Jonsson

Visad 1393 gånger än så länge.

Senaste artiklarna av Patric Jonsson


Senast uppdaterad 2010-05-12 14:49

Kommentarer  

 
0 #1 Jonas Nyström 2010-09-23 19:33
Halloj, såg ditt namn på Thibaults bytearray.org, och hittade hit...
Innebär detta att det (åtminstone teoretiskt) skulle kunna vara möjligt att processa ljudkanalerna i en flv-fil?

mvh / Jonas
Citera
 
 
0 #2 Patric Jonsson 2010-09-24 07:18
Tjena Jonas. Tja, det borde väl vara möjligt. Problemet uppstår väl när man ska återge det då Soundklassen inte stödjer det om jag förstår det hela rätt. Men om du tänker göra andra saker med datan så borde det, rent teoretiskt, gå :)
Citera
 

Lägg till kommentar


Medlemmar


Members Online: 0

Senaste registrerade

LisaRaichand : 22 april 2012 19:55pilu : 31 januari 2012 09:58Gostship99 : 07 januari 2012 19:37Director : 18 november 2011 05:44Dahlback : 17 november 2011 16:28mikwonwheels : 14 november 2011 13:20Kviddis : 04 oktober 2011 19:53buddha1966 : 25 september 2011 14:22idesign : 20 september 2011 08:45TxT : 05 september 2011 11:07ApelG : 05 september 2011 11:04
Partners
Adobe user group
fdt5-logo
TechSmith
Lynda user group
Apress user group
O´reilly user group
Peachpit user group
Friends Of Ed
Manning user group


Senaste blogginläggen

Av: Danel
-20.02.2012
Av: Patric Jonsson
-27.01.2012
Av: Patric Jonsson
- 3.01.2012
Av: Patric Jonsson
-29.11.2011
Av: Danel
-26.11.2011
Av: Patric Jonsson
-14.11.2011
Av: Patric Jonsson
- 8.11.2011
Av: Danel
- 7.11.2011
Av: Patric Jonsson
-27.09.2011

Senaste kommentarer

Senaste trådarna

Av Hallon
- 08/05/2012
Av goldensebbe
- 06/04/2012
Av Hallon
- 29/03/2012
Av buddha1966
- 06/03/2012
Av buddha1966
- 29/02/2012
Av Wide Circle
- 20/02/2012
Av zocstyle
- 15/02/2012
Av ufoalf30
- 05/01/2012
Av peterdavidsson
- 08/12/2011
Av JohnPaulie
- 03/12/2011
Av coffaldo
- 17/11/2011
Av buddha1966
- 05/11/2011
Av buddha1966
- 03/11/2011

Blogkalender

  • 2012 (3)
  • 2011 (37)
  • 2010 (85)
  • 2009 (18)
  • Vem är online

    Vi har 31 besökare online
    RSS
    Patric Jonsson - flashguru.se
    RocketTheme Joomla Templates