![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Jul 2014
Сообщений: 4
|
добрый день!
на сайте сделали голосовой звонок. код: <?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' - это есть, время звонка тоже есть. когда берут трубку тоже высвечивается все как надо. нужно еще сделать что бы когда кто-то ложит трубку или просто коннект теряется, должно выдавать что то типа "собеседник положил трубку" ну либо если возможно то вообще разделить на "связь утеряна" и "положили трубку". |
|
|||||
|
Регистрация: Jul 2014
Сообщений: 4
|
Цитата:
суть такова что по одному нетстриму мне нужно паблишить себя (user1),например, по каналу user1_user2 а прослушивать(user2) по каналу user2_user1 как повесить мониторинг netstream.close по каналам user2_user1. не серчайте если туго объясняю, во флеше -бревно. но сделать нужно. ---- прочитал только что, что сразу паблишить и стримить в одном нетсриме нельзя. тобишь мне нужны разные нетсримы. но все равно то нетконекшн один. в итоге возвращаюсь к вопросу как повесить мониторинг на netstream.close |
|
|||||
|
Регистрация: Jul 2014
Сообщений: 4
|
Цитата:
|
|
|||||
|
Регистрация: Jul 2014
Сообщений: 4
|
Цитата:
с горем пополам удалось сделать. теперь нужно смотреть так думаю на сервере потому как не всегда коннекты создаются и получается не всегда получаем нужные ответы. использовали NetConnection event для стримаов. Еще для более подробного мониторинга именно коннекта вотчера надо было врубить publish_notify (использую Nginx rtmp module) которое присылало нам NetStream.Play.PublishNotify и NetStream.Play.UnpublishNotify. |
![]() |
![]() |
Часовой пояс GMT +4, время: 20:42. |
|
|
« Предыдущая тема | Следующая тема » |
|
|