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