分享

as3 影片剪辑中时间轴上的声音处理 (转载)

 宜宾翠屏区 2019-02-25

由于项目架构的关系,会在时间轴上加声音流,跟动画匹配,有时候会做到影片剪辑里。如果是线性的播放完全没有问题,但是遇到有播放进度条,可以跳帧,问题就出现了:播放头刚到含有声音的影片剪辑,通过调整进度条,主时间轴一下子跳过了这个影片剪辑所在的帧——导致,画面变了,但是之前的影片剪辑里的声音还在播放。。。
不谈这种方式的其他问题,就这一项,我纠结了好久。使用侦听,当播放头不在这个影片剪辑的范围时,就将影片剪辑stop,这当然不行,因为跳过了影片剪辑,它的实例名就是null了
鉴于在时间轴上的声音,没法使用SoundChannel,soundTransform里又没有关闭声音的方法
最后,灵光一闪,解决的居然很轻巧
代码创建一个影片剪辑,将需要停止的影片剪辑斌给新剪辑,然后在侦听的时候stop这个新建的影片剪辑,居然成了。。。

var newMc:MovieClip = oldMc;//时间轴上有声音的影片剪辑
//含有声音的影片剪辑在主时间轴的开始帧和结束帧
var startFrame:int = 56;
var endFrame:int = 1902;
addEventListener(Event.ENTERFRAME,isJumpOldMc);
function isJumpOldMc(e=null)
{
if(this.currentFrame>endFrame||this.currentFrame<startFrame) newMc.stop();
}
MovieClip类居然有soundTransform,可以用来管理时间轴上的音量、声道等等

var mc:MovieClip = new MovieClip();
var stransf:SoundTransform = mc.soundTransform;
stransf.volume = 0.6;
mc.soundTransform = stransf;

-----------------------------------------------------------------------------

//建立声音对象。
var mySound:Sound = new Sound();
//载入声音。
mySound.load(new URLRequest("心水.mp3"));
//建立 SoundChannel 对象。
var myChannel:SoundChannel;
//记录播放进度的变量。
var time:uint;

//播放按钮。
Btn_play.addEventListener(MouseEvent.CLICK,_play);
function _play(e:MouseEvent):void {
if (L_now.text=="当前状态:暂停") {
myChannel = mySound.play(time);
//为循环加上事件。
myChannel.addEventListener(Event.SOUND_COMPLETE,_cycleSong);
L_now.text="当前状态:播放";
}
}

//暂停按钮。
Btn_pause.addEventListener(MouseEvent.CLICK,_pause);
function _pause(e:MouseEvent):void {
if (L_now.text=="当前状态:播放") {
time = myChannel.position;
myChannel.stop();
L_now.text="当前状态:暂停";
}
}

//停止按钮。
Btn_stop.addEventListener(MouseEvent.CLICK,_stop);
function _stop(e:MouseEvent):void {
time=0;
myChannel.stop();
L_now.text="当前状态:暂停";
}

//循环按钮。
Btn_cycle.addEventListener(MouseEvent.CLICK,_cycle);
function _cycle(e:MouseEvent):void {
if (Btn_cycle.label=="循环(关)") {
Btn_cycle.label="循环(开)";
} else {
Btn_cycle.label="循环(关)";
}
}

//真正的循环代码。
function _cycleSong(e:Event):void {
if (Btn_cycle.label=="循环(开)") {
myChannel = mySound.play();
//为循环加上事件。
myChannel.addEventListener(Event.SOUND_COMPLETE,_cycleSong);
} else {
time=0;
L_now.text="当前状态:暂停";
myChannel.stop();
}
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多