FlashPlayer11中H264和AVC编码视频直播.docx
- 文档编号:15520271
- 上传时间:2023-07-05
- 格式:DOCX
- 页数:17
- 大小:138.05KB
FlashPlayer11中H264和AVC编码视频直播.docx
《FlashPlayer11中H264和AVC编码视频直播.docx》由会员分享,可在线阅读,更多相关《FlashPlayer11中H264和AVC编码视频直播.docx(17页珍藏版)》请在冰点文库上搜索。
FlashPlayer11中H264和AVC编码视频直播
FlashPlayer11
H.264/AVC编码视频直播
必备知识
使用ActionScript3,你应该有一个基本的了解。
用户级别
开始
所需产品
●Adobe媒体服务器5标准
●Flash播放器
·
●H264Encoder_START.zip
●H264Encoder_COMPLETED.zip
随着版本的FlashPlayer11,Adobe已经推出了一些令人兴奋的 新功能,包括原生64位支持和异步位图解码性能的升级,如。
另外,Flash播放器现在可以直播视频流进行编码H.264/AVC标准。
这项新功能允许开发人员创建实时,高品质的视频直播聊天,会议,现场赛事转播的应用。
H264VideoStreamSettings
FlashPlayer对对H.264视频进行编码的能力的核心在于内一个称为H264VideoStreamSettings的新类。
此新的类是一个子类的VideoStreamSettings,和它是什么使您可以控制视频附加到NetStream的压缩设置。
下面的代码允许您对附加到在FlashPlayer中的H.264视频的NetStream到而不是使用默认索伦森火花编解码器的视频进行编码:
importflash.media.H264VideoStreamSettings;
varh264Settings:
H264VideoStreamSettings=newH264VideoStreamSettings();
h264Settings.setProfileLevel(H264Profile.BASELINE,H264Level.LEVEL_3_1)
本文演示了如何利用Flash播放器11.0新H.264编码由你走过发展的一种视频的编码和流媒体应用程序的功能。
通过利用Flex4.6SDK和11.0或更高版本的Flash播放器,您将生成的应用程序将执行以下:
∙捕获从网络摄像头视频直播
∙建立到使用NetConnection的Flash媒体服务器的连接
∙发布视频流从应用程序到Flash媒体服务器使用NetStream
∙显示在应用程序内Video组件中传出视频流从照相机(之前被编码的)
∙发送编码到FlashPlayer对原始网络摄像头视频为H.264编码的参数
∙显示编码视频的元数据
∙使用NetStream的另一个实例的应用程序从Flash媒体服务器流活、编码视频
∙显示新编码、流媒体直播视频在应用程序内的另一个Video组件
入门
若要获取最大的本演练中,您将需要以下内容:
∙Flash播放器11.0或更高的下载最新FlashPlayer在这里
∙Flex4.6SDK或更高的下载最新FlexSDK在这里
∙Flash媒体服务器4.5,或Adobe媒体服务器5
∙视频摄像机连接到计算机
设置服务器
本演练演示带实时视频数据源已编码到h.264/AVC内FlashPlayer和它通过RTMP发送到Flash媒体服务器。
下面的演练假定您使用Flash媒体服务器4.5或Adobe媒体服务器5。
如果您不具有媒体服务器安装程序在线您可以下载免费的Flash媒体开发人员服务器4.5副本在这里.
Flash媒体服务器4.5或Adobe媒体服务器5的基本安装,以后就没有什么更需要要运行该示例。
如果你是新到Flash媒体服务器4.5或Adobe媒体服务器5,并且想要一些关于如何开始使用流媒体的指导,请参阅由约瑟夫·拉布雷克和汤姆绿色——开始Flash媒体服务器4.5本优秀系列.
设置在FlashBuilder项目
示例应用程序是一个简单的ActionScript3.0项目,在FlashPlayer中运行,并利用在中找到的Flash播放器版本11或更高版本,具体的功能。
已完成的版本的应用程序提供(H264Encoder_START和H264Encoder_COMPLETED)和两个启动。
H264Encoder_START导入项目到FlashBuilder通过选择文件->导入Flash生成器项目。
在此应用程序正常工作的秩序,FlashBuilder需要Flash播放器11.0或更高的目标。
发生这种情况,默认情况下当使用Flex4.6SDK,但在使用较早版本像Flex4.5时没有。
有关如何设置与SDK比4.6早项目的说明,请参阅这篇文章.
在Flash生成器中与选定的H264Encoder项目,选择项目->属性->ActionScript编译器。
验证编译器目标至少Flash播放器11.0。
(图1.2)如果不是这样,请选择"使用特定的版本"的单选按钮,然后键入"11.0.0″的值。
图1。
请确保编译器是针对Flash播放器11.0或稍后通过检查项目的属性。
创建应用程序
第一,你会修改H264Encoder_START,以便它可以与附加的网络摄像头进行通信。
此外,您将添加为建立NetConnection来连接到服务器,以及两个NetStream实例;该应用程序所需的代码一个负责从应用程序到Flash媒体服务器,获取视频,一个用于把它带回从服务器应用程序。
连接摄像机,建立一个NetConnection和NetStreams
开放条件下直接类定义语句,但之前的构造函数方法,创建一个名为"nc",数据类型为NetConnection的私有变量。
使用代码提示有Flash生成器生成必要的导入语句为你,或手动导入.NetConnection。
您的代码应如下所示:
package
{
import.NetConnection;
publicclassH264EncoderextendsSprite
{
privatevarnc:
NetConnection;
publicfunctionH264Encoder()
{
}
}
}
创建两个私有变量来表示每个NetStream。
为创建一个流从应用程序到服务器(ns_out),和另一种用于在应用程序中的服务器(ns_in)从返回的流走。
一定要导入.NetStream.
package
{
import.NetConnection;
import.NetStream;
publicclassH264EncoderextendsSprite
{
privatevarnc:
NetConnection;
privatevarns_out:
NetStream;
privatevarns_in:
NetStream;
publicfunctionH264Encoder()
{
}
}
}
接下来,创建一个私有变量命名为cam的类型Camera,并将其值设置=Camera.getCamera()。
在这你不调用构造函数来实例化类型的对象的Camera,Camera类是比其他类,稍有不同。
相反,您调用的Camera类的getCamera()方法。
此方法将返回Camera对象的一个实例,除非没有照相机连接到计算机,或者如果有,但相机是由另一应用程序使用。
一定要导入flash.media.Camera.
privatevarcam:
Camera=Camera.getCamera();
它现在是时候添加将允许应用程序连接到使用NetConnection类的一个实例的服务器的代码。
内提供的initConnection()函数在有关行44,通过实例化的nc:
NetConnection变量,您在步骤1中定义创建新的NetConnection:
privatefunctioninitConnection():
void
{
nc=newNetConnection();
}
它始终是一个好的做法,以验证NetConnection是成功的之前采取任何进一步的行动。
要做到这一点,添加EventListener以侦听一个NetStatusEvent.NET_STATUS类型的事件的事件。
您将在下一节中创建的onNetStatus()事件处理程序。
一定要导入flash.events.NetStatusEvent:
importflash.events.NetStatusEvent;
privatefunctioninitConnection():
void
{
nc=newNetConnection();
nc.addEventListener(NetStatusEvent.NET_STATUS,onNetStatus);
}
下一步仍在initConnection()函数体,告诉NetConnection在哪里通过调用NetConnection类的connect()方法来连接到。
作为此方法的参数,添加的Flash媒体服务器或您想要连接到的Adobe媒体服务器实例中的"活"文件夹的位置的URL。
例如,要连接到您的计算机上本地运行的Flash媒体服务器的实例,您将设置URL为:
"rtmp:
//localhost/live"。
privatefunctioninitConnection():
void
{
nc=newNetConnection();
nc.addEventListener(NetStatusEvent.NET_STATUS,onNetStatus);
nc.connect("rtmp:
//YOUR_SERVER_URL/live");
}
最后,告诉NetConnection服务器应哪里调用回调方法通过将NetConnectionclient属性的值设置为this。
回调方法是调用由服务器时客户端应用程序建立了NetConnection的特殊处理程序函数。
稍后您将在此示例中使用的onMetaData()和onBWDone()的回调方法。
你将会包括这些回调方法在主应用程序类中,事实上是同一个对象,将建立NetConnection,因此值NetConnection实例(nc)的客户端属性应设置为this。
initConnection()函数现在应显示如下:
privatefunctioninitConnection():
void
{
nc=newNetConnection();
nc.addEventListener(NetStatusEvent.NET_STATUS,onNetStatus);
nc.connect("rtmp:
//YOUR_SERVER_URL/live");
nc.client=this;
}
验证成功的NetConnection
如所述,它总是一个好的做法,以验证成功的一个NetConnection的尝试。
若要执行此操作,找到有关行70体上名为onNetStatus()的函数:
protectedfunctiononNetStatus(event:
NetStatusEvent):
void
{
}
在onNetStatus()事件体内,创建trace语句,这在调试过程中输出到控制台event.info.code的值。
代码对象的属性的info在NetStatus事件将包含指示的未遂NetConnection,如"NetGroup.Connect.Success"或"NetGroup.Connect.Failed"状态的String数据。
跟踪此属性的值允许您检查的NetConnection状态很容易,只在调试模式下运行应用程序。
protectedfunctiononNetStatus(event:
NetStatusEvent):
void
{
trace(event.info.code);
}
此演练中的示例应用程序将尝试连接到服务器并开始启动时,自动播放/发布视频。
要实现这一点,请致电initConnection()从内主要类的构造函数方法:
publicfunctionH264_Encoder()
{
initConnection();
}
理解的回调函数
示例应用程序包含两个回调函数——onBWDone()和onMetaData()。
onBWDone()回调检查的可用带宽,可在需要动态地切换视频资产根据当前可用的带宽的应用程序中非常有用。
虽然有必要在(省略它们将生成运行时错误时,服务器会尝试使该函数调用)的客户端代码中包括这些函数不是必要,其实他们做任何事。
此应用程序并不被有关监测带宽,所以onBWDone()可以离开作为一个空函数。
onMetaData()回调函数访问视频流的元数据,有用,示例应用程序提供了内此回调只是这样做的代码。
onMetaData()回调函数返回一个Array的泛型对象,表示视频流的元数据。
稍后,您将使用这些对象,将该信息在用户界面中的显示对应于各种元数据。
下一步,您将添加代码,使应用程序要读取网络摄像头的数据,进行编码为H.264,那网络摄像头数据,然后流到服务器已编码的视频。
H.264设置了修改编码,并发布到视频的NetStream
此下一节中,您将会将您的网络摄像机附加到Camera类的一个实例。
您然后将编码H.264使用Camera类和H264VideoStreamSettings的属性的网络摄像头输入类。
某些编码的参数不能设置(然而,虽然这是希望即将推出的支持)上H264VideoStreamSettings,那么你就会将这些值上设置Camera类。
下一步,你会将已编码的视频附加到实时视频流,和它流到服务器的活动目录。
最后,为了利用提供的代码,将允许您读取新已编码的视频流的元数据,您将调用send()方法的NetStream类。
作为send()方法的参数,将包括@setDataFrame,Flash媒体服务器,提供的onMetaData()的回调方法,听元数据客户端,以及最后,本地变量metaData将用来表示所需的元数据的项内的特殊处理程序方法。
第一:
onNetStatus处理程序的正文内,,并在现有跟踪语句下面,创建一个条件语句,检查event.info.code的值并将它与"NetConnection.Connect.Success"的字符串值进行比较。
如果event.info.code=="NetConnection.Connect.Success",调用三个函数,您将创建在下一节;一个出版传出的视频流的一个显示的传入网络摄像头,从视频,显示正在从服务器发送回应用程序的视频流的一种。
已完成的onNetStatus()函数应显示如下:
protectedfunctiononNetStatus(event:
NetStatusEvent):
void
{
trace(event.info.code);
if(event.info.code=="NetConnection.Connect.Success")
{
publishCamera();
displayPublishingVideo();
displayPlaybackVideo();
}
}
此时,您已经包括建立NetConnection,并验证成功或失败的trace语句与该连接所必需的代码。
此外,包含了调用函数时,将最终处理的出版和网络摄像头,从视频以及从服务器回来的视频播放。
查找上绕线85名为publishCamera(),该函数。
在publishCamera()的第一行,通过调用其构造函数实例化ns_outNetStream对象。
通过构造函数NetConnection实例nc:
protectedfunctionpublishCamera():
void
{
ns_out=newNetStream(nc);
}
在下一行中,将Camera实例cam附加到传出的NetStream,通过调用attachCamera()方法的NetStream类。
传递给此方法的cam实例:
ns_out.attachCamera(cam);
创建一个名为h264Settings的新本地变量、数据类型为H264VideoStreamSettings,并设置其初始值等于新H264VideoStreamSettings()。
一定要导入
flash.media.H264VideoStreamSettings:
importflash.media.H264VideoStreamSettings;
varh264Settings:
H264VideoStreamSettings=newH264VideoStreamSettings();
要对使用基准配置文件和3.1的水平的视频编码的h264Settings实例上调用H264VideoStreamSettings类的setProfileLevel()方法。
一定要导入的H264Level和H264Profile的类:
importflash.media.H264Level;
importflash.media.H264Profile;
h264Settings.setProfileLevel(H264Profile.BASELINE,H264Level.LEVEL_3_1)
使用Camera类实例的setQuality()方法进行编码的视频流在90000bps(900Kbps),并与90质量设置:
cam.setQuality(90000,90);
使用setMode()方法来设置视频的宽度、高度和帧每秒,并确定是否它应该保持它的捕获的Camera类实例的尺寸时,如果相机有没有为此参数的默认行为:
cam.setMode(320,240,30,true);
下一步,使用Camera类实例的setKeyFrameInterval()方法将该视频的关键帧间隔设置为15(两个关键帧每秒):
cam.setKeyFrameInterval(15);
若要设置传出的视频压缩设置,请将h264Settings变量的值分配给出站流中,ns_out的videoStreamSettings属性
ns_out.videoStreamSettings=h264Settings;
调用上传出的NetStream,NetStream类的publish()方法并向它传递参数来提供一个名称为流("mp4:
webCam.f4v"),以及在服务器("live")中的目标文件夹:
注:
FLV流不需要编码解码器的前缀,但F4V/MP4文件、MP3文件和原始文件。
你可以在文档中找到有关此的详细信息.
ns_out.publish("mp4:
webCam.f4v","live");
创建将持有的已编码的视频,您将在运行时访问元数据值的对象。
这不是编码H.264视频与FlashPlayer的一个必要步骤,但它已列入尽管如此,已完成的应用程序可以利用从所提供的onMetaData()回调函数中返回的元数据。
创建新的本地变量命名为metaData、数据类型为Object,并设置其初始值等于newObject():
varmetaData:
Object=newObject();
创建下列metaData对象,并将它们添加到publishCamera()函数:
metaData.codec=ns_out.videoStreamSettings.codec;
metaData.profile=h264Settings.profile;
metaData.level=h264Settings.level;
metaData.fps=cam.fps;
metaData.height=cam.height;
metaData.width=cam.width;
metaData.keyFrameInterval=cam.keyFrameInterval;
为了使应用程序返回流的元数据,内置Flash媒体服务器名为@setDataFrame的特殊处理程序需要从NetStream的send()方法中调用。
有关@setDataFrame和实况流中添加元数据的详细信息,请参阅Adobe文档.
ns_out对象上调用NetStream类的send()方法并传递它的处理程序方法"@setDataFrame",和回调方法"onMetaData",以及本地变量metaData的名称:
ns_out.send("@setDataFrame","onMetaData",metaData);
已完成的publishCamera()函数应类似于以下内容:
protectedfunctionpublishCamera():
void
{
ns_out=newNetStream(nc);
ns_out.attachCamera(cam);
varh264Settings:
H264VideoStreamSettings=new
H264VideoStreamSettings();
h264Settings.setProfileLevel(H264Profile.BASELINE,
H264Level.LEVEL_3_1);
cam.setQuality(90000,90);
cam.setMode(320,240,30,true);
cam.setKeyFrameInterval(15);
ns_out.videoStreamSettings=h264Settings;
ns_out.publish("mp4:
webCam.f4v","live");
varmetaData:
Object=newObject();
metaData.codec=ns_out.videoStreamSettings.codec;
metaData.profile=h264Settings.profile;
metaData.level=h264Settings.level;
metaData.fps=cam.fps;
metaData.bandwith=cam.bandwidth;
metaData.height=cam.height;
metaData.width=cam.width;
metaData.keyFram
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FlashPlayer11 H264 AVC 编码 视频 直播