在本文中,我们将带你了解最简单的基于Flash的流媒体示例:RTMP推送和接收在这篇文章中,我们将为您详细介绍最简单的基于Flash的流媒体示例:RTMP推送和接收的方方面面,并解答ActionScr
在本文中,我们将带你了解最简单的基于Flash的流媒体示例:RTMP推送和接收在这篇文章中,我们将为您详细介绍最简单的基于Flash的流媒体示例:RTMP推送和接收的方方面面,并解答ActionScript常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的ActionScript 3.0游戏编程——创建简单的ActionScript程序、actionscript-3 – Flash Actionscript 3 Bug?在开关/箱中使用int和负数、actionscript-3 – Flash开发,Flash语言(AS2/3)和Flash IDE的隐藏功能/技巧[已关闭]、actionscript-3 – SoundTransform平移不使用ActionScript 3.0处理rtmp流。
本文目录一览:- 最简单的基于Flash的流媒体示例:RTMP推送和接收(ActionScript)(flash是流媒体吗)
- ActionScript 3.0游戏编程——创建简单的ActionScript程序
- actionscript-3 – Flash Actionscript 3 Bug?在开关/箱中使用int和负数
- actionscript-3 – Flash开发,Flash语言(AS2/3)和Flash IDE的隐藏功能/技巧[已关闭]
- actionscript-3 – SoundTransform平移不使用ActionScript 3.0处理rtmp流
最简单的基于Flash的流媒体示例:RTMP推送和接收(ActionScript)(flash是流媒体吗)
基于C/C++的RTMP流媒体处理的例子可以参考下面几个。
发布
最简单的基于librtmp的示例:发布H.264(H.264通过RTMP发布)
最简单的基于librtmp的示例:发布(FLV通过RTMP发布)
最简单的基于FFmpeg的推流器(以推送RTMP为例)
接收
最简单的基于librtmp的示例:接收(RTMP保存为FLV)
最简单的基于FFMPEG+SDL的视频播放器 ver2 (采用SDL2.0)
简介
相比于使用C/C++处理RTMP而言,使用ActionScript处理RTMP非常的简单。RTMP建立连接的方法都已经封装好了,只需要调用现成的接口函数就可以了。但是使用ActionScript处理RTMP的劣势也十分明显——可供自己开发的地方很少。由于Flash本身不开源,所以我们无法得到它的底层代码,因而也不能对编解码底层的参数进行调整。总而言之,ActionScript处理RTMP可以概括为几个字:“简单但是不灵活”。
ActionScript播放RTMP
ActionScript播放RTMP流媒体的流程如下图所示。
从图中可以看出,流程可以分成两部分:播放和显示。
播放
播放分成3步:
(1)建立NetConnection(2)建立NetStream
(3)调用NetStream的play()方法
前2步分别建立了RTMP规范中的两个逻辑结构:NetConnection和NetStream。NetConnection代表服务器端应用程序和客户端之间基础的连通关系。NetStream代表了发送多媒体数据的通道。服务器和客户端之间只能建立一个NetConnection,但是基于该连接可以创建很多NetStream。这两个结构的结构如下图所示。
显示
显示部分将播放的视频显示在“舞台”上。这一部分通过创建一个Video对象实现。
ActionScript推送RTMP
ActionScript推送RTMP流媒体的流程如下图所示。
从图中可以看出,推送RTMP的流程和播放有些类似,最主要的不同在于推送最后调用的是NetStream的publish()方法,而播放最后调用的是NetStream的play()方法。推流分成4步:
(3)绑定摄像头和麦克风
(4)调用NetStream的play()方法
推流程序开始运行后,可以通过ffplay,VLC或者Flash应用程序访问相应的RTMP URL查看流媒体。
代码
本文附件中包含以下2个ActionScript工程:
simplest as3 rtmp player,最简单的RTMP播放器,其中包含3个独立的子工程:
simplest_as3_rtmp_player:最简单的RTMP播放器。simplest_as3_local_player:最简单的本地文件播放器。simplest_as3_rtmp_player_multiscreen:最简单的RTMP多屏播放器。
simplest_as3_rtmp_streamer,最简单的RTMP推流器下面看一下上述几个工程的源代码。
simplest_as3_rtmp_player
simplest_as3_rtmp_player是最简单的RTMP播放器,代码如下所示。
- /**
- * 最简单的基于ActionScript的RTMP播放器
- * Simplest AS3 RTMP Player
- *
- * 雷霄骅 Lei Xiaohua
- * leixiaohua1020@126.com
- * 中国传媒大学/数字电视技术
- * Communication University of China / Digital TV Technology
- * http://blog.csdn.net/leixiaohua1020
- *
- * 本程序使用ActionScript3语言完成,播放RTMP服务器上的流媒体
- * 是最简单的基于ActionScript3的播放器。
- *
- * This software is written in Actionscript3, it plays stream
- * on RTMP server
- * It''s the simplest RTMP player based on ActionScript3.
- *
- */
- package {
- import flash.display.Sprite;
- import flash.net.NetConnection;
- import flash.events.NetStatusEvent;
- import flash.events.AsyncErrorEvent;
- import flash.net.NetStream;
- import flash.media.Video;
- public class simplest_as3_rtmp_player extends Sprite
- {
- var nc:NetConnection;
- var ns:NetStream;
- var video:Video;
- public function simplest_as3_rtmp_player()
- {
- nc = new NetConnection();
- nc.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
- nc.connect("rtmp://localhost/live");
- }
- private function netStatusHandler(event:NetStatusEvent):void
- trace("event.info.level: " + event.info.level + "\n", "event.info.code: " + event.info.code);
- switch (event.info.code)
- {
- case "NetConnection.Connect.Success":
- doVideo(nc);
- break;
- case "NetConnection.Connect.Failed":
- case "NetConnection.Connect.Rejected":
- case "NetStream.Play.Stop":
- case "NetStream.Play.StreamNotFound":
- }
- // play a recorded stream on the server
- private function doVideo(nc:NetConnection):void {
- ns = new NetStream(nc);
- ns.addEventListener(NetStatusEvent.NET_STATUS,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> video = new Video(640,480);
- video.attachNetStream(ns);
- ns.play("myCamera");
- addChild(video);
- }
- // create a playlist on the server
- /*
- private function doPlaylist(nc:NetConnection):void {
- video = new Video();
- // Play the first 3 seconds of the video
- ns.play( "bikes", 0, 3, true );
- // Play from 20 seconds on
- */
- }
- }
simplest_as3_local_player
simplest_as3_local_player用于播放本地FLV文件。ActionScript中播放本地视频(*.flv)和播放RTMP流程是一样的:先创建NetConnection,再创建NetStream。它们最大的不同在于,播放本地文件建立NetConnection的时候,是不传地址的。例如播放RTMP的时候代码如下:
- nc.connect("rtmp://localhost/live");
ActionScript 3.0游戏编程——创建简单的ActionScript程序
源文件
http://flashgameu.com
A3GPU201_HelloWorld.zip
当介绍一门新的编程语言时,我们一般都是从编写Hello World程序入手的。这种程序只能在屏幕上显示出Hello World,而不带其他功能。
说明
Hello World程序的诞生要追溯到1974年,它包含在贝尔实验室(Bell Labs)里的一份内部教程内。20世纪70年代末,我在学校里用的还是PDP-11终端机时 ,它可是我学的第一个程序。时至今日,基本上每本介绍编程的书最开始都会出现Hello World示例。
trace的简单用法
我们可以在主时间轴中的脚本语言里使用trace方法,创建一个功能有限的Hello World程序。trace所做的就是在Flash的Output(输出)面板里输出文本内容。
选择File(文件),在菜单中选择New(新建)来创建新的Flash影片。随即出现New Document(新建文档)对话框,如图1-1所示。
1.2.1 trace的简单用法
我们可以在主时间轴中的脚本语言里使用trace方法,创建一个功能有限的Hello World程序。trace所做的就是在Flash的Output(输出)面板里输出文本内容。
选择File(文件),在菜单中选择New(新建)来创建新的Flash影片。随即出现New Document(新建文档)对话框,如图1-1所示。
单击OK(确定)按钮后,创建出一个新的Flash影片,名为Untitled-1(未命名-1)。出现一个Flash文档窗口,如图1-2所示。
Flash的工作空间,因此你窗口里的面板可能处于不同的位置
在窗口的顶端有一个时间轴,帧数从1开始向右延伸,图1-2中可以看到有大约50多帧,当然,这取决于窗口屏幕的大小。帧数可以延长至一个动画所需的数量,但作为游戏程序员,我们通常只需要少量的帧。
时间轴上可以有一至多个图层。窗口中默认只有一个图层,名为Layer1(图层1)。
Layer1中,你可以看见一个关键帧(keyframe),它位于第1帧的下方,由一个里面带有空心点的方框表示。
|
说明 关键帧是一个动画术语。如果是用Flash去制作动画而非编程,那么就会时常用到关键帧。大体说来,关键帧就是时间轴上的某个点,一个或多个动画元素在这点时的位置被特殊设置过。两个关键帧之间,动画元素的位置可能会改变。例如,第1帧关键帧上的元素在屏幕的左边,然后在第9帧关键帧时,同样的元素位于屏幕的右边,那么在这些关键帧之间,当处于第5帧时,该元素会出现在屏幕的中央。 我们虽然不用关键帧来制作动画,但是需要在不同的场景中设置元素,如游戏介绍、进行和结束。 |
可以在时间轴任意图层上的任意关键帧写入脚本代码。选中关键帧,从菜单栏中选择Windows(窗口)→Actions(动作)即可打开Actions面板,如图1-3所示。这也许与你在电脑中看到的界面有些差异,因为它的界面设置有多种方式,比如在面板的左边可以有侧边栏,当中列出了所有ActionScript的命令语句及方法。
Actions面板基本而言是一个文本输入窗口,但是它能做的远不止于此,比如它还能格式化代码等。不过本书中,我们不会经常用到Actions面板,因为大部分代码都写在外部类文件中。
在Actions面板中输入以下文本,来创建这个简单的Hello World程序:
trace("Hello World.");
这样,你就创建了你的第一个ActionScript 3.0程序。要测试它,可以选择Control(控制)→Test Movie(测试影片)→Test(测试)或者通过快捷方式Command+Return(Mac下)或Ctrl+Enter(Windows下)进行。如果没有自己创建这个影片,你可以打开HelloWorld1.fla文件来进行测试。
现在,找到Output(输出)面板,即使之前面板是关闭着的,它也会弹出。但是,它常常是一块很小的面板,所以很容易在你不注意的时候出现在屏幕的角落,甚至以一组面板的形式伴随着时间轴出现。图1-4就是一个Output面板界面显示的例子。
尽管从技术上看这个Hello World程序确实输出了Hello World,但这只是你在Flash CS5里测试看到的结果。如果你将此程序嵌入浏览器中运行,屏幕上将不会显示任何结果。我们需要再做点工作,来创建真正的Hello World程序。
actionscript-3 – Flash Actionscript 3 Bug?在开关/箱中使用int和负数
var myValue1:int = 2; switch (myValue1) { case -3: trace(myValue1 + " == -3"); break; case -2: trace(myValue1 + " == -2"); break; case -1: trace(myValue1 + " == -1"); break; case 0: trace(myValue1 + " == 0"); break; case 1: trace(myValue1 + " == 1"); break; case 2: trace(myValue1 + " == 2"); break; case 3: trace(myValue1 + " == 3"); break; default: trace(myValue1 + " is unkNown"); break; } var myValue2:int = -2; switch (myValue2) { case -3: trace(myValue2 + " == -3"); break; case -2: trace(myValue2 + " == -2"); break; case -1: trace(myValue2 + " == -1"); break; case 0: trace(myValue2 + " == 0"); break; case 1: trace(myValue2 + " == 1"); break; case 2: trace(myValue2 + " == 2"); break; case 3: trace(myValue2 + " == 3"); break; default: trace(myValue2 + " is unkNown"); break; }
给出这个输出:
2 == 0 -2 is unkNown
(在Flash Builder 4.7.0.349722中编译,在Flash 11.5.502.149上运行,在Windows 7 SP1,Firefox 18.0.2中运行)
以下更改将修复上述问题,并提供正确的输出:
>将值类型更改为数字。
>删除负数case语句。
>将case语句更改为使用int-variables而不是文字…除非这些变量也是const,在这种情况下它会被破坏!
更改myValue2 = -1给出输出-1 == -3,这同样是wtf-ish。
显然这是一个bug,但是…是什么原因呢?在我不明白的case-statement中是否有使用int或负数的细微差别?我的代码是否有错误?或者这是Flash Builder中的字节码编译器的问题吗?
解决方法
我可以提供的是AS3编译器bugginess的确认。
我花了相当多的时间试图解决类似的“神奇”错误,并提出了空白。
一个这样的例子是一个For和While循环跳过数组中的第一个或最后一个项目,没有明显的原因,而Foreach循环工作正常。
对我来说,最可信的原因是内存管理错误。这可能也是硬件相关的,因为我或我的同事在一些机器上发生的这种事情发生的频率更高。我认为是一些“看不见”的条件,例如执行操作的顺序(您可以尝试将一些虚拟代码放在var声明和开关之间,或者可能更多次分配var值对,只是为了“慢跑内存”),与容易出错的编译器相结合会使内存丢失寻址和你的交换机认为它的两个整数,而实际上它与内存不同的价值。
actionscript-3 – Flash开发,Flash语言(AS2/3)和Flash IDE的隐藏功能/技巧[已关闭]
有一个最近的AS3/Flex one,但它不是很活跃,我不完全意味着AS3,当我在这里说Flash。
隐藏的功能系列适用于新来的某些语言的人。它显示了绳索和一些有价值的技巧,都在一个地方。我认为这是一个辉煌的想法。有时甚至有人会发现他们从来没听说过的技巧。
当我开始使用Flash时,与其他编程语言相比,Flash被Flash IDE和奇怪的概念所吸引。
所以,这里:Flash作为一种语言(AS2 / 3)和Flash IDE的一些隐藏功能是什么?
让乐趣开始。
解决方法
这不是一个功能,因为它是一个骗子。当为FLA指定文档类时,编译器不会对该类进行子类化,因此会修改该类。
当您有几个具有相同文档类的SWF时,这可能会导致问题,所有这些SWF都被加载到另一个SWF中(因为具有相同名称的两个类不能并行并入相同的应用程序域)。它导致第一个被加载,第二个使用第一个修改的类,产生奇怪的错误(你可以想像)。
解决方案是:
>为分类文档类的每个FLA创建一个代理类>将每个SWF加载到新的子应用程序域中
actionscript-3 – SoundTransform平移不使用ActionScript 3.0处理rtmp流
stream.soundTransform = new SoundTransform (0.5,-1.0);
在Actionscript 3.0上,但它不起作用……
这有点奇怪,因为对于完全相同的代码,如果不是流我输入音频flv文件或mp3文件,它工作正常,因此SoundTransform类似乎对流没有影响.
解决方法
<bean id="rtmpSampleAccess"> <!-- enable access to the raw audio --> <property name="audioAllowed" value="true"/> <!-- if you need access to the raw video,put it to true --> <property name="videoAllowed" value="false"/> </bean>
希望能有所帮助.
今天关于最简单的基于Flash的流媒体示例:RTMP推送和接收和ActionScript的介绍到此结束,谢谢您的阅读,有关ActionScript 3.0游戏编程——创建简单的ActionScript程序、actionscript-3 – Flash Actionscript 3 Bug?在开关/箱中使用int和负数、actionscript-3 – Flash开发,Flash语言(AS2/3)和Flash IDE的隐藏功能/技巧[已关闭]、actionscript-3 – SoundTransform平移不使用ActionScript 3.0处理rtmp流等更多相关知识的信息可以在本站进行查询。
本文标签: