目录
1、Flash全屏播放外部多个Flv视频并且按键进行切换+全屏播放外部Flv视频+指定元件播放外部Flv视频(非全屏),所以将其记录下来
三、操作:全屏播放外部多个Flv视频+按键模拟进行视频的切换
三、操作:指定元件播放外部Flv视频(非全屏)(可以作为遮罩来播放)
1、因为其他几个播放视频是播放一次,但是在人体免疫项目中出现了,循环播放待机视频时候出现了黑屏,所以总结一下
1、这个方法flv和mp4都可以播放,制作猜猜它是谁的时候发现,mp4狸窝转换为flv时候,前面几秒不见了。所以最好不进行转换
2、如果循环不断的播放某个视频时候,长时间播放容易造成黑屏(人体免疫项目循环播放待机视频时候遇到了),需要remove视频时候全部remove,再加载视频;
一、目的:
1、Flash全屏播放外部多个Flv视频并且按键进行切换+全屏播放外部Flv视频+指定元件播放外部Flv视频(非全屏),所以将其记录下来
二、参考:
1、[AS3编程教学]如何加载并播放Flv视频
https://jingyan.baidu.com/article/fc07f9897ed70612fee5197c.html
- 总结:good:很好用,并且能够实现,目前知道flv、mp4都可以播放;but:如果循环不断的播放某个视频时候容易造成黑屏,需要remove视频时候全部remove,再加载;下面是我修改编写的,以及需要注意的地方
三、操作:全屏播放外部多个Flv视频+按键模拟进行视频的切换
1、运行效果:
- 总结:循环播放和播放一次就移除视频都是可以实现的
- 总结:按键模拟进行视频的切换多次,查看任务管理器CPU、内存都没有增加,所以方法可行
1、代码:写在关键帧里面
import flash.media.Video;
import flash.net.NetConnection;
import flash.net.NetStream;
import flash.events.NetStatusEvent;
fscommand("fullscreen","true");
stop();
var theVideo:Video = null;//视频对象
var netConnection:NetConnection = null;//连接对象
var netStream:NetStream = null;//数据流对象
//播放视频数组
var arr_videoName:Array = null;
Start_video();
//初始化界面
function Start_video()
{
//发现只能播放flv,mp4播放不了
arr_videoName = new Array("视频/壁虎.flv","视频/考拉.flv","视频/羚羊.flv","视频/沙锥.flv","视频/兔子.flv","视频/犀牛.flv");
CreateVideo();
//按键抬起:创建;
if (! stage.hasEventListener(KeyboardEvent.KEY_UP))
{
stage.addEventListener(KeyboardEvent.KEY_UP,KeyUp_video);
}
}
//离开界面需要移除一些东西
function Destroy_video()
{
//按键抬起:注销
if (stage.hasEventListener(KeyboardEvent.KEY_UP))
{
stage.removeEventListener(KeyboardEvent.KEY_UP,KeyUp_video);
}
RemoveVedio();
}
//按键抬起
function KeyUp_video(e:KeyboardEvent)
{
trace(e.keyCode);
switch (e.keyCode-48)
{
case 0 :
PlayVideo(0);
break;
case 1 :
PlayVideo(1);
break;
case 2 :
PlayVideo(2);
break;
case 3 :
PlayVideo(3);
break;
case 4 :
PlayVideo(4);
break;
case 5 :
PlayVideo(5);
break;
}
}
//创建视频
function CreateVideo():void
{
if (theVideo==null)
{
theVideo = new Video(1920,1080);
theVideo.x = theVideo.y = 0;
addChild(theVideo);
}
if (netConnection==null)
{
netConnection = new NetConnection();
netConnection.connect(null);
}
if (netStream==null)
{
netStream = new NetStream(netConnection);
netStream.client = this;
}
if (theVideo!=null&&netStream!=null)
{
theVideo.attachNetStream(netStream);
}
}
//netStatus 事件对象的 type 属性值
function netStatusHandler(e:NetStatusEvent):void
{
var evtCode:String = e.info.code;
switch (evtCode)
{
case "NetStream.Play.Start" :
trace("开始播放");
break;
case "NetStream.Play.Empty" :
trace("缓冲区为空");
break;
case "NetStream.Play.Full" :
trace("缓冲区已满");
break;
case "NetStream.Play.StreamNotFound" :
trace("没有找到文件");
break;
case "NetStream.Play.Stop" :
//循环播放
trace("一次播放完毕,从头开始");
netStream.pause();
netStream.seek(0);
netStream.resume();
播放一次卸载视频;
//RemoveVedio();
break;
}
}
//卸载视频
function RemoveVedio():void
{
if (netStream!=null)
{
netStream.pause();
netStream.dispose();
if (netStream.hasEventListener(NetStatusEvent.NET_STATUS))
{
netStream.removeEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
}
netStream = null;
}
if (netConnection!=null)
{
netConnection = null;
}
if (theVideo!=null)
{
theVideo.clear();
if (theVideo.parent.contains(theVideo))
{
removeChild(theVideo);
}
theVideo = null;
}
}
//播放和切换视频视频
function PlayVideo(_e:int)
{
if (_e>=0&&_e<=arr_videoName.length-1)
{
CreateVideo();
netStream.play(arr_videoName[_e]);
if (! netStream.hasEventListener(NetStatusEvent.NET_STATUS))
{
netStream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
}
}
}
2、写在关键帧里面
3、视频文件放的位置
三、操作:全屏播放外部Flv视频(传感器与物联网多多参考)
1、注意:
- 总结:视频和Flash再同一目录,视频名字叫做 测试.flv
- 总结:一定要卸载视频,否则会造成内存泄露
- 总结:如果添加了文本类的话会一直报错显示onMate什么的错误,所以不做文本类,就做第一帧做配置文件(这个问题后面”操作:指定元件播放外部Flv视频“里面有介绍可以解决)
- 总结:注意播放完毕后先将其暂停,然后到第一帧、然后开始,否则可能会出现像人体免疫黑屏的情况(固始的地震体验屋也是这样,不要直接移除视频,先暂停,在跳帧)
- 总结:声明变量时候,都为空,对变量操作时候,要判断空的时候才能操作
- 总结:移除的时候,要让其为空
2、代码:播放外部视频
import flash.media.Video;
import flash.net.NetConnection;
import flash.net.NetStream;
import flash.events.NetStatusEvent;
fscommand("fullscreen","true");
stop();
InitVars();
LoadMovie();
var theVideo:Video;//视频对象
var theNet:NetConnection;//连接对象
var theNets:NetStream;//数据流对象
function InitVars():void
{
theVideo = new Video(1920,1080);
theVideo.x = theVideo.y = 0;
addChild(theVideo);
theNet = new NetConnection();
theNet.connect(null);
theNets = new NetStream(theNet);
theNets.client = this;
theVideo.attachNetStream(theNets);
}
//加载并播放视频,并且监听整个播放状态过程。
function LoadMovie():void
{
theNets.play("测试.flv");
theNets.addEventListener(NetStatusEvent.NET_STATUS, onStatusHandler);
}
function onStatusHandler(e:NetStatusEvent):void
{
var evtCode:String = e.info.code;
switch (evtCode)
{
case "NetStream.Play.Start" :
trace("开始播放");
break;
case "NetStream.Play.Empty" :
trace("缓冲区为空");
break;
case "NetStream.Play.Full" :
trace("缓冲区已满");
break;
case "NetStream.Play.StreamNotFound" :
trace("没有找到文件");
break;
case "NetStream.Play.Stop" :
trace("一次播放完毕,从头开始");
theNets.pause();
theNets.seek(0);
theNets.resume();
//RemoveVedio();
break;
}
}
//卸载视频
function RemoveVedio():void
{
theNets.pause();
theNets.dispose();
theNet = null;
theVideo.clear();
removeChild(theVideo);
}
三、操作:指定元件播放外部Flv视频(非全屏)(可以作为遮罩来播放)
1、播放视频的视频框:图片格式要求
- 图片:播放视频的地方都是透明通道的,所以是png格式的图片
- 将这个承载播放的图片大于视频的尺寸,然后代码中移动视频video的位置,这样图片就把视频遮罩了
2、效果
3、代码:2.0版本
import flash.events.MouseEvent;
import flash.display.SimpleButton;
import flash.media.Video;
import flash.events.KeyboardEvent;
stop();
var netConnection:NetConnection;//NetConnection 类在客户端和服务器之间创建双向连接。客户端可以是 Flash Player 或 AIR 应用程序。服务器可以是 Web 服务器、Flash Media Server、运行 Flash Remoting 的应用程序服务器或 Adobe 状态服务。调用 NetConnection.connect() 以建立连接。使用 NetStream 通过该连接发送媒体流和数据。
var netStream:NetStream;//NetStream 类通过 NetConnection 打开了一个单向流通道。
var video:Video;//分辨率
//解决:在 flash.net.NetStream 上找不到属性 onMetaData
var clientobj=new Object();
//视频路径
var arr_videoName:Array;
//是否循环:播放待机时候需要循环播放
var bIsLoop;
Init();
function Init()
{
netConnection= new NetConnection();//NetConnection 类在客户端和服务器之间创建双向连接。客户端可以是 Flash Player 或 AIR 应用程序。服务器可以是 Web 服务器、Flash Media Server、运行 Flash Remoting 的应用程序服务器或 Adobe 状态服务。调用 NetConnection.connect() 以建立连接。使用 NetStream 通过该连接发送媒体流和数据。
netConnection.connect(null);
//创建到 Flash Media Server 上某个应用程序或到 Flash Remoting 的双向连接,或为 RTMFP 对等组通信创建双向网络端点。;
netStream = new NetStream(netConnection);//NetStream 类通过 NetConnection 打开了一个单向流通道。
if (! netStream.hasEventListener(NetStatusEvent.NET_STATUS))
{
/*
创建一个 Event 对象,其中包含有关 netStatus 事件的信息。netStatusHandler 方法作为 NetStatusEvent 事件 NetConnection.netStatus 的侦听器进行注册。
当确定了 NetConnection.connect() 尝试的状态(成功或失败)时,netStatus 事件触发此方法。
如果连接 NetConnection 对象的尝试取得成功(也就是说,如果 NetStatusEvent 对象的 info 属性由 netStatus 事件调度,
并有一个表示成功的 code 属性),则代码创建 Video 和 NetStream 对象并调用 Video.attachNetStream() 和 NetStream.play() 方法。
*/
netStream.addEventListener(NetStatusEvent.NET_STATUS,statusHandler);
}
//视频路径
arr_videoName = new Array("video\\待机视频.flv","video\\0沙尘暴视频.flv","video\\1暴雨视频.flv","video\\2干旱视频.flv","video\\3高温视频.flv","video\\4台风视频.flv","video\\5雾霾视频.flv","video\\6大风视频.flv","video\\7寒潮视频.flv");
video = new Video(1024,768);//分辨率
video.x = 0;//调整视频播放位置
video.y = 0;
//解决:在 flash.net.NetStream 上找不到属性 onMetaData
clientobj=new Object();
clientobj.onMetaData = function(){};//在 Flash Player 接收到正在播放的视频中嵌入的描述性信息时建立侦听器进行响应。
netStream.client = clientobj;//指定对其调用回调方法以处理流或 F4V/FLV 文件数据的对象。
if (! stage.hasEventListener(KeyboardEvent.KEY_UP))
{
stage.addEventListener(KeyboardEvent.KEY_UP,KeyUp_vide);
}
//kuang.visible = false;
//播放循环待机
bIsLoop = true;
playVideo(0);
}
function Destroy()
{
if (stage.hasEventListener(KeyboardEvent.KEY_UP))
{
stage.removeEventListener(KeyboardEvent.KEY_UP,KeyUp_vide);
}
RemoveVedio();
}
function KeyUp_vide(e:KeyboardEvent)
{
switch (e.keyCode)
{
case 0+48 :
//播放循环待机
bIsLoop = true;
playVideo(0);
break;
case 1+48 :
//播放视频
bIsLoop = false;
playVideo(1);
break;
case 2+48 :
bIsLoop = false;
playVideo(2);
break;
case 3+48 :
bIsLoop = false;
playVideo(3);
break;
}
}
function statusHandler(_evt:NetStatusEvent ):void
{
//trace(_evt.info.code);
if (_evt.info.code == "NetStream.Play.Start")
{
//开始播放
}
else if (_evt.info.code=="NetStream.Buffer.Empty")
{
//缓冲区空
}
else if (_evt.info.code=="NetStream.Buffer.Full")
{
//缓冲区满
}
else if (_evt.info.code=="NetStream.Play.StreamNotFound")
{
//没有找到文件
}
else if (_evt.info.code=="NetStream.Play.Stop")
{
if (bIsLoop)
{
//待机视频循环播放
netStream.seek(0);
}
else
{
//介绍视频播放完毕回到待机视频
RemoveVedio();
bIsLoop = true;
playVideo(0);
}
}
}
function playVideo(index:int)
{
RemoveVedio();
netStream.play(arr_videoName[index]);
//调用 NetStream.play(),从本地磁盘、Web 服务器或 Flash Media Server 播放媒体文件。;
video.attachNetStream(netStream);
netStream.seek(0);
kuang.addChildAt(video,0);
//将一个 DisplayObject 子实例添加到该 DisplayObjectContainer 实例中。 ;
kuang.visible = true;
}
//卸载视频
function RemoveVedio():void
{
netStream.pause();
netStream.dispose();
netConnection = null;
video.clear();
if (kuang.contains(video))
{
kuang.removeChild(video);
}
//removeChild(video);
}
3、代码: 1.0版本
import flash.events.MouseEvent;
import flash.display.SimpleButton;
import flash.media.Video;
import flash.events.KeyboardEvent;
stop();
/*************************************/
/* 视频播放 */
/*************************************/
var netConnection:NetConnection = new NetConnection();//NetConnection 类在客户端和服务器之间创建双向连接。客户端可以是 Flash Player 或 AIR 应用程序。服务器可以是 Web 服务器、Flash Media Server、运行 Flash Remoting 的应用程序服务器或 Adobe 状态服务。调用 NetConnection.connect() 以建立连接。使用 NetStream 通过该连接发送媒体流和数据。
netConnection.connect(null);//创建到 Flash Media Server 上某个应用程序或到 Flash Remoting 的双向连接,或为 RTMFP 对等组通信创建双向网络端点。
var netStream:NetStream = new NetStream(netConnection);//NetStream 类通过 NetConnection 打开了一个单向流通道。
//var video:Video = new Video(1390-192/3,810-108/3);
//video.x = 65;
//video.y = 50;
var video:Video = new Video(1024,768);//分辨率
video.x = 0;//调整视频播放位置
video.y = 0;
netStream.addEventListener(NetStatusEvent.NET_STATUS,statusHandler);//创建一个 Event 对象,其中包含有关 netStatus 事件的信息。netStatusHandler 方法作为 NetStatusEvent 事件 NetConnection.netStatus 的侦听器进行注册。 当确定了 NetConnection.connect() 尝试的状态(成功或失败)时,netStatus 事件触发此方法。 如果连接 NetConnection 对象的尝试取得成功(也就是说,如果 NetStatusEvent 对象的 info 属性由 netStatus 事件调度,并有一个表示成功的 code 属性),则代码创建 Video 和 NetStream 对象并调用 Video.attachNetStream() 和 NetStream.play() 方法。
//解决:在 flash.net.NetStream 上找不到属性 onMetaData
var clientobj=new Object();
clientobj.onMetaData = function(){};// 在 Flash Player 接收到正在播放的视频中嵌入的描述性信息时建立侦听器进行响应。
netStream.client = clientobj;//指定对其调用回调方法以处理流或 F4V/FLV 文件数据的对象。
//视频路径
var nameArr:Array = new Array("video\\待机视频.flv","video\\2.flv","video\\3.flv","video\\4.flv","video\\5.flv","video\\6.flv","video\\7.flv","video\\8.flv","video\\9.flv");
Init();
function Init()
{
if (! stage.hasEventListener(KeyboardEvent.KEY_UP))
{
stage.addEventListener(KeyboardEvent.KEY_UP,KeyUp);
}
kuang.visible = false;
}
function KeyUp(e:KeyboardEvent)
{
switch (e.keyCode)
{
case 0+48 :
playVideo(0);
break;
case 1+48 :
playVideo(1);
break;
case 2+48 :
playVideo(2);
break;
case 3+48 :
playVideo(3);
break;
}
}
function statusHandler(_evt:NetStatusEvent ):void
{
//trace(_evt.info.code);
if (_evt.info.code == "NetStream.Play.Start")
{
//开始播放
}
else if (_evt.info.code=="NetStream.Buffer.Empty")
{
//缓冲区空
}
else if (_evt.info.code=="NetStream.Buffer.Full")
{
//缓冲区满
}
else if (_evt.info.code=="NetStream.Play.StreamNotFound")
{
//没有找到文件
}
else if (_evt.info.code=="NetStream.Play.Stop")
{
closeVideo();
}
}
function playVideo(index:int)
{
closeVideo();
netStream.play(nameArr[index]);//调用 NetStream.play(),从本地磁盘、Web 服务器或 Flash Media Server 播放媒体文件。
video.attachNetStream(netStream);
netStream.seek(0);
kuang.addChildAt(video,0);//将一个 DisplayObject 子实例添加到该 DisplayObjectContainer 实例中。
kuang.visible = true;
}
function closeVideo()
{
if (kuang.visible == true)
{
netStream.pause();
kuang.removeChild(video);
kuang.visible = false;
}
}
三、操作:人体免疫中解决循环播放待机视频长时间会黑屏的情况
1、因为其他几个播放视频是播放一次,但是在人体免疫项目中出现了,循环播放待机视频时候出现了黑屏,所以总结一下
1、代码
var theVideo:Video;//视频对象
var theNetConnection:NetConnection;//连接对象
var theNetStream:NetStream;//数据流对象
fscommand("fullscreen","true");
stop();
Init_daiJi();
function Init_daiJi()
{
//视频播放
InitVars();
LoadMovie();
}
//移除添加的东西
function RemoveSome_daiJi()
{
//移除待机视频
if (theNetStream.hasEventListener(NetStatusEvent.NET_STATUS))
{
theNetStream.pause();
theNetStream.removeEventListener(NetStatusEvent.NET_STATUS, onStatusHandler);
}
RemoveVedio();
}
//视频===================================================
function InitVars():void
{
theVideo = new Video(1920,1080);//播放视频的大小
theVideo.x = theVideo.y = 0;//播放视频的位置
addChild(theVideo);//添加到舞台上面
theNetConnection = new NetConnection();
theNetConnection.connect(null);
theNetStream = new NetStream(theNetConnection);
theNetStream.client = this;
theVideo.attachNetStream(theNetStream);
}
//加载并播放视频,并且监听整个播放状态过程。
function LoadMovie():void
{
theNetStream.play("待机视频.flv");
if (! theNetStream.hasEventListener(NetStatusEvent.NET_STATUS))
{
theNetStream.addEventListener(NetStatusEvent.NET_STATUS, onStatusHandler);
}
}
function onStatusHandler(e:NetStatusEvent):void
{
var evtCode:String = e.info.code;
switch (evtCode)
{
case "NetStream.Play.Start" :
trace("开始播放");
break;
case "NetStream.Play.Empty" :
trace("缓冲区为空");
break;
case "NetStream.Play.Full" :
trace("缓冲区已满");
break;
case "NetStream.Play.StreamNotFound" :
trace("没有找到文件");
break;
case "NetStream.Play.Stop" :
trace("一次播放完毕,从头开始");
theNetStream.seek(0);
break;
}
}
//卸载视频
function RemoveVedio():void
{
theNetStream.pause();
theNetStream.dispose();
theNetConnection = null;
theVideo.clear();
removeChild(theVideo);
}
四、注意:
1、这个方法flv和mp4都可以播放,制作猜猜它是谁的时候发现,mp4狸窝转换为flv时候,前面几秒不见了。所以最好不进行转换