Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Голосовой звонок. как словить "обрыв связи" или "трубка положена" (http://www.flasher.ru/forum/showthread.php?t=208557)

ExXxTaSy 28.07.2014 16:16

Голосовой звонок. как словить "обрыв связи" или "трубка положена"
 
добрый день!
на сайте сделали голосовой звонок.
код:
Код AS3:

<?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="250" height="150" minWidth="250" minHeight="150" creationComplete="init()">
        <fx:Style>
 
 
                .publishButton {
                        fontSize: 18px;
                        font-weight:bold;
                        color: #FFFFFF;
                        width:125px;
                        height:25px;
                        fillAlphas: 1, 1, 1, 1;
                        fillColors: #66ffff, #66ffff, #66ffff, #66ffff;
                }
                global
                {
                        chrome-color: #D32236;
                        selection-color: #F15E6F;
                        roll-over-color: #A10416;
                        focus-color: #F50622;
                        font-weight: normal;
                        font-style: normal;
                        text-decoration: none;
                }
 
        </fx:Style>
        <fx:Script>
                <![CDATA[
                        import org.osmf.events.MediaPlayerStateChangeEvent;
                        import mx.controls.Alert;
                        import mx.core.FlexGlobals;
                        import flash.display.StageDisplayState;
                        import mx.managers.SystemManager;
                        import org.osmf.events.MediaPlayerStateChangeEvent;
                        import org.osmf.events.TimeEvent;
                        import org.osmf.media.MediaPlayerState;
                        import flash.events.NetStatusEvent;
                        import spark.formatters.DateTimeFormatter;
                        import mx.collections.ArrayList;
 
 
 
                        private var microphone:Microphone;
                        private var connection:NetConnection;
                        private var stream:NetStream;
                        private var h264Settings:H264VideoStreamSettings
                        private var streamer:String;
                        private var file:String;
                        private var girl:String;
                        private var videoEventsDisabled:Boolean;
                        private var previousVideoTime:Number;
 
                        protected const hCon:int = 1000*60*60;// миллисекунд в часе
                        protected const mCon:int = 1000*60;// миллисекунд в минуте
                        protected const sCon:int = 1000; //миллисекунд в секунде
 
                        protected var t:Timer = new Timer(100);// наш таймер
                        protected var startDate:Date;// начальная дата
                        protected var lastDate:Date = null;// послдедняя дата
                        protected var stopDate:Date = null;// stop дата       
                        [Bindable]protected var listData:ArrayList = new ArrayList();// хранилице результатов
 
 
                        ///swf /assets/icons/loading10.swf
 
 
 
                        //timer
                        // запуск таймера
                        protected function startTimer():void
                        {
                                t.addEventListener(TimerEvent.TIMER,onTimerStep); // подписываемся на событие срабатывания таймера
 
                                t.start(); // запуск таймера
                                startDate = new Date(); // запоминаем начальную дату
                        }
 
                        //stop timer
                        protected function stopTimer():void
                        {
                                t.addEventListener(TimerEvent.TIMER,onTimerStep); // подписываемся на событие срабатывания таймера
 
                                t.stop(); // запуск таймера
                                stopDate = new Date(); // запоминаем начальную дату
                        }                       
 
                        /* обработчик каждого шага таймера*/
                        protected function onTimerStep(event:TimerEvent):void
                        {
                                result.text = getElapsedTime(startDate,new Date()) // получаем даные о пройденном времени
                        }
 
                        /* разница дат и форматирование результата*/
                        protected function getElapsedTime(startDate:Date,endDate:Date):String
                        {
                                var dif:Number = endDate.getTime() - startDate.getTime(); // разница дат в миллисекундах
                                var h:Number = int(dif/hCon); // прошло часов
                                var m:Number = int((dif - h*hCon)/mCon); // прошло минут
                                var s:Number = int((dif - m*mCon)/sCon); // прошло секунд
                                // var ms:Number = int(dif - s*sCon);  прошло миллисекунд
                                //return getFormattedByNumbers(h,m,s,ms);  форматируем строку по нашим данным
                                return getFormattedByNumbers(h,m,s); // форматируем строку по нашим данным
 
                        }
 
 
                        // форматируем строку из даты
                        protected function getFormattedByDate(d:Date):String
                        {
                                //return getFormattedByNumbers(d.getHours(),d.getMinutes(),d.getSeconds(),d.getMilliseconds());
                                return getFormattedByNumbers(d.getHours(),d.getMinutes(),d.getSeconds());
                        }
 
                        // форматируем строку по числам: часы, минуты, секунды, миллисекунды
                        //protected function getFormattedByNumbers(h:Number,m:Number,s:Number,ms:Number):String
                        protected function getFormattedByNumbers(h:Number,m:Number,s:Number):String
                        {
                                //return getTwoDigits(h) + ":" + getTwoDigits(m) + ":" + getTwoDigits(s) + ":" +  getThreeDigits(ms);
                                return getTwoDigits(h) + ":" + getTwoDigits(m) + ":" + getTwoDigits(s);
                        }
 
                        // дополняем нулями до трёх цифр
                        protected function getThreeDigits(src:Number):String
                        {
                                var s:String = src.toString();
                                for(var i:uint=3;i>src.toString().length;i--)
                                {
                                        s = "0" + s;
                                }
                                return s;
                        }
                        // дополняем нулями додвух цифр
                        protected function getTwoDigits(src:Number):String
                        {
                                var s:String = src.toString();
                                for(var i:uint=2;i>src.toString().length;i--)
                                {
                                        s = "0" + s;
                                }
                                return s;
                        }
 
 
                        //other
 
 
 
                        private function publishButtonListener(event:MouseEvent):void {
                                if(publishButton.label == 'Call') {
                                        publishButton.label = 'Hang up';
                                        resetVideoSource();
                                        startTimer();
 
                                } else {
 
                                        publishButton.label = 'Call';
                                        videoDisplay.source = "";
                                        videoEventsDisabled=true;
//                                        image.visible = false;
                                        stopTimer();
                                }
                        }
                        private function fullscreenListener(event:MouseEvent):void {
                                try {
                                        switch (stage.displayState) {
                                                case StageDisplayState.FULL_SCREEN:
                                                        stage.displayState = StageDisplayState.NORMAL;
                                                        break;
                                                default:
                                                        stage.displayState = StageDisplayState.FULL_SCREEN;
                                                        break;
                                        }
                                } catch (err:SecurityError) {
                                        Alert.show('Fullsceen error: ' + err);
                                }
                        }
 
                        private function resetVideo():void {
                                Alert.show('Reset');
                                videoEventsDisabled = true;
 
                                try {
                                        videoDisplay.source = "";
                                } catch (any:*) {}
 
                                setTimeout(resetVideoSource, 5000);
                        }
 
                        private function resetVideoSource():void {
                                //videoDisplay.setStyle("backgroundImage", noLogo);
                                //image.visible = true;
                                videoEventsDisabled = false;
                                previousVideoTime = NaN;
                                stopTimer();
                                videoDisplay.source = streamer + "/" + girl;
 
 
                        }
 
 
                        protected function stateChangeListener(event:MediaPlayerStateChangeEvent):void {
                                if (videoEventsDisabled) {
                                        return;
                                }
 
                                if (event.state == MediaPlayerState.PLAYBACK_ERROR) {
                                        resetVideo();
                                }
                        }
 
                        protected function timeChangeListener(event:TimeEvent):void {
                                if (videoEventsDisabled) {
                                        return;
                                }
 
                                if (isNaN(event.time) && !isNaN(previousVideoTime)) {
                                        resetVideo();
                                } else {
                                        previousVideoTime = event.time;
                                }
                        }   
 
 
 
 
                        private function netStatusHander(event:NetStatusEvent):void {
                        //Alert.show(event.info.code);
                        switch(event.info.code) {
                        case 'NetConnection.Connect.Success':
                        stream = new NetStream(connection);
 
                        stream.attachAudio(microphone);
                        //h264Settings = new H264VideoStreamSettings();
                        //h264Settings.setProfileLevel(H264Profile.BASELINE, H264Level.LEVEL_3_1);
 
                        //stream.videoStreamSettings = h264Settings;
                        stream.publish(file, 'live');
                        break;
                        }
                        }
 
                        private function init():void {
                                videoDisplay.mx_internal::videoPlayer.bufferTime = 1;
                                //videoDisplay.setStyle("backgroundImage", noLogo);
 
                                streamer = FlexGlobals.topLevelApplication.parameters.streamer;
                                if(streamer == null) {
                                        Alert.show('Missing flashvars: streamer');
                                        return;
                                }
 
                                file = FlexGlobals.topLevelApplication.parameters.file;
                                if(file == null) {
                                        Alert.show('Missing flashvars: file');
                                        return;
                                }
 
                                girl = FlexGlobals.topLevelApplication.parameters.girl;
                                if(girl == null) {
                                        Alert.show('Missing flashvars: file');
                                        return;
                                }
                                microphone = Microphone.getMicrophone();
                                microphone.setSilenceLevel(0);
                                microphone.codec = "Speex";
                                microphone.encodeQuality = 6;
                                publishButton.label = 'Stop';
                                connection = new NetConnection();
                                connection.connect(streamer);
                                connection.addEventListener(NetStatusEvent.NET_STATUS, netStatusHander);
                                publishButton.addEventListener(MouseEvent.CLICK, publishButtonListener);
                                videoDisplay.addEventListener("MediaPlayerStateChange", stateChangeListener);
                                videoDisplay.addEventListener("currentTimeChange", timeChangeListener);
                                publishButton.label = 'Hangup';
 
 
 
                                resetVideoSource();
 
 
                        }
 
 
 
                        private function ButtonHide():void       
                        {
                                //Alert.show('Hide');
                                if(publishButton.label == 'Hang up') {
                                        publishButton.visible = false;
                                        publishButton.includeInLayout = false;
                                }
                        }
 
                        private function ButtonVisible():void
                        {
                                //Alert.show('Visible');
                                if(publishButton.label == 'Hang up') {
                                        publishButton.visible = true;
                                        publishButton.includeInLayout = true;
                                }
                        }
                        protected function vpMediaPlayerStateChangeHandler(event:MediaPlayerStateChangeEvent):void {
                                //Alert.show(event.state);
                                if (event.state == "playing"){
                                        image.visible = false;
                                        done.visible = true;
                                        startTimer();
                                }
                                else{
                                        image.visible = true;
                                        done.visible = false;
                                        stopTimer();
                                }
                                //myTA.text = "loading ...";
                                //if (event.state == "loading")
                                //myTA.text = "playing ...";
                        }
 
 
 
                ]]>
        </fx:Script>
        <s:states>
                <s:State name="State1"/>
        </s:states>
 
        <s:BorderContainer x="0" y="0" width="250" height="150" borderColor="#000000" backgroundColor="#000000" mouseOut="ButtonHide()"
                                          mouseOver="ButtonVisible()">
                <s:VideoDisplay id="videoDisplay" x="0" y="0" width="250" height="150" scaleMode="none" mediaPlayerStateChange="vpMediaPlayerStateChangeHandler(event);"></s:VideoDisplay>
                <mx:Image id="image" x="99" y="42" source="@Embed(source='assets/icons/loading.swf' )"/>
                <s:Image id="done" x="80" y="25" source="@Embed(source='assets/icons/call_on.png')"/>
                <!--<s:Image id="off" x="99" y="42" source="@Embed(source='assets/icons/call_off.png')"/> -->
 
                <s:Button id="publishButton" y="115" width="185" height="31" label="Call"
                                  cornerRadius="0" horizontalCenter="1" styleName="publishButton"></s:Button>
                <s:Label id="result" width="100%" fontSize="20" textAlign="center" color="#ffffff"/>
 
                <!-- <s:SWFLoader x="85" y="29" source="../assets/icons/conn.gif" autoLoad="true"/>
                <s:SWFLoader x="85" y="29" source="/assets/icons/loading10.swf" autoLoad="true"/>-->
 
 
 
 
        </s:BorderContainer>
</s:Application>

он и с одной и сдругой стороны, только в пхп передаем разные параметры. суть такова что один звонит, создается канал и он ждет когда второй в тот же канал подрубиться.
мне нужно сделать что то типа 'connecting' - это есть, время звонка тоже есть. когда берут трубку тоже высвечивается все как надо.
нужно еще сделать что бы когда кто-то ложит трубку или просто коннект теряется, должно выдавать что то типа "собеседник положил трубку" ну либо если возможно то вообще разделить на "связь утеряна" и "положили трубку".

PainKiller 29.07.2014 11:52

1. Не уверен, но наверное эту тему админы переместят во flex
2. Я что то не понял, событие netStatus со значением NetConnection.Connect.Closed (см. справку) вам не подходит? Просто слушайте его и все.

ExXxTaSy 29.07.2014 13:36

Цитата:

Сообщение от PainKiller (Сообщение 1169712)
1. Не уверен, но наверное эту тему админы переместят во flex
2. Я что то не понял, событие netStatus со значением NetConnection.Connect.Closed (см. справку) вам не подходит? Просто слушайте его и все.


суть такова что по одному нетстриму мне нужно паблишить себя (user1),например, по каналу user1_user2
а прослушивать(user2) по каналу user2_user1
как повесить мониторинг netstream.close по каналам user2_user1.


не серчайте если туго объясняю, во флеше -бревно. но сделать нужно.



----
прочитал только что, что сразу паблишить и стримить в одном нетсриме нельзя. тобишь мне нужны разные нетсримы. но все равно то нетконекшн один. в итоге возвращаюсь к вопросу как повесить мониторинг на netstream.close

PainKiller 29.07.2014 14:03

Потестить код я не могу, но по моему вы уже подписались на нужное событие:
Код AS3:

connection.addEventListener(NetStatusEvent.NET_STATUS, netStatusHander);

в обработчике просто проверяйте свойство info
Код AS3:

private function netStatusHander(e:NetStatusEvent):void
{
  trace (e.info.code); // если NetConnection.Connect.Closed совершаем какие то действия
 
}


ExXxTaSy 29.07.2014 16:18

Цитата:

Сообщение от PainKiller (Сообщение 1169720)
Потестить код я не могу, но по моему вы уже подписались на нужное событие:
Код AS3:

connection.addEventListener(NetStatusEvent.NET_STATUS, netStatusHander);

в обработчике просто проверяйте свойство info
Код AS3:

private function netStatusHander(e:NetStatusEvent):void
{
  trace (e.info.code); // если NetConnection.Connect.Closed совершаем какие то действия
 
}


проблема в том что если кто либо из юзеров нажмет положить трубку или закроет вкладку то NetConnection.Connect.Closed не выдает. прописал на кнопку "положить трубку" что бы обрывало так выдает только у того кто ее положил. сейчас попробую второй канал создать посмотрю что получится.

PainKiller 29.07.2014 16:34

Так вы смотрите что в обработчик приходит, там еще куча кодов есть, кроме этого. В общем тут нужно экспериментировать, так сложно помочь.

ExXxTaSy 30.07.2014 23:31

Цитата:

Сообщение от PainKiller (Сообщение 1169734)
Так вы смотрите что в обработчик приходит, там еще куча кодов есть, кроме этого. В общем тут нужно экспериментировать, так сложно помочь.

спасибо за помощь!
с горем пополам удалось сделать. теперь нужно смотреть так думаю на сервере потому как не всегда коннекты создаются и получается не всегда получаем нужные ответы.

использовали NetConnection event для стримаов. Еще для более подробного мониторинга именно коннекта вотчера надо было врубить publish_notify (использую Nginx rtmp module) которое присылало нам NetStream.Play.PublishNotify и NetStream.Play.UnpublishNotify.

PainKiller 31.07.2014 10:22

да не за что, ваш опыт интересен, я с rtmp никогда не работал, поэтому могу помочь только по флешовой части))


Часовой пояс GMT +4, время: 22:10.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.