flex4 - NetStream.soundtransform.volume 不会改变 [英] flex4 - NetStream.soundtransform.volume doesn't change

查看:19
本文介绍了flex4 - NetStream.soundtransform.volume 不会改变的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在接收网络流音量改变时遇到问题

I have problem with receive netstream sound volume changing

        <![CDATA[

    import mx.events.FlexEvent;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.events.NetStatusEvent;
    import flash.media.Camera;
    import flash.media.Microphone;
    import flash.media.Video;
    import flash.net.NetConnection;
    import flash.net.NetStream;
    import flash.media.SoundTransform;

            private const SERVER:String = 'rtmfp://p2p.rtmfp.net/';
            private const DEVKEY:String = 'my dev key';
            private const REG:String = 'scripts/reg.php';
            private const GETID:String = 'scripts/getid.php';

        private var netConnection:NetConnection;
        private var netStreamPublish:NetStream;
        private var streamRcv:NetStream;    
        private var videoRcv:Video;
        private var PeerId:String;
        private var newVolume:Number = 0;


        private function connect():void
        {
            netConnection = new NetConnection();
            netConnection.addEventListener(NetStatusEvent.NET_STATUS, netConnectionHandler);
            netConnection.connect(SERVER + DEVKEY);
        }

        private function netConnectionHandler(event:NetStatusEvent):void
        {
            trace('netConnection:', event.info.code);
            switch(event.info.code)
            {
                case "NetConnection.Connect.Success":
                    PublicherConnect();
                    break;
            }
        }

            private function InsertID():void {
            PeerId = netConnection.nearID;
            var loader:URLLoader = new URLLoader();
            try {
                    loader.load(new URLRequest(REG+'?insert='+PeerId));
                }
             GetID();
            }

            private function GetID():void {
                   var loader2:URLLoader = new URLLoader();
                   loader2.load(new URLRequest(GETID));
                   loader2.addEventListener(Event.COMPLETE, function(e:Event):void {

                       var farid:String = e.target.data;

                       if (farid.length) {
                            initRcvStream(farid);
                       }
                       });

                  } 

        private function PublicherConnect():void
        {  
            netStreamPublish = new NetStream(netConnection, NetStream.DIRECT_CONNECTIONS);
            netStreamPublish.addEventListener(NetStatusEvent.NET_STATUS, netConnectionHandler);

            var camera:Camera = Camera.getCamera();
            myCameraDisplay.attachCamera(camera);
            netStreamPublish.attachCamera(camera);
            var mic:Microphone = Microphone.getMicrophone();
            mic.gain = myVolume.value;
            netStreamPublish.attachAudio(mic);
            netStreamPublish.publish('media');

            var client:Object = new Object;
           client.onPeerConnect = function(c:NetStream):Boolean {
           netStreamPublish.send(c.farID);
           initRcvStream(c.farID);
           return true;
           };
           netStreamPublish.client = client;
            InsertID();
           }

          private function micVolumeChanged(e:Event):void
            {
                var mic:Microphone = Microphone.getMicrophone();
                mic.gain = e.target.value;
            }

            private function initRcvStream(peerID:String):void {

                streamRcv = new NetStream(netConnection, peerID);
                streamRcv.play('media');    

                var rcvSndTransform:SoundTransform = new SoundTransform();
                rcvSndTransform.volume = newVolume;
                streamRcv.soundTransform = rcvSndTransform;

                videoRcv = new Video;
                videoRcv.attachNetStream(streamRcv);
                rcvVideoDisplay.addChild(videoRcv);

                }   

            private function speakerVolumeChanged(e:Event):void
            {   
                newVolume = e.target.value;
                rcvVideoDisplay.volume = newVolume;
                streamRcv.soundTransform = new SoundTransform(newVolume);
            }   
        ]]>

    <mx:VideoDisplay id="rcvVideoDisplay" x="20" y="50" width="300" height="250" volume=".9" />
    <mx:VideoDisplay id="myCameraDisplay" x="370" y="50" width="300" height="250"/>
    <mx:HSlider id="rcvVolume" change="speakerVolumeChanged(event)" minimum="0" maximum="1" showDataTip="false" snapInterval=".01" x="45" y="250" value=".9"/>
    <mx:HSlider id="myVolume" change="micVolumeChanged(event)" minimum="0" maximum="1" showDataTip="false" snapInterval=".01"  x="395" y="250" value=".9" />

这行不通.请问谁能帮帮我?更新:发布完整代码.我使用 FlashDevelop 4.6.4、Flex4、SDK 4.6、flashPlayer 11.1.我的意思是如果 streamRcv soundTransform 音量大于 0,则声音打开",但不会随着 silderrcvVolume"而改变.如果streamRcv soundTransform的音量等于0,一开始视频没有声音,但是如果拖动滑块,音量可以正常控制.

And this does't work. Who can help me, please? Update: posted full code. I use FlashDevelop 4.6.4, Flex4, SDK 4.6, flashPlayer 11.1. I mean if streamRcv soundTransform volume greater than 0, sound is "on", but doesn't change with silder "rcvVolume". If streamRcv soundTransform volume equal to 0, at first, video have no sound, but if drag slider, sound volume controlled normally.

推荐答案

在 Flex 上,要播放视频流,我们可以使用 VideoPlayerVideoDisplay 组件或 Video 对象和 NetStream.

