Flash全屏播放外部多个Flv视频并且按键进行切换+全屏播放外部Flv视频+指定元件播放外部Flv视频(非全屏)(可以作为遮罩来播放)

目录

一、目的:

1、Flash全屏播放外部多个Flv视频并且按键进行切换+全屏播放外部Flv视频+指定元件播放外部Flv视频(非全屏),所以将其记录下来

二、参考:

1、[AS3编程教学]如何加载并播放Flv视频

三、操作:全屏播放外部多个Flv视频+按键模拟进行视频的切换

1、运行效果:

1、代码:写在关键帧里面

2、写在关键帧里面

3、视频文件放的位置

三、操作:全屏播放外部Flv视频(传感器与物联网多多参考)

1、注意:

2、代码:播放外部视频

三、操作:指定元件播放外部Flv视频(非全屏)(可以作为遮罩来播放)

1、播放视频的视频框:图片格式要求

2、效果

3、代码:2.0版本

3、代码: 1.0版本

三、操作:人体免疫中解决循环播放待机视频长时间会黑屏的情况

1、因为其他几个播放视频是播放一次,但是在人体免疫项目中出现了,循环播放待机视频时候出现了黑屏,所以总结一下

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时候,前面几秒不见了。所以最好不进行转换

 

2、如果循环不断的播放某个视频时候,长时间播放容易造成黑屏(人体免疫项目循环播放待机视频时候遇到了),需要remove视频时候全部remove,再加载视频;

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值