上周接到了一个任务,说要基于Flash Media Server4.5来实现视频会议,白板共享和PPT文档浏览同步功能。
这周就开始着手这方面的研究和代码编写,现把中间经过的过程总结如下:
1、如何实现视频会议
基于Flash Media Server来实现视频共享其实很简单,30多行代码就搞定。
public function PublishLive()
{
nc = new NetConnection();
nc.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus);
nc.connect("rtmp://localhost/publishlive");
}
private function onNetStatus(event:NetStatusEvent):void{
trace(event.info.code);
if(event.info.code == "NetConnection.Connect.Success"){
publishCamera();
displayPublishingVideo();
displayPlaybackVideo();
}
}
private function publishCamera() {
cam = Camera.getCamera();
mic = Microphone.getMicrophone();
ns = new NetStream(nc);
ns.attachCamera(cam);
ns.attachAudio(mic);
ns.publish("myCamera", "live");
}
private function displayPublishingVideo():void {
vid = new Video(cam.width, cam.height);
vid.x = 10;
vid.y = 10;
vid.attachCamera(cam);
addChild(vid);
}
private function displayPlaybackVideo():void{
nsPlayer = new NetStream(nc);
nsPlayer.play("myCamera");
vidPlayer = new Video(cam.width, cam.height);
vidPlayer.x = cam.width + 20;
vidPlayer.y = 10;
vidPlayer.attachNetStream(nsPlayer);
addChild(vidPlayer);
}
2、如何实现白板共享
Flash教程里的例子通过200多行 的代码就搞定一个白板功能,而我要实现白板共享,其实就是把线条存储成数组,再通过SharedObject来实现远程共享,再通过
Flash Media Server来实现同步更新,很快就找到了思路。
replay_array = copyArray(pic_so.data._array);
replay(canvas,replay_array,speed_bar.value);
function replay(_mc:MovieClip, _array:Array, speed:Number) {
if (_array.length) {
var line = _array.shift();
var current_mc:MovieClip = _mc.createEmptyMovieClip("line"+_mc.getNextHighestDepth(), _mc.getNextHighestDepth());
var style:Object = line.shift();
var pos:Object = line.shift();
current_mc.lineStyle(style.width,style.color,style.alpha);
current_mc.moveTo(pos.x,pos.y);
onEnterFrame = function () {
drawALine(current_mc,line,speed);
};
} else {
if (pic_so.data._array.length == 0 && _array.length == 0 && myArray[myPicIndex].history_array.length == 0) {
clearAll(canvas,"line");
myArray[myPicIndex].history_array = new Array();
replay_array = new Array();
}
}
}
通过replay方法很快就能把白板的线条在客户端同步描绘。
呵呵,又搞定了白板共享。
3、如何实现PPT同步浏览
首先考虑在Flash里面只能加载图片,无法直接加载PPT文件,所以就找了如何把PPT转换为图片的思路。
你看下面的代码就可以了。
Dim t As New Microsoft.Office.Interop.PowerPoint.Application
Dim jpgPath As String = Folder & "\" & arrPath(0) & "\"
If Not Directory.Exists(jpgPath) Then
Directory.CreateDirectory(jpgPath)
End If
Dim prese As Presentation
If arrPath(1).ToLower = "pptx" Then
prese = t.Presentations.Open2007(Folder & "/" & FileName, MsoTriState.msoCTrue, MsoTriState.msoCTrue, MsoTriState.msoFalse)
Else
prese = t.Presentations.Open(Folder & "/" & FileName, MsoTriState.msoCTrue, MsoTriState.msoCTrue, MsoTriState.msoFalse)
End If
Dim arrFileName(prese.Slides.Count - 1) As String
For Each s As Slide In prese.Slides
s.Export(jpgPath + s.SlideNumber.ToString & ".jpg", "jpg")
arrFileName.SetValue(s.SlideNumber.ToString & ".jpg", s.SlideNumber - 1)
Next
不错,这样Flash加载图片就比较简单了,在这里就不再描述了。
不过这里要注意用Microsoft的Office处理完PPT后要即时干掉未关闭的PowerPoint进程哦
Dim myProcesses()As
Process = Process.GetProcessesByName("POWERPNT")
ForEach
myProcess As
Process In
myProcesses
myProcess.Kill()
Next
最后输出:
图1
图2
图3