<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" height="312" width="328" creationComplete="init()">
<mx:Script>
<![CDATA[
//预定义声明
import mx.controls.Alert;
import mx.events.SliderEvent;
//创建一个基本的网络连接对象
private var vi:Video;
private var cam:Camera; //定义一个摄像头
private var inNs:NetStream;
private var outNs:NetStream;
private var nc:NetConnection;
private var mic:Microphone; //定义一个麦克风
private var _duration:Number; //视频播放时间
private var playPosition:Number; //定义播放进度位置
private var soundPosition:Number; //定义声音大小控制条的位置
private var flag:Boolean = false;
private var lastVideoName:String = ""; //视频录制后保存的名字
private var _url:String = "rtmp://localhost/oflaDemo";
public function init():void{
setupCamera(); //初始化摄像头信息
}
//开始录制按扭点击
public function clickConnect():void{
nc = new NetConnection();
nc.client = this ;
nc.addEventListener(NetStatusEvent.NET_STATUS,nsHandler);
nc.connect(_url); //连接red5服务器
}
public function nsHandler(evt:NetStatusEvent):void{
if (evt.info.code == "NetConnection.Connect.Success"){ //如果连接成功
playClick();
}else{
Alert.show("连接失败");
}
}
//开始录制
public function playClick():void{
if(vi != null){
vi.clear();
vdisplay.removeChild(vi);
vi = new Video();
vi.width = 320;
vi.height = 240;
vi.attachCamera(cam);
vdisplay.addChild(vi);
}
outNs = new NetStream(nc);
outNs.attachCamera(cam); //把摄像头存入outNs
outNs.attachAudio(mic); //把麦克风存入outNs
lastVideoName = "red5RecordDemo_" + Math.random()+getTimer();
outNs.publish(lastVideoName, "record");
startRec.enabled = false;
stopRec.enabled = true;
}
//停止录制
public function stopClick():void{
//关闭ns与red5的连接
outNs.close();
vi.clear();
vdisplay.removeChild(vi);
//锁定开始按键使其生效
startRec.enabled = true;
//锁定停止按键使其失效
stopRec.enabled = false;
}
//录制完以后播放
public function playLastVideo():void{
if(nc!=null){
addEventListener(Event.ENTER_FRAME,onEnterFrame);
inNs = new NetStream(nc);
//定义onMetaData,获取视频相关数据
var customClient:Object = new Object();
customClient.onMetaData = function(metadata:Object):void{
_duration = metadata.duration; //获取视频持续时间
t_sh.maximum = _duration;
}
inNs.client = customClient;
//删除原_localVideo,便于在录制和播放视频之间切换
vi = new Video();
vi.width = 320;
vi.height = 240;
vi.attachNetStream(inNs);
vdisplay.addChild(vi);
inNs.play(lastVideoName+".flv");
addEventListener(Event.ENTER_FRAME,onEnterFrame);
}
}
public function onBWDone():void {
}
//初始化摄像头
public function setupCamera():void{
//启动摄像头
cam = Camera.getCamera();
if(cam != null){
cam.addEventListener(StatusEvent.STATUS,onStatusHandler);
cam.addEventListener(ActivityEvent.ACTIVITY,onActiveHandler);
cam.setMode(320,240,30);
cam.setQuality(0,70); //设置清晰度
vi = new Video();
vi.width = 320;
vi.height = 240;
vi.attachCamera(cam);
vdisplay.addChild(vi);
}
mic = Microphone.getMicrophone();
if(mic != null){
mic.setSilenceLevel(0,-1); //设置麦克风保持活动状态并持续接收集音频数据
mic.gain = 80; //设置麦克风声音大小
}
}
private function onActiveHandler(event:ActivityEvent):void
{
if(!cam.muted){ //判断摄像头存不存在
startRec.enabled = true;
}else{
Alert.show("错误:无法链接到活动摄像头!")
}
cam.removeEventListener(StatusEvent.STATUS,onStatusHandler);
}
private function onStatusHandler(event:StatusEvent):void{
if(!cam.muted){ //判断摄像头存不存在
startRec.enabled = true;
}else{
Alert.show("错误:无法链接到活动摄像头!")
}
cam.removeEventListener(StatusEvent.STATUS,onStatusHandler);
}
public function thumbPress(event:SliderEvent):void{
inNs.togglePause();
removeEventListener(Event.ENTER_FRAME,onEnterFrame);
}
private function thumbChanges(event:SliderEvent):void{
playPosition = t_sh.value; //当前播放视频进度的位置=当前播放进度条的位置
inNs.seek(playPosition);
addEventListener(Event.ENTER_FRAME,onEnterFrame);
}
private function thumbRelease(event:SliderEvent):void{ //释放mouse后执行
inNs.seek(playPosition); //查找当前进度条位置
inNs.togglePause();
addEventListener(Event.ENTER_FRAME,onEnterFrame);
}
public function onEnterFrame(event:Event):void{
if(_duration > 0 && inNs.time > 0){ //如果视频时间和正在播放视频的时间大于0
t_sh.value =inNs.time;
lbtime.text = formatTimes(inNs.time) + " / "+ formatTimes(_duration);
}
if(formatTimes(inNs.time)==formatTimes(_duration)){ //如果播放完毕,则关毕流,初始化摆放时间的label
if(flag==true){ //如果是加载,就不执行 ||false代表是加载,true代表是播放结束
removeEventListener(Event.ENTER_FRAME,onEnterFrame);
inNs.close();
lbtime.text = "0:00 / "+ formatTimes(_duration);
}
setTimeout(function():void{flag = true;},1000);
}
}
//时间格式操作
private function formatTimes(value:int):String{
var result:String = (value % 60).toString();
if (result.length == 1){
result = Math.floor(value / 60).toString() + ":0" + result;
} else {
result = Math.floor(value / 60).toString() + ":" + result;
}
return result;
}
//声音音量控制
private function sound_thumbChanges(event:SliderEvent):void{
soundPosition = th_sound.value;
}
private function sound_thumbRelease(event:SliderEvent):void{
vdisplay.volume = soundPosition;
}
]]>
</mx:Script>
<mx:VideoDisplay x="0" y="0" width="324.5" height="240" id="vdisplay"/>
<mx:Button x="10" y="250" label="开始录制" id="startRec" click="clickConnect()" enabled="false" />
<mx:Button x="10" y="280" label="停止录制" width="70" id="stopRec" click="stopClick()" enabled="false" />
<mx:Button x="253" y="268" label="播放" click="playLastVideo()" />
<mx:HSlider x="98" y="248" width="143" id="t_sh" thumbPress="thumbPress(event)" thumbRelease="thumbRelease(event)" change="thumbChanges(event)"/>
<mx:Label x="237" y="242" text="0:00/0:00" width="89" textAlign="center" height="18" id="lbtime"/>
<mx:HSlider x="98" y="278" width="91" id="th_sound" minimum="0" maximum="1" value="{vdisplay.volume}" change="sound_thumbChanges(event)" thumbRelease="sound_thumbRelease(event)"/>
<mx:Label x="187" y="270" text="sound" height="20" width="44" textAlign="center"/>
</mx:Application>
分享到:
相关推荐
Flex声音录入技术主要涉及到Flash平台中的MicRecorder和Microphone组件,这两个组件是处理音频输入和输出的核心工具。在本文中,我们将深入探讨如何利用这些组件实现麦克风声音的录入、播放以及时间统计,并讨论如何...
通过Microphone对象,开发者可以创建各种与声音相关的应用,例如语音聊天、在线录音或音频处理程序。在Flex中,使用Microphone类可以非常方便地获取和处理音频流,无需将音频数据发送到服务器,这在某些情况下提高了...
Flex录音+上传+播放功能是基于Adobe Flex框架开发的一个多媒体应用模块,主要涵盖了声音的录制、上传以及回放这三个核心环节。Flex是一个开源的、基于ActionScript的开发工具,用于构建具有丰富用户体验的RIA(Rich ...
这些文件可能包含了连接到服务器、创建流、播放和录制视频音频等关键操作。`assets`文件夹通常包含应用使用的资源,如图片、声音或字体等。`com`和`vo`文件夹则可能包含自定义的类库,`com`可能包含业务逻辑相关的类...
### 使用VLC在AIR中进行屏幕录制的知识点详解 #### 一、VLC与AIR结合进行屏幕录制的基础概念 在本文档中,我们探讨的是如何使用VLC(VideoLAN Client)这一免费开源媒体播放器软件在Adobe AIR环境中进行屏幕录制。...
最后,您可以混合,自动化和掌握歌曲,使用插件仅处理选定的部分或整个曲目,为您的音频创作提供实现专业声音所需的最终润色。 可下载的课程和媒体文件允许您执行动手练习。 重点课程将带您逐步完成实际的实际...
20. **Back Camera**:后置摄像头,主要用于拍摄照片和录制视频。 21. **Speaker / Loud Speaker**:喇叭,播放音频输出。 22. **Earpiece speaker**:听筒,将声音传送到用户耳朵。 23. **Microphone**:麦克风...
2. **自然度与真实感**:为了使修正后的声音听起来更自然,Auto-Tune 8提供了多种模式,如“经典模式”用于模拟早期版本的音效,以及“Flex-Tune”模式,它能在保持音调准确的同时,保留歌手的人声特色。 3. **实时...
- **wavread和wavwrite函数**:用于读取和写入音频文件,这是播放和录制声音的基础。 - **audioplayer对象**:创建一个播放器对象,可以用来播放音符。 - **audiowrite函数**:将生成的音频数据写入文件,实现...
20.2播放声音 418 20.2.1音频嵌入 419 20.2.2音频载入 420 20.2.3流式音频 422 20.3播放控制 424 20.3.1缓冲控制 424 20.3.2回放控制 424 20.3.3音效控制 425 20.4MP3播放器 425 20.5使用麦克风 434 20.5.1获取...
- **Audition CS5.5**: 音频编辑、混合和修复工具,适用于音乐家、录音师和声音设计师。 #### Authorware 7 - **Authorware 7**: 交互式多媒体内容创作平台,适合教育和培训领域。 #### Adobe Business Catalyst -...