📄 streamcontroller.java
字号:
id = idSequence.remove( 0 ); } // store id channelToId.put( packetX.flvChannel , id ); // create new player if ( name != null ) { int flvChannel = packetX.flvChannel; String mode = argumentsX.size( ) > 4 ? argumentsX.getString( 4 ) : "live"; StreamRouter router = new StreamRouter( id , flvChannel , name , mode , this ); routers.put( id , router ); address.put( flvChannel , router ); if ( client.streamListener == null ) router.enable( ); else { Stream stream = new Stream( router ); client.streamListener.onEvent( new StreamEvent( stream , client.client ) ); } } } /** * Remote stream create request from a remote stream instance * @param streamX stream instance */ public void createStream ( Stream streamX ) { // System.out.println( System.currentTimeMillis() + " " + client.id + " StreamController.createStream " + streamX ); createRequests.add( streamX ); client.callResponse( "createStream" , new WrapperList( ) , 0 ); } /** * Deletes a remote stream * @param streamIdX stream id * @param streamX stream instance */ public void deleteStream ( double streamIdX , Stream streamX ) { // System.out.println( System.currentTimeMillis() + " " + client.id + " StreamController.deleteStream " + streamIdX + " " + streamX ); if ( streamX.remoteType.equals( "play" ) ) stopRemote( ( int ) streamIdX ); if ( streamX.remoteType.equals( "publish" ) ) unpublishRemote( ( int ) streamIdX ); client.call( "deleteStream" , new Wrapper( streamIdX ) ); } /** * Create stream response from remote connection * @param streamIdX stream id */ public void onCreateStream ( double streamIdX ) { // System.out.println( System.currentTimeMillis() + " " + client.id + " StreamController.onCreateStream " + streamIdX ); // getting oldest waiting stream instance // setting remote id Stream stream = createRequests.remove( 0 ); stream.remoteId = ( int ) streamIdX; stream.remoteChannel = flvId--; // if stream is a remote player, create a related router for incoming stream // if stream is a remote publisher, create a player for utgoing stream boradcasting if ( stream.remoteType.equals( "play" ) ) playRemote( ( int ) streamIdX , stream.remoteChannel , stream.remoteName , stream.name ); if ( stream.remoteType.equals( "publish" ) ) publishRemote( ( int ) streamIdX , stream.remoteChannel , stream.remoteName , stream.name , stream.mode ); } /** * Creates a router for incoming stream * @param idX * @param nameX */ public void playRemote ( int idX , int channelX , String remoteNameX , String localNameX ) { // System.out.println( System.currentTimeMillis() + " " + client.id + " StreamController.playRemote " + idX + " " + remoteNameX + " " + localNameX ); // generate new id and channel int newId = streamId++; // create router StreamRouter router = new StreamRouter( newId , channelX , localNameX , "live" , this ); router.enable( ); // register router routers.put( newId , router ); address.put( channelX , router ); // send play request client.call( "play" , new WrapperList( new Wrapper( remoteNameX ) ) , channelX ); } /** * Stops a remote player * @param idX stream id */ public void stopRemote ( int idX ) { // System.out.println( System.currentTimeMillis() + " " + client.id + " StreamController.stopRemote " + idX ); // getting router StreamRouter router = routers.get( idX ); // unregister routers.remove( idX ); address.remove( router.getFlvChannel( ) ); // close here and there router.close( ); } /** * Creates a player for outgoing stream * @param idX stream id * @param nameX local name of stream * @param modeX mode of publishing */ public void publishRemote ( int idX , int channelX , String remoteNameX , String localNameX , String modeX ) { // System.out.println( System.currentTimeMillis() + " " + client.id + " StreamController.publishRemote " + idX + " " + remoteNameX + " " + localNameX ); // generate new id and channel int newId = streamId++; int videoChannel = getChannel( ); int audioChannel = getChannel( ); // create player StreamPlayer player = new StreamPlayer( newId , channelX , videoChannel , audioChannel , localNameX , this ); player.enable( ); // register player remotes.put( idX , player ); players.put( newId , player ); // send publish request WrapperList arguments = new WrapperList( ); arguments.add( remoteNameX ); arguments.add( modeX ); client.call( "publish" , arguments , channelX ); } /** * Unpublishes a remote stream * @param idX stream id */ public void unpublishRemote ( int idX ) { // System.out.println( System.currentTimeMillis() + " " + client.id + " StreamController.publishRemote " + idX ); // getting player StreamPlayer player = remotes.get( idX ); // unregister remotes.remove( idX ); players.remove( player.getId( ) ); // close here and there player.close( ); } /** * Sets audio sending state * @param argumentsX arguments * @param packetX rtmp packet */ public void onAudioReceiveState ( WrapperList argumentsX , RtmpPacket packetX ) { // System.out.println( System.currentTimeMillis() + " " + client.id + " StreamController.onAudioReceiveState " ); boolean state = argumentsX.getBoolean( 3 ); for ( StreamPlayer player : players.values( ) ) if ( player.getFlvChannel( ) == packetX.flvChannel ) player.enableAudio( state ); } /** * Sets video sending state * @param argumentsX arguments * @param packetX rtmp packet */ public void onVideoReceiveState ( WrapperList argumentsX , RtmpPacket packetX ) { // System.out.println( System.currentTimeMillis() + " " + client.id + " StreamController.onVideoReceiveState " ); boolean state = argumentsX.getBoolean( 3 ); for ( StreamPlayer player : players.values( ) ) if ( player.getFlvChannel( ) == packetX.flvChannel ) player.enableVideo( state ); } /** * Seek request from client * @param argumentsX arguments * @param packetX rtmp packet */ public void onStreamSeekRequest( WrapperList argumentsX , RtmpPacket packetX ) { // System.out.println( System.currentTimeMillis( ) + " " + client.id + // "StreamController.onStreamSeekRequest" + packetX.toString( ) + " " + argumentsX.getDouble( 3 ) ); for ( StreamPlayer player : players.values( ) ) if ( player.getFlvChannel( ) == packetX.flvChannel ) player.reader.setPosition( argumentsX.getDouble( 3 ) ); } /** * Speed request from client * @param argumentsX arguments * @param packetX rtmp packet */ public void onStreamSpeedRequest ( WrapperList argumentsX , RtmpPacket packetX ) { //System.out.println( System.currentTimeMillis( ) + " " + client.id + // "StreamController.onStreamSpeedRequest" + packetX.toString( ) + " " + argumentsX.getString( 3 )+ " " + argumentsX.getDouble( 4 ) ); for ( StreamPlayer player : players.values( ) ) if ( player.getName( ).equals( argumentsX.getString( 3 ) ) ) player.reader.setSpeed( new Double( argumentsX.getDouble( 4 ) ) ); } /** * Pause request from client * @param argumentsX arguments * @param packetX rtmp packet */ public void onStreamPauseRequest ( WrapperList argumentsX , RtmpPacket packetX ) { //System.out.println( System.currentTimeMillis( ) + " " + client.id + // "StreamController.onStreamSpeedRequest" + packetX.toString( ) + " " + argumentsX.getDouble( 3 ) ); for ( StreamPlayer player : players.values( ) ) if ( player.getFlvChannel( ) == packetX.flvChannel ) player.reader.pause( ); } /** * Sets the buffer length for the routers on the specified channel * @param idX stream id * @param bufferLengthX buffer size */ public void setBufferLength ( double streamIdX , int bufferLengthX ) { // System.out.println( System.currentTimeMillis( ) + " " + client.id + " StreamController.setBufferLength " + streamIdX + " " + bufferLengthX ); //if ( routers.containsKey( streamIdX ) ) // routers.get( streamIdX ).setBufferLength( bufferLengthX ); } /** * Steps one in packet multiplexing */ public void step ( ) { // System.out.println( System.currentTimeMillis( ) + " " + client.id + " StreamController.step ogList: " + outgoingList.size( ) ); // get incoming flv packets socket.giveFlvPackets( incomingList ); // sort them for ( RtmpPacket packet : incomingList ) if ( address.containsKey( packet.flvChannel ) ) address.get( packet.flvChannel ).take( packet ); // get sorted packets for ( StreamPlayer player : players.values( ) ) player.givePackets( outgoingList ); // give available packets socket.takePackets( outgoingList ); incomingList.clear( ); } /** * Sets dropping to a higher level */ public void addDropping ( ) { // System.out.println( System.currentTimeMillis( ) + " " + client.id + " StreamController.addDropping" ); if ( !dropDisposables ) dropDisposables = true; else if ( !dropInterframes ) dropInterframes = true; else if ( !dropKeyframes ) dropKeyframes = true; else if ( !dropAudio ) dropAudio = true; } /** * Sets dropping to a lower level */ public void removeDropping ( ) { //System.out.println( System.currentTimeMillis( ) + " " + client.id + " StreamController.removeDropping" ); if ( dropAudio ) dropAudio = false; else if ( dropKeyframes ) dropKeyframes = false; else if ( dropInterframes ) dropInterframes = false; else if ( dropDisposables ) dropDisposables = false; } /** * Returns played stream list * @return hashmap containing players */ public HashMap < Integer , Stream > getPlayers ( ) { // System.out.println( System.currentTimeMillis() + " " + client.id + " StreamController.getPlayedStreams" ); HashMap < Integer , Stream > result = new HashMap < Integer , Stream > ( ); //for ( Stream player : players.values( ) ) result.put( player.id , player ); return result; } /** * Returns published stream list * @return hashmap containing routers */ public HashMap < Integer , Stream > getRouters ( ) { //System.out.println( System.currentTimeMillis() + " " + client.id + " StreamController.getPublishedStreams " ); HashMap < Integer , Stream > result = new HashMap < Integer , Stream > ( ); //for ( Stream router : routers.values( ) ) result.put( router.id , router ); return result; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -