(译)Learning Flash Media Server 3中文版-第2章下部分
(翻译能力有限,仅供个人学习参考,看得懂就好-_-||)2008-5-24 21:28
2.3. 组合录制和播放的应用程序
这个最简单的应用程序,最后可以用来录制和播放。它使用两个视频窗口:在你播放一个已录制的视频的同时,保留现场观看。它使用MovieClip对像来作为扩展类。这个改变展示了你可以如何将一个基于MovieClip的logo加入到你的应用程序中。
照以下步骤来制作:
- 建立一个RecordPlay.fla,舞台尺寸为650X400
- 把logo添加到舞台(简单地画一个logo,选择它后按F8键,选择影片剪辑类型,勾选为ActionScript导出,然后点确定)
- 文档类中填入RecordPlay
- 建立一个RecordPlay.as
- 在RecordPlay.as中添加Example 2-3中的代码
Code View:
package
{
import fl.controls.Button;
import fl.controls.TextInput;
import flash.display.MovieClip;
import flash.net.NetConnection;
import flash.net.NetStream;
import flash.events.NetStatusEvent;
import flash.events.MouseEvent;
import flash.events.Event;
//import flash.net.ObjectEncoding;
import flash.media.Camera;
import flash.media.Microphone;
import flash.media.Video;
public class RecordPlay extends MovieClip
{
private var nc:NetConnection;
private var ns:NetStream;
private var rtmpNow:String;
private var msg:Boolean;
private var cam:Camera;
private var mic:Microphone;
private var vid1:Video;
private var vid2:Video;
private var recordBtn:Button;
private var stopBtn:Button;
private var playBtn:Button;
private var textInput:TextInput;
private var metaSniffer:Object;
private var dur:Number;
function RecordPlay ()
{
//NetConnection.defaultObjectEncoding = flash.net.ObjectEncoding.AMF0;
nc=new NetConnection();
nc.addEventListener (NetStatusEvent.NET_STATUS,checkConnect);
rtmpNow=”rtmp://192.168.0.11/vid2/recordings”;
//rtmpNow=”rtmp:/vid2/recordings”;
nc.connect (rtmpNow);
addMedia ();
addUI ();
recordBtn.addEventListener (MouseEvent.CLICK,startRecord);
stopBtn.addEventListener (MouseEvent.CLICK,stopAll);
playBtn.addEventListener (MouseEvent.CLICK,startPlay);
}
private function checkConnect (e:NetStatusEvent):void
{
msg=(e.info.code==”NetConnection.Connect.Success”);
if (msg)
{
ns = new NetStream(nc);
metaSniffer=new Object();
ns.client=metaSniffer;
metaSniffer.onMetaData=getMeta;
}
}
private function getMeta (mdata:Object):void
{
//Dummy to avoid error
}
private function addMedia ():void
{
cam=Camera.getCamera();
cam.setKeyFrameInterval (12);
cam.setMode (240,180,15);
cam.setQuality (0,80);
mic=Microphone.getMicrophone();
mic.rate=11;
videoSetup ();
}
private function videoSetup ():void
{
vid1=new Video(cam.width,cam.height);
vid1.attachCamera (cam);
vid1.x=100;
vid1.y=70;
addChild (vid1);
vid2=new Video(cam.width,cam.height);
vid2.x=vid1.x+vid1.width+10;
vid2.y=vid1.y;
addChild (vid2);
}
private function addUI ():void
{
recordBtn=new Button();
recordBtn.label=”Record”;
recordBtn.x=100;
recordBtn.y=70+(cam.height) +5;
recordBtn.width=70;
addChild (recordBtn);
stopBtn=new Button();
stopBtn.label=”Stop”;
stopBtn.x=recordBtn.x+100;
stopBtn.y=recordBtn.y;
stopBtn.width=60;
addChild (stopBtn);
playBtn=new Button();
playBtn.label=”Play”;
playBtn.x=stopBtn.x+85;
playBtn.y=recordBtn.y;
playBtn.width=60;
addChild (playBtn);
textInput=new TextInput();
textInput.x=recordBtn.x;
textInput.y=recordBtn.y + 30;
addChild (textInput);
}
private function startRecord (e:Event):void
{
if (ns)
{
recordBtn.label=”Recording”;
ns.attachAudio (mic);
ns.attachCamera (cam);
ns.publish (textInput.text,”record”);
}
}
private function stopAll (e:Event):void
{
playBtn.label=”Play”;
recordBtn.label=”Record”;
ns.close ();
}
private function startPlay (e:Event):void
{
if (ns)
{
playBtn.label=”Playing”;
vid2.attachNetStream (ns);
ns.play (textInput.text);
}
}
}
}
最后一步就是测试你的应用程序了。与本章中的其它两个应用程序一样,使用了相同的RTMP地址。你可以基于相同的服务端程序而建立不同的客户端程序。在RTMP地址中使用不同的实例名称,可以在单个的应用程序中,产生不同的服务端目录。
通过这个简单的应用程序,你现在可以录制和播放任何你想播放的视频了,或者让在世界各地的其它人来播放它。
提示
你将会非常多的使用到你的服务端目录。为了节省时间,建立一个到你的应用程序的快捷方式,这样,每次你需要访问您的服务器端文件夹时,就不必繁琐地浏览您的所有文件夹和子文件夹。
没有优化麦克风和摄影头的设置,它们使用了很多的带宽,你的应用程序没有发挥最大优势。相反,有限度的使用设定,给您提供最好的视频。下一章中,您可以设置摄像头和麦克风来优化您的应用程序。之后的章节,将详述录制和播放FLV文件的不同。若要开始,请确认您使用过了这一章中的应用程序的基本元素。