On Flex, to play a video stream we can use a VideoPlayer or a VideoDisplay components or a Video object with NetStream.

这是一个关于如何在直播中使用这些元素以及如何调整它们的音量的最小工作示例:

This an minimal working example of how to use theses elements with a live stream and how to adjust their sound volume :

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
               xmlns:s="library://ns.adobe.com/flex/spark"
               xmlns:mx="library://ns.adobe.com/flex/mx"
               width="890" height="371" minWidth="955" minHeight="600"
               creationComplete="init(event)">

    <fx:Script>
        <![CDATA[

            import mx.events.FlexEvent
            import flash.events.AsyncErrorEvent
            import flash.events.NetStatusEvent
            import flash.events.MouseEvent
            import flash.events.Event

            import spark.components.mediaClasses.DynamicStreamingVideoItem
            import spark.components.mediaClasses.DynamicStreamingVideoSource

            private const server:String = 'rtmp://localhost/live'
            private const stream:String = 'test'
            private var nc:NetConnection
            private var ns:NetStream
            private var video:Video
            private var video_item:DynamicStreamingVideoItem
            private var video_source:DynamicStreamingVideoSource
            private var volume:Number = 0.5

            private function btn_start_clickHandler(e:MouseEvent):void {            

                video_item = new DynamicStreamingVideoItem()
                video_item.streamName = stream

                // for VideoPlayer and VideoDisplay components we have to use
                // an DynamicStreamingVideoSource object as source
                video_source = new DynamicStreamingVideoSource()
                video_source.host = server
                video_source.streamItems = new <DynamicStreamingVideoItem>[video_item]
                video_source.streamType = 'live'                        

                video_player.source = video_source 
                // I disabled the VideoDisplay component just to start only playing
                // the live stream with the VideoPlayer component
                //video_display.source = video_source               

                nc = new NetConnection()
                nc.addEventListener(AsyncErrorEvent.ASYNC_ERROR, function(e:AsyncErrorEvent):void{})
                nc.addEventListener(
                    NetStatusEvent.NET_STATUS, function(e:NetStatusEvent):void{
                        if(e.info.code == 'NetConnection.Connect.Success'){

                            ns = new NetStream(nc)
                            ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, function(e:AsyncErrorEvent):void{})
                            ns.addEventListener(NetStatusEvent.NET_STATUS, function(e:NetStatusEvent):void{})

                            video = new Video(240, 180)
                            // I disabled the Video object just to start only playing
                            // the live stream with the VideoPlayer component
                            //video.attachNetStream(ns)
                            video.smoothing = true
                            uic.addChild(video)

                            ns.play(stream)

                            ns.soundTransform = new SoundTransform(volume)
                            // you can use the SoundTransform to adjust the sound volume like this :
                            // var sound_transform:SoundTransform = new SoundTransform()
                            //     sound_transform.volume = volume
                            // ns.soundTransform = sound_transform

                        }
                    }
                )
                nc.connect(server)

            }

            private function init(e:FlexEvent):void {

                // you can hide the VideoPlayer component controls panel
                //video_player.playerControls.visible = false

                // init volume
                video_player.volume = video_display.volume = volume

            }

            private function volume_slider_changeHandler(e:Event):void {

                volume = e.target.value             
                video_display.volume = video_player.volume = volume             
                ns.soundTransform = new SoundTransform(volume)

            }

            private function player_type_clickHandler(e:MouseEvent):void {

                // here we have to use Component.stop() and Component.source = '' to avoid errors
                video_player.stop()
                video_display.stop()
                video_player.source = ''
                video_display.source = ''
                video.attachNetStream(null)

                switch (RadioButton(e.target).value){

                    case 'video_player':                        
                        video_player.source = video_source
                        break

                    case 'video_display':                       
                        video_display.source = video_source
                        break

                    case 'video': 
                        video.attachNetStream(ns)
                        break                   

                }

            }

        ]]>
    </fx:Script>

    <s:VideoPlayer id="video_player" x="46" y="100" width="240" height="180"/>
    <s:VideoDisplay id="video_display" x="322" y="100" width="240" height="180"
                    autoDisplayFirstFrame="true" autoPlay="true" enabled="true" volume="0.5"/>
    <s:Button id="btn_start" x="48" y="38" width="89" height="35" label="Start"
              click="btn_start_clickHandler(event)"/>
    <mx:UIComponent id="uic" x="597" y="100" width="240" height="180"/>
    <s:HSlider id="volume_slider" x="302" y="49" width="94" height="16"
               change="volume_slider_changeHandler(event)" maximum="1" minimum="0" stepSize="0.1"
               value="0.5"/>
    <s:Label x="245" y="51" text="Volume"/>
    <s:RadioButton x="122" y="303" label="VideoPlayer" click="player_type_clickHandler(event)"
                   enabled="true" groupName="player_type" selected="true" value="video_player"/>
    <s:RadioButton x="400" y="303" label="VideoDisplay" click="player_type_clickHandler(event)"
                   groupName="player_type" value="video_display"/>
    <s:RadioButton x="686" y="303" label="Video" click="player_type_clickHandler(event)"
                   groupName="player_type" value="video"/>
</s:Application>

希望能帮助您解决问题.

I hope that helps you to resolve your problem.

这篇关于flex4 - NetStream.soundtransform.volume 不会改变的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