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的功能 就实现了。
actionscript 截图功能实现的更多相关文章
- canvas与html5实现视频截图功能
这段时间一直在研究canvas,突发奇想想做一个可以截屏视频的功能,然后把图片拉去做表情包,哈哈哈哈哈哈~~ 制作方法: 1.在页面中加载视频 在使用canvas制作这个截图功能时,首先必须保证页面上 ...
- Selenium2学习-023-WebUI自动化实战实例-021-获取浏览器显示区域大小,通过 WebDriver 截图功能
之前的博文 020-JavaScript 在 Selenium 自动化中的应用实例之二(获取浏览器显示区域大小) 简述了通过 JavaScript 获取浏览器显示区域大小,此文将简述另一种获取浏览器显 ...
- mac qq截图功能失效后,如何重启截图功能?
在finder中打开应用程序目录,找到QQ,右键单击QQ,选择显示包内容,此时会打开一个文件夹. 进入以下路径Library/LoginItems然后双击ScreenCapture这个进程,截图功能即 ...
- C#软件开发实例.个人定制自己的屏幕抓图工具(八)加入了截图功能键盘
章文件夹 (一)功能概览 (二)创建项目.注冊热键.显示截图主窗体 (三)托盘图标及菜单的实现 (四)基本截图功能实现 (五)针对拖拽时闪烁卡顿现象的优化 (六)加入配置管理功能 (七)加入放大镜的功 ...
- Qt5:Qt中屏幕或窗口截图功能的实现
要想在Qt中实现屏幕或窗口截图功能 ,通常有两种方法: 1 -- 使用 QPixmap 类 2 -- 使用 QScreen类 然而虽然俩两种方法用到的类不相同,但是调用到的类成员函数的函数名称和参 ...
- 基于java的后台截图功能的实现
Java后台截图功能的实现 背景介绍: 在近期开发的可视化二期项目中的邮件项目中,邮件中的正文中含有图片.该图片的产生是将一些html网页转为图片格式,刚开始考虑使用第三方组件库html2image和 ...
- 封装selenium自动化框架中的截图功能
对selenium自带的截图功能进行封装: 以下为封装的代码,自定义一个.py文件即可,图片路径自己设置一个. #coding:utf-8 class Screen(object): ''' 封装的截 ...
- HTMLTESTRunner自动化测试报告增加截图功能
我们都知道HTMLTESTRunner自动化测试报告,是Unittest单元测试框架报告,那么在做ui测试的时候就有点不适用了. 我们需要出错截图功能. 以下是我改的,增加了截图功能,先展示界面,再展 ...
- WPF C#截图功能 仿qq截图
原文:WPF C#截图功能 仿qq截图 先上效果图 源码下载地址:http://download.csdn.net/detail/candyvoice/9788099 描述:启动程序,点击窗口butt ...
随机推荐
- CSS3 HSL()详解:
这是CSS3新增的颜色表示模式.在CSS2中,只有RGB(red.green和blue的缩写)和十六进制两种颜色模式.为了能够支持颜色的透明度,CSS3新增了RGBA(A是Alpha缩写).但是无论是 ...
- linux环境下android-ndk下的ffmpeg编译
目前正在做手机底层播放器对的开发,需要用的ffmpeg,因为是新手,所以先从ffmpeg的编译开始做起.虽然是在前人的基础上,但是在linux上编译确实头一遭,因此在编译中,总有些坑是必须要填的,下面 ...
- 断言(assert)的用法
我一直以为assert仅仅是个报错函数,事实上,它居然是个宏,并且作用并非“报错”. 在经过对其进行一定了解之后,对其作用及用法有了一定的了解,assert()的用法像是一种“契约式编程”,在我的理解 ...
- 学习ios【1】Objective-C 基本语法
一 了解一下,找参考资料 1.看书学习object-c语法,第一本看的是<objective-c程序设计>. 2.官网:https://developer.apple.com/librar ...
- innodb 存储引擎特性
使用独立表空间后,系统表空间存储什么内容呢? 1.innodb 数据字典信息 和存储引擎相关. frm 是服务器的数据字典和存储引擎无关. 2. undo 回滚段. 可以单独存储. ...
- sed 使用
Sed简介 sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(pattern space),接着用sed命令处理缓冲区中的内 ...
- iOS多线程中performSelector: 和dispatch_time的不同
iOS中timer相关的延时调用,常见的有NSObject中的performSelector:withObject:afterDelay:这个方法在调用的时候会设置当前runloop中timer,还有 ...
- Jupyter Notebook 27绝技——27 Jupyter Notebook tips, tricks and shortcuts
转载自:https://www.dataquest.io/blog/jupyter-notebook-tips-tricks-shortcuts/ Jupyter notebook, formerly ...
- 初学Scala
由于项目的需要接触了Scala语言,也花了一些时间来了解和学习Scala,今天对学习的Scala进行一个小的总结. 1.What is Scala? Scala的官方网站上给出的解释是: Scala ...
- 作业七:团队项目——Alpha版本冲刺阶段008
今日进度:组内成员讨论 今日安排:组内成员分工