zoukankan      html  css  js  c++  java
  • actionscript 截图功能实现

    由于截图访问的是 外部 rtmp直播流 所以调用BitmapData.draw时 控制台报以下错误:

      SecurityError: Error #2123: 安全沙箱冲突:BitmapData.draw: XXX 不能访问 rtmp://XXXXX。未被授权访问任何策略文件。

    解决方法是:

      我们的视频服务器是用Crtmpserver,网上的解决办法大多是FMS的 ;

          在转码服务器 的 BaseOutNetRTMPStream::SignalAttachedToInStream() 方法中添加以下 + 号的代码:


    in void BaseOutNetRTMPStream::SignalAttachedToInStream(), I added the 
    following code after stream begin to allow Video samples: 


    +        //XXX. notify |RtmpSampleAccess 
    +    /* 
    +        message = StreamMessageFactory::GetNotifyRtmpSampleAccess( 
    +                        _pChannelVideo->id, _rtmpStreamId, absoluteTimestamp, false, true, 
    true); 
    +        TRACK_MESSAGE("Message:\n%s", STR(message.ToString())); 
    +        if (!_pRTMPProtocol->SendMessage(message)) { 
    +                FATAL("Unable to send message"); 
    +                _pRTMPProtocol->EnqueueForDelete(); 
    +                return false; 
    +        } 
    +  */ 

      

     修改以下代码:
        //10. notify |RtmpSampleAccess 
        message = StreamMessageFactory::GetNotifyRtmpSampleAccess( 
            _pChannelAudio->id, _rtmpStreamId, 0, true, true, true); 
        TRACK_MESSAGE("Message:\n%s", STR(message.ToString())); 
        if (!_pRTMPProtocol->SendMessage(message)) { 
          FATAL("Unable to send message"); 
          _pRTMPProtocol->EnqueueForDelete(); 
          return; 
        } 

    在actionscript中的 截图实现过程为:

    var imager:BitmapData = new BitmapData(mvideo.width,mvideo.height);
                        ExternalInterface.call("errorFun","1");    
                        imager.draw(mvideo.video);
                        var bs:ByteArray = new ByteArray();
                        imager.encode(new Rectangle(0,0,mvideo.width,mvideo.height), new flash.display.JPEGEncoderOptions(), bs);
                        var base64Code:String = Base64.encode(bs);
                        ExternalInterface.call("setImage",base64Code);

    Base64的源码为:

    /* Base64 library for ActionScript 3.0.  
    *  
    * Copyright (C) 2007 Ma Bingyao <andot@ujn.edu.cn>  
    * Version: 1.1  
    * LastModified: Oct 26, 2007  
    * This library is free.  You can redistribute it and/or modify it.  
    */    
    /*  
    * interfaces:  
    * import org.phprpc.util.Base64;  
    * import flash.utils.ByteArray;  
    * var data:ByteArray = new ByteArray();  
    * data.writeUTFBytes("Hello PHPRPC");  
    * var b64:String = Base64.encode(data);  
    * trace(b64);  
    * trace(Base64.decode(b64));  
    */    
    package com.zonekey.player{
            import flash.utils.ByteArray;    
            public class Base64 {  
                    private static  const encodeChars:Array =     
                        ['A','B','C','D','E','F','G','H',    
                            'I','J','K','L','M','N','O','P',    
                            'Q','R','S','T','U','V','W','X',    
                            'Y','Z','a','b','c','d','e','f',    
                            'g','h','i','j','k','l','m','n',    
                            'o','p','q','r','s','t','u','v',    
                            'w','x','y','z','0','1','2','3',    
                            '4','5','6','7','8','9','+','/'];    
                    private static  const decodeChars:Array =     
                        [-1, -1, -1, -1, -1, -1, -1, -1,    
                            -1, -1, -1, -1, -1, -1, -1, -1,    
                            -1, -1, -1, -1, -1, -1, -1, -1,    
                            -1, -1, -1, -1, -1, -1, -1, -1,    
                            -1, -1, -1, -1, -1, -1, -1, -1,    
                            -1, -1, -1, 62, -1, -1, -1, 63,    
                            52, 53, 54, 55, 56, 57, 58, 59,    
                            60, 61, -1, -1, -1, -1, -1, -1,    
                            -1,  0,  1,  2,  3,  4,  5,  6,    
                             7,  8,  9, 10, 11, 12, 13, 14,    
                            15, 16, 17, 18, 19, 20, 21, 22,    
                            23, 24, 25, -1, -1, -1, -1, -1,    
                            -1, 26, 27, 28, 29, 30, 31, 32,    
                            33, 34, 35, 36, 37, 38, 39, 40,    
                            41, 42, 43, 44, 45, 46, 47, 48,    
                            49, 50, 51, -1, -1, -1, -1, -1];    
                    
                    public static function encode(data:ByteArray):String {
                            var out:Array = [];    
                            var i:int = 0;    
                            var j:int = 0;    
                            var r:int = data.length % 3;    
                            var len:int = data.length-r;    
                            var c:int;    
                            while (i < len) {    
                                    c = data[i++] << 16 | data[i++] << 8 | data[i++];    
                                    out[j++] = encodeChars[c >> 18] + encodeChars[c >> 12 & 0x3f] + encodeChars[c >> 6 & 0x3f] + encodeChars[c & 0x3f];    
                                }    
                            if (r == 1) {    
                                    c = data[i++];    
                                    out[j++] = encodeChars[c >> 2] + encodeChars[(c & 0x03) << 4] + "==";    
                                }    
                            else if (r == 2) {    
                                    c = data[i++] << 8 | data[i++];    
                                    out[j++] = encodeChars[c >> 10] + encodeChars[c >> 4 & 0x3f] + encodeChars[(c & 0x0f) << 2] + "=";    
                                }    
                            return out.join('');    
                    }
                    
                    public static function decode(str:String):ByteArray {
                        var c1:int;
                        var c2:int;    
                        var c3:int;    
                        var c4:int;    
                        var i:int;    
                        var len:int;    
                        var out:ByteArray;    
                        len = str.length;    
                        i = 0;
                        out = new ByteArray();
                        while (i < len) {  
                            do {
                                c1 = decodeChars[str.charCodeAt(i++) & 0xff];    
                            } while (i < len && c1 == -1);    
                            if (c1 == -1) {    
                                break;    
                            }    
                            // c2        
                            do {    
                                c2 = decodeChars[str.charCodeAt(i++) & 0xff];    
                            } while (i < len && c2 == -1);    
                            if (c2 == -1) {    
                                break;    
                            }    
                            out.writeByte((c1 << 2) | ((c2 & 0x30) >> 4));    
                            // c3    
                            do {    
                                c3 = str.charCodeAt(i++) & 0xff;    
                                if (c3 == 61) {    
                                    return out;    
                                }    
                                c3 = decodeChars[c3];    
                            } while (i < len && c3 == -1);    
                            if (c3 == -1) {    
                                break;    
                            }    
                            out.writeByte(((c2 & 0x0f) << 4) | ((c3 & 0x3c) >> 2));    
                            // c4    
                            do {
                                c4 = str.charCodeAt(i++) & 0xff;    
                                if (c4 == 61) {    
                                    return out;    
                                }    
                                c4 = decodeChars[c4];    
                            } while (i < len && c4 == -1);    
                            if (c4 == -1) {    
                                break;    
                            }    
                            out.writeByte(((c3 & 0x03) << 6) | c4);    
                        }
                        return out;
                    }
                }    
        }

    至此,actionscript的截图并将图片的base64码传递给javascript的功能 就实现了。

  • 相关阅读:
    SpringBoot引入spring-boot-starter-security后无法接收前端请求
    虚拟机IP地址不断改变的解决办法
    加密
    Golang设计模式学习笔记--建造者模式
    goland快捷键
    使用webhook实现博客网站自动化部署
    hugo + nginx 搭建博客记录
    Maven打包方式(多模块)
    如何抑制SettingWithCopyWarning
    时间复杂度分析--公式法
  • 原文地址:https://www.cnblogs.com/Mvloveyouforever/p/6007610.html
Copyright © 2011-2022 走看看