建立一个最简单的广播工作室是一个很简单的操作,要求只不过是一个模块与送出现场的音频和视频流。为了使它更容易,特别是在最后,这种应用程序包括一个可重用的类,只不过是为设置流出和流入的流。这个类工作起来,就像一个实用工具类,您可以重新使用,以简化创建流式音频/视频的工作。
6.3.1.公用流类
第一步是建立公用类让音频和视频流可以简单的工作。它使用以下列几类:
Classes
NetConnection
NetStream
Camera
Microphone
Video
这个公用类是扩展NetStream类,这个类有两个公共的方法:一个是流a/v出去(streamOut),一个是流进来(streamIn)。记住,一个流需要一个麦克风实例、一个摄像头实例、一个流的名称。streamOut方法的参数就是这三个元素。
反过来,要播放进来的视频,所有你所需要的是视频对象的名称和流的名称。
因为这首先是最低限度的应用,只有视频流出来,您可能感到奇怪,为什么理会streamIn方法呢?这个类的目的是:不是让一个应用程序更好的开发,而是多个。
在稍后的章节,您将了解如何创造一个“receiver”,像电视机一样工作,而且您将高兴地看到, streamIn方法包括在内。
最后,一个元素你可能不熟悉,是super语句。此公用类是扩展NetStream类。创造一个NetStream实例,你需要包含NetConnection参数。Super语句调用父类的NetConnection,所以,当你建造一个StreamAV实例,您可以包含必要的NetConnection参数。按照下列步骤创建此公用类。
- 建立一个StreamAV.as.
- 添加以下的代码
Example 6-2. StreamAV.as
package
{
import flash.net.NetConnection;
import flash.net.NetStream;
import flash.media.Camera;
import flash.media.Microphone;
import flash.media.Video;
public class StreamAV extends NetStream
{
public function StreamAV (nc:NetConnection)
{
super (nc);
}
public function streamOut (mic:Microphone,cam:Camera,stream:String):void
{
this.attachAudio (mic);
this.attachCamera (cam);
this.publish (stream,"live");
}
public function streamIn (vid:Video,stream:String):void
{
vid.attachNetStream (this);
this.play (stream);
}
}
}
6.3.2.基本的播出演播室
第一个Studio模块非常简单。只是显示"TV Anchor"(你)和”on the air”消息,让你知道你已经连接了。第5章中展示了怎么流进来和流出去。这个模块是简单的流出去-使用StreamAV类帮忙。
Classes
NetConnection
NetStatusEvent
Camera
Microphone
Video
Sprite
TextField
StreamAV
为什么NetStream类没有列在这个应用程序中?因为你将用新的公用类StreamAV处理。在Broadcast和TV 两个应用程序中,使用StreamAV类。
以下介绍建立一个studio的最少步骤:
1. 在MS3的applications目录中建立一个名为studio的目录
2. 建立一个Broadcast.fla与StreamAv.as同一目录
3. 可选,用一个照片来作为studio的背景,或者用flash画一个。使用矩形工具在背景上面画一个矩形,宽200高150,位置为x=150,y=190。这将作为监控屏幕。在左上角的位置,添加了第二个矩形与尺寸为W = 75 ,为H = 21 ,为Y = 21 ,为Y = 68.5 。图6-1显示了总体思路,和图6-2显示什么,您会看到当您执行该脚本。
图6-1. Studio backdrop

4. 建立一个Broadcast.as与StreamAV.as和 Broadcast.fla同一目录
5. 在Broadcast.as文件中添加以下代码
Example 6-3. BroadCast.as
package
{
import flash.net.NetConnection;
import flash.events.NetStatusEvent;
import flash.media.Camera;
import flash.media.Microphone;
import flash.media.Video;
import flash.display.Sprite;
import flash.text.TextField;
public class Broadcast extends Sprite
{
private var nc:NetConnection;
private var cam:Camera;
private var mic:Microphone;
private var vid:Video;
private var rtmpNow:String;
private var onAir:String;
private var broadcast:StreamAV;
private var good:Boolean;
private var txtField:TextField;
public function Broadcast ()
{
//Set Camera and Microphone
nc=new NetConnection ;
nc.addEventListener (NetStatusEvent.NET_STATUS,checkConnect);
cam=Camera.getCamera();
cam.setMode(240,180,15);
cam.setQuality(0,85);
mic=Microphone.getMicrophone();
mic.rate=11;
vid=new Video(240,180);
vid.x=150;
vid.y=90;
addChild(vid);
txtField=new TextField();
txtField.x=150;
txtField.y=75;
addChild(txtField);
rtmpNow="rtmp://192.168.0.11 /studio";
nc.connect (rtmpNow,"anchor");
}
//Connection
private function checkConnect (e:NetStatusEvent)
{
good=e.info.code == "NetConnection.Connect.Success";
if (good)
{
txtField.text="On The Air";
broadcast=new StreamAV(nc);
vid.attachCamera (cam);
broadcast.streamOut (mic,cam,"presentation");
}
}
}
}
当你运行这个模块,你将会看到你自已在监视器中和一个"on the air"信息指示你已连接到服务器了。这个单个的流从你当前的摄像头和麦克风中发出。
图6-2. Broadcast studio

