���� JFIF �� � ( %"1"%)+...383,7(-.-
![]() Server : Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/7.4.20 System : Linux st2.domain.com 3.10.0-1127.10.1.el7.x86_64 #1 SMP Wed Jun 3 14:28:03 UTC 2020 x86_64 User : apache ( 48) PHP Version : 7.4.20 Disable Function : NONE Directory : /usr/local/FlashphonerWebCallServer/client/examples/demo/rtmfp-client/streaming/src/ |
<?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" xmlns:views="rtmfptest.views.*" backgroundColor="#F2F0F0" width="450" height="592" creationComplete="init()" xmlns:local="*"> <fx:Declarations> </fx:Declarations> <fx:Style> .header { fontSize: 36px; } </fx:Style> <fx:Script> <![CDATA[ import mx.core.UIComponent; private var nc:NetConnection; private var cam:Camera; private var mic:Microphone; private var videoFarEnd:Video; private var publishStream:NetStream; private var subscribeStream:NetStream; private var subscribeStreamObject:Object; private function init():void{ if (ExternalInterface.available) { try { ExternalInterface.addCallback("setURLtoFlash", getDataFromJS); } catch (error:Error) { Logger.info(error.message); } } else { Logger.info("Error during set callback"); } cam = Camera.getCamera(); videoMy.attachCamera(cam); mic = Microphone.getEnhancedMicrophone(); videoFarEnd = new Video(); var container:UIComponent = new UIComponent(); container.addChild(videoFarEnd); canvas.addChild(container); playBtn.enabled = false; publishBtn.enabled = false; stopBtn.visible = false; unpublishBtn.visible = false; disconnectBtn.visible = false; } // Reset button's state, clear status private function reset():void { connectBtn.visible = true; disconnectBtn.visible = false; unpublishBtn.visible = false; publishBtn.enabled = false; publishBtn.visible = true; playBtn.visible = true; playBtn.enabled = false; stopBtn.visible = false; setPublishStatus(""); setPlayStatus(""); } private function initCam():void{ cam.setMode(int(camWidth.text),int(camHeight.text),int(camFPS.text),true); cam.setQuality(0,int(camQuality.text)); cam.setKeyFrameInterval(int(camKeyFrame.text)); cam.setMotionLevel(0,2000); Logger.info("Cam initizlized "+cam.width+"x"+cam.height); } private function initMic():void{ var options:MicrophoneEnhancedOptions = new MicrophoneEnhancedOptions(); options.mode = MicrophoneEnhancedMode.FULL_DUPLEX; options.echoPath = 128; options.nonLinearProcessing = true; mic.codec = SoundCodec.SPEEX; mic.encodeQuality = 5; mic.framesPerPacket=1; mic.gain=50; mic.setSilenceLevel(0,2000); mic.enhancedOptions = options; Logger.info("Mic initialized"); } /** * ************************** * CONNECT / DISCONNECT * ************************** **/ private function connect():void{ trace("connect"); var url:String = connectUrl.text; nc = new NetConnection(); // if (url.indexOf("rtmp") == 0){ // nc.objectEncoding = ObjectEncoding.AMF0; // } nc.client = this; nc.addEventListener(NetStatusEvent.NET_STATUS, handleConnectionStatus); var obj:Object = new Object(); obj.login = generateRandomString(20); obj.appKey = "flashStreamingApp"; nc.connect(url,obj); } //disconnect private function disconnect():void{ nc.close(); } private function handleConnectionStatus(event:NetStatusEvent):void{ Logger.info("handleConnectionStatus: "+event.info.code); if (event.info.code=="NetConnection.Connect.Success"){ Logger.info("near id: "+nc.nearID); Logger.info("far id: "+nc.farID); Logger.info("Connection opened"); disconnectBtn.visible = true; connectBtn.visible = false; playBtn.enabled = true; publishBtn.enabled = true; setConnectionStatus("CONNECTED"); } else if (event.info.code=="NetConnection.Connect.Closed"){ nc.removeEventListener(NetStatusEvent.NET_STATUS,handleConnectionStatus); unpublish(); stop(); Logger.info("Connection closed"); setConnectionStatus("DISCONNECTED"); reset(); } } private function setConnectionStatus(event:String): void { connectionStatus.text = event; } /** * ************************* * PUBLISH / UNPUBLISH * ************************* **/ private function publish():void{ if (publishStreamName.text == "") { publishStatus.text = "Empty stream name"; publishStatus.setStyle("color","#FF0000"); return; } publishStatus.setStyle("color","#000000"); Logger.info("publish audio: "+publishAudio.selected+" video: "+publishVideo.selected) publishStream = new NetStream(nc); if (publishAudio.selected){ initMic(); publishStream.attachAudio(mic); Logger.info("Init audio stream") } if (publishVideo.selected){ initCam(); publishStream.attachCamera(cam); addH264(); Logger.info("Init video stream"); } addListenerAndPublish(); Logger.info("Publishing"); } //unpublish private function unpublish():void{ Logger.info("unpublish"); if (publishStream!=null){ publishStream.close(); } videoFarEnd.clear(); } private function addListenerAndPublish():void{ publishStream.videoReliable=true; publishStream.audioReliable=false; publishStream.useHardwareDecoder=true; publishStream.addEventListener(NetStatusEvent.NET_STATUS, handleStreamStatus); publishStream.bufferTime=0; publishStream.publish(publishStreamName.text); } public function addH264():void{ var videoStreamSettings:H264VideoStreamSettings = new H264VideoStreamSettings(); videoStreamSettings.setProfileLevel(H264Profile.MAIN,H264Level.LEVEL_3_1); publishStream.videoStreamSettings = videoStreamSettings; } private function setPublishStatus(event:String): void { publishStatus.text = event; } /** * ************************* * PLAY / STOP * ************************* **/ private function play():void{ if (playStreamName.text == "") { playStatus.text = "Empty stream name"; playStatus.setStyle("color","#ff0000"); return; } playStatus.setStyle("color","#000000"); Logger.info("play"); subscribeStream = new NetStream(nc); addListenerAndPlay(); } private function stop():void{ if (subscribeStream != null) { subscribeStream.close(); subscribeStream = null; } subscribeStreamObject = null; videoFarEnd.visible = false; } private function addListenerAndPlay():void{ subscribeStream.videoReliable=true; subscribeStream.audioReliable=false; subscribeStream.useHardwareDecoder=true; subscribeStream.addEventListener(NetStatusEvent.NET_STATUS, handleSubscribeStreamStatus); subscribeStream.bufferTime=0; var soundTransform:SoundTransform = new SoundTransform(); soundTransform.volume=0.7; subscribeStream.soundTransform = soundTransform; subscribeStreamObject = createStreamObject(); subscribeStream.play(playStreamName.text); videoFarEnd.attachNetStream(subscribeStream); videoFarEnd.width = 320; videoFarEnd.height = 240; videoFarEnd.visible = true; } private function createStreamObject():Object{ var ret:Object = new Object(); ret.mediaSessionId = generateRandomString(8); ret.name = playStreamName.text; return ret; } private function generateRandomString(strlen:Number):String{ var chars:String = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; var num_chars:Number = chars.length - 1; var randomChar:String = ""; for (var i:Number = 0; i < strlen; i++){ randomChar += chars.charAt(Math.floor(Math.random() * num_chars)); } return randomChar; } private function setPlayStatus(event:String): void { playStatus.text = event; } /** * **************************** * HANDLE CONNECTION STATE * **************************** **/ private function handleStreamStatus(event:NetStatusEvent):void{ Logger.info("handleStreamStatus: "+event.info.code); switch (event.info.code) { case "NetStream.Publish.BadName": Logger.info("Bad streamName. Please publish stream with other name"); break; case "NetStream.Unpublish.Success": publishStream.removeEventListener(NetStatusEvent.NET_STATUS, handleStreamStatus); publishStream=null; setPublishStatus("UNPUBLISHED"); publishBtn.visible = true; unpublishBtn.visible = false; break; case "NetStream.Publish.Start": setPublishStatus("PUBLISHING"); publishBtn.visible = false; unpublishBtn.visible = true; break; } } private function handleSubscribeStreamStatus(event:NetStatusEvent):void{ Logger.info("handleSubscribeStreamStatus: "+event.info.code); switch (event.info.code) { case "NetStream.Play.PublishNotify": case "NetStream.Play.Start": setPlayStatus("PLAYING"); playBtn.visible = false; stopBtn.visible = true; break; case "NetStream.Play.UnpublishNotify": case "NetStream.Play.Stop": setPlayStatus("STOPPED"); playBtn.visible = true; stopBtn.visible = false; break; case "NetStream.Play.StreamNotFound": setPlayStatus("STREAM NOT FOUND"); playBtn.visible = true; stopBtn.visible = false; break; case "NetStream.Play.Failed": setPlayStatus("STREAM FAILED"); playBtn.visible = true; stopBtn.visible = false; break; } } private function asyncErrorHandler(event: AsyncErrorEvent):void{ Logger.info("asyncErrorHandler: "+event); } private function securityErrorHandler(event: SecurityErrorEvent):void{ Logger.info("securityErrorHandler: "+event); } public function ping():void{ nc.call("pong", null); } public function OnDataEvent(data:Object):void{ var message:Object = data.payload; Logger.info(message.body); } /** ************************* * JavaScript callbacks ************************* **/ private function getDataFromJS(value:String):void { if (value != null || value != "") { connectUrl.text = value; } } ]]> </fx:Script> <s:Label x="96" y="34" width="265" styleName="header" text="Flash Streaming"/> <!-- connect / disconnect --> <s:Button id="connectBtn" x="325" y="93" width="90" label="Login" click="connect()"/> <s:TextInput id="publishStreamName" x="99" y="143" width="199" text="StreamName"/> <s:Button id="disconnectBtn" x="325" y="93" label="Logout" click="disconnect()" width="90" enabled="true"/> <s:TextInput id="connectUrl" x="99" y="93" width="200" text="rtmfp://192.168.1.5:1936/live2"/> <!-- publish / unpublish --> <s:Button id="publishBtn" x="326" y="143" label="Start" width="90" height="21" click="publish()" enabled="true"/> <s:CheckBox id="publishAudio" x="146" y="505" label="audio" selected="true" /> <s:CheckBox id="publishVideo" x="223" y="505" label="video" selected="true"/> <s:Label x="120" y="561" text="width"/> <s:TextInput id="camWidth" x="120" y="531" width="32" text="320"/> <s:Label x="159" y="561" text="height"/> <s:TextInput id="camHeight" x="160" y="531" width="31" text="240"/> <s:Label x="206" y="561" text="fps"/> <s:TextInput id="camFPS" x="200" y="531" width="31" text="15"/> <s:Label x="240" y="561" text="quality"/> <s:TextInput id="camQuality" x="240" y="531" width="31" text="80"/> <s:Label x="279" y="561" text="keyframe"/> <s:TextInput id="camKeyFrame" x="280" y="531" width="31" text="15"/> <!-- play / stop --> <s:Button id="playBtn" x="325" y="193" label="Start" width="90" height="21" click="play()" enabled="true"/> <!-- video view --> <mx:Canvas id = "canvas" visible="true" x="65" y="257" width="320" height="240"> <mx:VideoDisplay id="videoMy" visible="true" x="0" y="0" width="80" height="60" chromeColor="#EEA1A1"/> </mx:Canvas> <s:Label x="35" y="143" width="56" height="22" text="Publish" verticalAlign="middle"/> <s:Label x="35" y="93" width="89" height="22" text="Server:" verticalAlign="middle"/> <s:TextInput id="playStreamName" x="99" y="193" width="199" text="StreamName"/> <s:Label x="35" y="193" height="22" text="Play" verticalAlign="middle"/> <s:Button id="unpublishBtn" x="326" y="143" label="Stop" click="unpublish()" width="90" enabled="true"/> <s:Button id="stopBtn" x="325" y="193" label="Stop" width="90" height="21" click="stop()" enabled="true"/> <s:Label id="connectionStatus" x="123" y="119" width="150" height="20" textAlign="center" verticalAlign="top"/> <s:Label id="publishStatus" x="123" y="169" width="150" height="20" textAlign="center" verticalAlign="middle"/> <s:Label id="playStatus" x="123" y="219" width="150" height="20" textAlign="center" verticalAlign="middle"/> </s:Application>