Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему  
Старый 28.07.2014, 16:16
ExXxTaSy вне форума Посмотреть профиль Отправить личное сообщение для ExXxTaSy Найти все сообщения от ExXxTaSy
  № 1  
Ответить с цитированием
ExXxTaSy

Регистрация: Jul 2014
Сообщений: 4
По умолчанию Голосовой звонок. как словить "обрыв связи" или "трубка положена"

добрый день!
на сайте сделали голосовой звонок.
код:
Код 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' - это есть, время звонка тоже есть. когда берут трубку тоже высвечивается все как надо.
нужно еще сделать что бы когда кто-то ложит трубку или просто коннект теряется, должно выдавать что то типа "собеседник положил трубку" ну либо если возможно то вообще разделить на "связь утеряна" и "положили трубку".

Создать новую тему   Часовой пояс GMT +4, время: 17:22.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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