Flash/Flex学习笔记(12):FMS 3.5之如何做视频实时直播
时间:2022-04-23
本文章向大家介绍Flash/Flex学习笔记(12):FMS 3.5之如何做视频实时直播,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
硬件条件:一个摄像头 + 一台FMS服务器即可
原理:摄像头实时采集视频源,然后推送到FMS服务器,其它客户从FMS上获取视频流。
需要做二个fla,一个用于向FMS服务端推送视频源(即发送端),一个用于从FMS服务器获取并播放视频(即接收端)
Server.fla关键代码:
var cam:Camera;
var vod:Video;
var intervalId:uint;
var intelvalTimes:uint=0;
var isWorked=false;
var nc:NetConnection;
var ns:NetStream;
btnPublish.addEventListener(MouseEvent.CLICK,btnPublishClick);
lblMsg.text = "连接好摄像头后,n点击下面的按钮"
//摄像头有活动时,被触发
function camActivityHandler(e:ActivityEvent) {
trace(e);
if (!isWorked) {
intervalId=setInterval(checkCallBack,100);
}
}
function checkCallBack():void {
intelvalTimes+=1;
trace(intelvalTimes);
if (cam.currentFPS>0) {
lblMsg.text="摄像头工作正常!";
isWorked=true;
clearInterval(intervalId);
ns.publish("myCamera", "live");
//同时处理本地播放
vod = new Video();
vod.attachCamera(cam);
vod.height=cam.height;
vod.width=cam.width;
vod.x = 45;
vod.y = 15;
addChild(vod);
} else {
if (intelvalTimes>=10) {//持续检测2秒,仍然无图象的话,认为"设备无法使用(占用中)"
lblMsg.text="设备无法使用(有可能被占用)";
clearInterval(intervalId);
}
}
}
//用户选择"同意"或"不允许"使用摄像头时触发
function statusHandler(e:StatusEvent) {
trace(e);
if (e.code=="Camera.Muted") {
lblMsg.text="您不允许使用摄像头!";
} else if (e.code == "Camera.Unmuted") {
lblMsg.text="摄像头视频获取中...";
}
}
//推送按钮点击事件
function btnPublishClick(e:MouseEvent) {
nc = new NetConnection();
nc.addEventListener(NetStatusEvent.NET_STATUS, NetStatusHandler);
nc.connect("rtmp://fms服务器ip地址/camlive");
}
//连接状态处理代码
function NetStatusHandler(event:NetStatusEvent):void {
trace(event.info.code);
if (event.info.code=="NetConnection.Connect.Success") {
cam=Camera.getCamera();
if (cam==null) {
this.lblMsg.text="未安装摄像头!";
return;
}
cam.addEventListener(StatusEvent.STATUS, statusHandler);
cam.addEventListener(ActivityEvent.ACTIVITY,camActivityHandler);
ns=new NetStream(nc);
ns.attachCamera(cam);
}
}
Client.fla关键代码:
var nc:NetConnection;
var ns:NetStream;
var vod:Video;
btnReceive.addEventListener(MouseEvent.CLICK,function(){
nc = new NetConnection();
nc.addEventListener(NetStatusEvent.NET_STATUS, NetStatusHandler);
nc.connect("rtmp://fms服务器ip地址/camlive");
})
//连接状态处理代码
function NetStatusHandler(event:NetStatusEvent):void {
trace(event.info.code);
if (event.info.code=="NetConnection.Connect.Success") {
lblMsg.text = "正在获取视频..."
ns=new NetStream(nc);
ns.addEventListener(NetStatusEvent.NET_STATUS,nsNetStatusHandler);
ns.play("myCamera");
vod = new Video();
vod.x=45;
vod.y=15;
vod.height=120;
vod.width=160;
vod.attachNetStream(ns);
addChild(vod);
}
}
function nsNetStatusHandler(e:NetStatusEvent){
trace(e.info.code);
}
在线演示:
- C和指针小结(C/C++程序设计)
- Netty-整合Protobuf高性能数据传输
- Netty-整合kryo高性能数据传输
- 40个重要的HTML 5面试问题及答案
- js调用原生API--陀螺仪和加速器
- OpenDaylight开发-DataStoreChange监听器三种类型
- express模拟接口
- spring boot开发的日志系统
- elasticsearch 5.0.1安装analysis-ik分词器
- Spring Cloud中Feign如何统一设置验证token
- laravel+react+webpack+babel+gulp的配置
- OpenvSwitch系列之浅析main函数
- 没有公式如何看懂EM算法?
- Google用来处理海量文本去重的simhash算法原理及实现
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- HDFS集群缩容案例: Decommission DataNode
- 应用深度学习进行乳腺癌检测
- 为什么你的数据仓库项目推进不下去?
- 19个有趣的Linux 命令,最后一个?... 打死我都不敢尝试!
- SpringBoot 整合 Quartz 实现 JAVA 定时任务的动态配置
- 使用 IntelliJ IDEA 查看类图,内容极度舒适
- 精选10款谷歌浏览器插件武装你的浏览器
- 王者荣耀为什么不使用微服务架构?
- Dubbo 时间轮
- Spring Boot 无侵入式 实现API接口统一JSON格式返回
- 监控、链路追踪、日志这三者有何区别?
- Dubbo 是如何实现 SPI 机制?
- 签到功能,用 MySQL 还是 Redis ?
- 轻松两步,在 SpringBoot 服务上实现接口限流
- 教程 | 在华为鸿蒙OS上尝鲜,第一个“hello world”