开发环境及工具准备:
Adobe Flex Builder 3
FlashMeidaServer 2 及以上(简称:FMS 本人有一个FMS2破解版,需要的话联系我)
技能准备:
ActionScript 3 (简称:AS)
本功能的实现方式基于FMS为主,ActionScript为辅,双方交互的原则,示意图如下:
描述:教师端采集本地摄像头视频及MIC音频通过AS发布到FMS,学生端通过AS连接FMS服务器或者教师传输的音视频数据进行播放。至此为止,即可实现教师的音视频数据共享(即直播效果)。
具体实现(教师端):
STEP1:在Flex Application 的creationComplete事件调用init方法
- private var conn:NetConnection = new NetConnection();//用来连接FMS
- private var stream:NetStream = null;//盛放音视频数据
- //FMS连接串(例如:rtmp://192.168.1.101/fmsapp)
- //其中需要在FMS_HOME/applications/新建一个fmsapp的文件夹
- private var fms:String = "";
- private function init():void {
- //轨道通信,必须要设置
- conn.objectEncoding = ObjectEncoding.AMF0 ;
- //共享对象轨道通信设置
- SharedObject.defaultObjectEncoding = ObjectEncoding.AMF0;
- //连接FMS服务器
- conn.connect(fms) ;
- //连接FMS结果事件处理器
- conn.addEventListener(NetStatusEvent.NET_STATUS,connectFMS) ;
- }
STEP2:连接FMS成功后,发布音视频数据到FMS服务端
- private function connectFMS(e:NetStatusEvent):void {
- var result:String = e.info.code ;//连接FMS的返回代码
- switch(result) {
- case "NetConnection.Connect.Success"://连接FMS成功
- playStream();//开发传送音视频数据
- break;
- case "NetStream.Play.StreamNotFound":
- Alert.show( "视频流没有找到");
- break;
- default :
- Alert.show( "连接服务器失败,检查网络环境");
- break ;
- }
- }
- public var cam1:Camera = null;//摄像头对象
- private var mir:Microphone = null;//麦克对象
- private function playStream():void {
- stream = new NetStream(conn);//创建于FMS连接相关的音视频数据流对象
- cam1 = Camera.getCamera("0");//获得默认摄像头
- cam1.setMode(320,240,15); //经试验:320*240效果较佳而占用网络流量较小 15为keyFrame
- cam1.setQuality(100 * 1000,90); //100*1000为上传带宽 90为图像质量
- mir = Microphone.getMicrophone();//获得麦克对象
- mir.setUseEchoSuppression(true);//抑制回声
- stream.attachAudio(mir);//将音频加入到流中
- stream.attachCamera(cam1);//将视频加入到流中
- vd.attachCamera(cam1);//在Flex Application中放一个VideoDisplay对象,用来本地观看图像
- stream.publish("conf","live");//将音视频数据发布到FMS服务器上,流名称为:conf 发布类型为:live(实时)
- }
至此:教师已将音视频数据发布到FMS。
需要注意的点:摄像头对象的分辨率设置,这样会直接影响到图像的清晰度和传送数据量的大小。
接下来将由学生端对此数据进行读取
STEP1:如教师端STEP1进行相关设置
STEP2:成功连接FMS服务器后,进行音视频数据播放(学生端playStream方法的实现)
- stream = new NetStream(conn);//学生端的流对象 conn为NetConnection对象
- //学生端的缓冲时间。此参数很重要,很多朋友反应:播放视频不流畅。
- //要明确一个观点:没有绝对的实时直播,所谓的直播其实就是在不断的播放缓冲区的数据
- stream.bufferTime = 15;
- //按照道理来说这里应该是检测缓冲区的代码
- //但本程序为展示直播的核心将此代码略掉,有兴趣的朋友可以问我
- v = new Video();
- v.attachNetStream(stream); //将音视频流附加到video对象中
- v.width = vd.width;
- v.height = vd.height;
- v.smoothing = true;
- vd.addChildAt(v,1);//VideoDisplay通过对Video的添加来播放音视频流
- stream.play("conf");//播放教师发布的conf流
至此,学生将实现音视频流的播放。
需要注意的点:缓冲区的设置,实际应用中应根据实际客户带宽来设置缓冲区大小
大家最好找个局域网环境测试下,最好不要在本机测试,这会隐藏很多问题,有什么疑问大家尽管留言!
---------------------------------------------------------
比较有用的学习FMS的资料
基于FMS的远程互动教学系统设计与实现
http://www.docin.com/p-116813055.html
评论
![](https://i-blog.csdnimg.cn/blog_migrate/fc570bb5c65faa93c7f12856da7b9e61.gif)
请教一个问题
private function playStream():void {
stream = new NetStream(conn);//创建于FMS连接相关的音视频数据流对象
cam1 = Camera.getCamera("0");//获得默认摄像头
cam1.setMode(320,240,15); //经试验:320*240效果较佳而占用网络流量较小 15为keyFrame
cam1.setQuality(100 * 1000,90); //100*1000为上传带宽 90为图像质量
mir = Microphone.getMicrophone();//获得麦克对象
mir.setUseEchoSuppression(true);//抑制回声
stream.attachAudio(mir);//将音频加入到流中
stream.attachCamera(cam1);//将视频加入到流中
vd.attachCamera(cam1);//在Flex Application中放一个VideoDisplay对象,用来本地观看图像
stream.publish("conf","live");//将音视频数据发布到FMS服务器上,流名称为:conf 发布类型为:live(实时)
}
以上代码是您以摄像的方式将流发布到服务器上。如果我要发布一个现有的视频到服务器上,客户端以同步的方式看录像(有点类似于直播)。这边要怎么样操作呢。。?
附flex代码:
package
{
import flash.display.Sprite;
import flash.events.*;
import flash.media.Video;
import flash.net.NetConnection;
import flash.net.NetStream;
public class ftest extends Sprite
{
public function ftest()
{
//var params:Object = FlexGlobals.topLevelApplication.parameters;
var fileName:String = "mp4:guang.3gp";
var nc:NetConnection = new NetConnection();
var ns:NetStream;
nc.objectEncoding = flash.net.ObjectEncoding.AMF0;
nc.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus);
var counter:int = 0;
function onNetStatus(evt:NetStatusEvent):void {
trace("onNetStatus: "+evt.info.code);
if (evt.info.code =="NetConnection.Connect.Success") {
ns = new NetStream(nc);
ns.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus);
ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler);
var myVideo:Video = new Video(480, 320);
myVideo.attachNetStream(ns);
addChild(myVideo);
myVideo.x = 0;
myVideo.y = 0;
ns.bufferTime = 0;
ns.backBufferTime = 0;
ns.play(fileName, true);
}
}
//nc.connect("rtmp://192.168.9.128/oflaDemo", true);
nc.connect("rtmp://192.168.1.20/oflaDemo", true);
//nc.close();
function asyncErrorHandler(event:AsyncErrorEvent):void{
//ignore error;
}
NetConnection.prototype.onBWDone = function(p_bw) {
trace("onBWDone: "+ p_bw);
};
NetConnection.prototype.onBWCheck = function() {
return ++counter;
}
}
}
}
我最近也在做这方面的开发
采用 虚拟摄像头录制屏幕 在flex里加载摄像头 publish到red5或者fms服务器上
效果均不是很好 一卡一卡的
你遇到过类似问题吗?
参考知识库