예제 #1
0
        /// <summary>
        /// This is a javascript application.
        /// </summary>
        /// <param name="page">HTML document rendered by the web server which can now be enhanced.</param>
        public Application(IDefault page)
        {
            // http://blog.teamtreehouse.com/accessing-the-device-camera-with-getusermedia
            // http://stackoverflow.com/questions/11539689/why-localstreams-contains-localmediastream-and-remotestreams-contains-mediastrea
            // https://developer.mozilla.org/en-US/docs/Web/API/Navigator.getUserMedia
            // http://neave.github.io/face-detection/


            var navigator = (NavigatorUserMedia)(object)Native.window.navigator;

            var successCallback =
                new Action <LocalMediaStream>(
                    localMediaStream =>
            {
                Console.WriteLine("got video");

                //var src = (string)new IFunction("return window.URL.createObjectURL(this);").apply(localMediaStream);

                var v = new IHTMLVideo {
                    src = localMediaStream.ToObjectURL()
                }.AttachToDocument();

                v.play();
            }
                    );

            var errorCallback =
                new Action <NavigatorUserMediaError>(
                    e =>
            {
                // restart on error? :P
                Native.window.alert("no video: " + new { e.code });
            }
                    );

            //var a = 1;

            //var c = new MediaStreamConstraints { video = a == 1, audio = a == 0 };

            //var o = new IFunction("return {video: true};").apply(null);


            navigator.webkitGetUserMedia(
                new { video = true, audio = false },
                successCallback: IFunction.OfDelegate(
                    successCallback
                    ),
                errorCallback: IFunction.OfDelegate(
                    errorCallback
                    )
                );

            @"Hello world".ToDocumentTitle();
            // Send data from JavaScript to the server tier
            service.WebMethod2(
                @"A string from JavaScript.",
                value => value.ToDocumentTitle()
                );
        }
예제 #2
0
        /// <summary>
        /// This is a javascript application.
        /// </summary>
        /// <param name="page">HTML document rendered by the web server which can now be enhanced.</param>
        public Application(IApp page)
        {
            // http://www.brucelawson.co.uk/2012/specifying-which-camera-in-getusermedia/
            // https://groups.google.com/forum/#!topic/discuss-webrtc/xLBdsLz_Mbw
            // http://stackoverflow.com/questions/15322622/using-multiple-usb-cameras-with-web-rtc

            // dont we have async available?
            Native.window.navigator.getUserMedia(
                stream =>
            {
                // getUserMedia error { code = , message = , name = DevicesNotFoundError }


                var v = new IHTMLVideo {
                    src = stream.ToObjectURL()
                };

                v.AttachToDocument();

                v.play();

                new IHTMLButton {
                    innerText = "record frame"
                }.AttachToDocument().onclick +=
                    delegate
                {
                    // Uncaught IndexSizeError: Index or size was negative, or greater than the allowed value.
                    var c = new CanvasRenderingContext2D(v.clientWidth, v.clientHeight);

                    c.drawImage(
                        v, 0, 0, c.canvas.width, c.canvas.height
                        );

                    var bytes = c.bytes;

                    c.canvas.AttachToDocument();
                };

                new IHTMLButton {
                    innerText = "record gif"
                }.AttachToDocument().WhenClicked(

                    async btn =>
                {
                    btn.disabled = true;


                    var frames = new List <byte[]>();
                    var x      = v.clientWidth;
                    var y      = v.clientHeight;

                    //new Timer(
                    //    async tt =>
                    //    {


                    btn.innerText = "rec " + new { frames.Count }.ToString();
                    //while (frames.Count < 60)

                    //while (frames.Count < 20)
                    while (frames.Count < 2)

                    // works with two frames.
                    // are we logging too much data?

                    // cant we hop to another thread in bytes instead yet?
                    // https://sites.google.com/a/jsc-solutions.net/work/knowledge-base/15-dualvr/20160108
                    // are we encoding grame bytes as base64?

                    {
                        await Task.Delay(1000 / 5);

                        btn.innerText = new { frames.Count }.ToString();

                        var bytes = v.bytes;

                        Console.WriteLine(new { bytes.Length });

                        // script: error JSC1000: No implementation found for this native method, please implement
                        // [System.Threading.Tasks.TaskFactory`1.
                        // StartNew(, System.Object, System.Threading.CancellationToken, System.Threading.Tasks.TaskCreationOptions, System.Threading.Tasks.TaskScheduler)]

                        frames.Add(bytes);
                    }


                    Console.WriteLine("encoding!");

                    var e = new Stopwatch();
                    e.Start();


                    // crashes the browser why???
                    var src = await new GIFEncoderWorker(
                        x,
                        y,
                        delay: 1000 / 10,
                        frames: frames,
                        AtFrame:
                        async index =>
                    {
                        btn.innerText = new { index, frames.Count }.ToString();

                        if (index == frames.Count - 1)
                        {
                            btn.style.color = "blue";
                            await Task.Delay(800);
                            btn.style.color = "";

                            btn.innerText = "record gif";
                        }
                    }


                        );


                    Console.WriteLine("done! " + new { e.Elapsed });

                    new IHTMLImage {
                        src = src
                    }.AttachToDocument();


                    btn.disabled = false;


                    btn.title = new { e.Elapsed, src.Length }.ToString();
                }
                    );
            }
                );
        }