你现在有一个广播室,您需要一个模块来接收串流的材料。这基本上是电视,用户可以观赏到您的视频。
6.3.3.最简单TV
如果您认为最简单工作室是很容易,最简单TV会更容易。所有您需要的是一个视频对象在舞台和您良好的路要走。这些最基本元素,是您需要的类:
Classes
NetConnection
NetStatusEvent
Video
Sprite
StreamAV
像studio,你可以简单的制作你的TV或者精心的制作。我使用了一个老式的TV作为背景,然而在其它方面,它是简单地完美,按以下这些步骤来建立TV:
- 建立一个fla文件,舞台尺寸为360X350
- 你可以把舞台设置更小,但是不能小于215X138。小于那个尺寸的话,就会小于设置窗口,不能工作了。对于这个特别的应用程序,不要让它小于215X150,因为你的视频大小是200X150。还是把它设大点的好。我是基于TV图像的尺寸来定制这个尺寸的。
- 保存TV.fla与StreamAV.as文件同一目录。如果你想把TV和Broadcast模块分开来在不同的目录中,也可以,确保每个目录包含Stream.as文件
- 可选,建立一个TV背景,如图6-3所示
图6-3. Stage for TV module
![clip_image002[4]](http://www.hcxmflash.cn/blog/wp-content/uploads/2008/10/clip-image0024-thumb2.jpg)
5. 建立一个TV.as文件,与TV.fla同一目录
6. 在TV.as文件中添加以下代码
Example 6-4. TV.as
package
{
import flash.net.NetConnection;
import flash.events.NetStatusEvent;
import flash.media.Video;
import flash.display.Sprite;
public class TV extends Sprite
{
private var nc:NetConnection;
private var vid:Video;
private var rtmpNow:String;
private var tvSet:StreamAV;
private var good:Boolean;
public function TV()
{
nc=new NetConnection ;
nc.addEventListener (NetStatusEvent.NET_STATUS,checkConnect);
vid=new Video(200,150);
vid.x=81;
vid.y=76;
addChild (vid);
rtmpNow="rtmp://192.168.0.11 /studio";
nc.connect (rtmpNow,"viewer");
}
//Connection
private function checkConnect (e:NetStatusEvent)
{
good=e.info.code == "NetConnection.Connect.Success";
if (good)
{
tvSet=new StreamAV(nc);
tvSet.streamIn (vid,"presentation");
}
}
}
}
当你完成,测试你的广播系统。首先,加载Broadcast模块和运行它。一旦显示“on the air”,你可以准备运行TV模块了。如果你的TV显示从Studio模块广播过来的图像,每个东西都在工作中。同样地,你可也可以听到从stiduo发过来的声音。
图6-4. Studio stream seen on TV module
![clip_image004[4]](http://www.hcxmflash.cn/blog/wp-content/uploads/2008/10/clip-image0044-thumb2.jpg)
你可能注意到了,在脚本中NetConnection.connect()的参数包含一个额外的值。直到现在,你看到在connect()方法中是应用程序的名称(例如,studio)。两个模块都有一个可选的参数。在这里,这个可选参数指示了用”anchor”或者”viewer” 作为标记。依赖于哪个模块正在运行。在服务端,你将会在下一节中学习到,这个可选参数(唯一的)帮助指示谁正在使用应用程序。可能你想要限制谁可以和不可以使用你的应用程序,使用第二个参数与用户识别码,可以非常方便。