Git Product home page Git Product logo

red5-client's Introduction

red5-client

Old source moved to legacy branch; project source moved to server repo

red5-client's People

Contributors

dominick avatar edikamperyan avatar marcey92 avatar marcus-nl avatar mondain avatar nateroe avatar solomax avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

red5-client's Issues

Possible Memory leak

Hello,
i tested a long running Web Conference (>1h) with OpenMeetings 3.0.7 (current version). After a while a OutOfMemopryException occured during screen recording. After getting the heap dump it seems that there is a leak in red5-client (1.0.6-RELEASE) or in the used Apache MINA. I attached a Screenshot from Eclipse MAT
memoryanalysis

Can you have a look please? Or is the leak in the meantime fixed?
Many thanks and kind regards,
Dirk

BaseRTMPClientHandler.java Null pointer exception

While trying to run red-client/ClientTest.java with twitch server, there is a null pointer exception

ClientTest.Java

private String server = "live.twitch.tv";
private int port = 1935;
private String application = "app/Twitch_Key_Here";

Log

https://gist.github.com/NomiJ/f5a5f836192e7afc029a

Android23 Support

Moreover, I wonder if there would be patch for this to work with latest android,

https://developer.android.com/preview/behavior-changes.html#behavior-apache-http-client

Thanks

StreamingProxy.isRunning() causes null pointer exception

I dont know if this is a bug, or it is a design thing, so here is this issue I am facing.
I am declaring a StreamingProxy object and initializing. I am checking if the proxy is running or not depending at first it is something like this

		if(streamer.isRunning()){
			log.info("Is Running");
		}else{
			log.info("No esta corriendo");
		}

I am getting
"Caused by: java.lang.NullPointerException: null
at org.red5.proxy.StreamingProxy.isRunning(StreamingProxy.java:241)",
and it makes sense because the state is never set even if it is initialized because there is no constructor or anything.
Shouldnt it starts as stopped?

Switch to AMF3 Decode Error (BufferUnderflowException)

BufferUnderflowException occurres when attempting to decode RTMP message which uses a marker signaling a switch from AMF0 to AMF3.

Have tested against the following versions:

  • 1.0.8-M13
  • 1.0.9-RELEASE
  • 1.0.10-M6

Stack Trace

java.nio.BufferUnderflowException
	at java.nio.Buffer.nextGetIndex(Buffer.java:500)
	at java.nio.HeapByteBuffer.get(HeapByteBuffer.java:135)
	at org.apache.mina.core.buffer.AbstractIoBuffer.get(AbstractIoBuffer.java:501)
	at org.red5.io.amf.Input.readBoolean(Input.java:167)
	at org.red5.io.object.Deserializer.deserialize(Deserializer.java:93)
	at org.red5.server.net.rtmp.codec.RTMPProtocolDecoder.handleParameters(RTMPProtocolDecoder.java:1136)
	at org.red5.server.net.rtmp.codec.RTMPProtocolDecoder.decodeAction(RTMPProtocolDecoder.java:779)
	at org.red5.server.net.rtmp.codec.RTMPProtocolDecoder.decodeMessage(RTMPProtocolDecoder.java:524)
	at solers.sockpuppet.Red5ClientIT.testDecodeMessage(Red5ClientIT.java:176)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:538)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)

Log

14:09:43.139 [main] DEBUG org.red5.io.object.Deserializer - Datatype: String
14:09:43.152 [main] DEBUG org.red5.io.amf.Input - Length: 7 limit: 22
14:09:43.153 [main] DEBUG org.red5.io.amf.Input - String: _result
14:09:44.658 [main] DEBUG org.red5.io.object.Deserializer - Datatype: Number
14:09:44.658 [main] DEBUG org.red5.io.amf.Input - readNumber from 11 bytes
14:09:44.659 [main] DEBUG org.red5.io.amf.Input - Number: 2.0
14:09:48.126 [main] DEBUG org.red5.io.object.Deserializer - Datatype: null
14:09:49.456 [main] DEBUG org.red5.io.amf.Input - Switch to AMF3
14:09:49.995 [main] DEBUG org.red5.io.object.Deserializer - Datatype: XML[-113]
14:09:52.667 [main] DEBUG org.red5.io.object.Deserializer - Datatype: Boolean

Unit Test

import java.nio.ByteBuffer;

import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.binary.Hex;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.buffer.SimpleBufferAllocator;
import org.easymock.EasyMock;
import org.junit.Test;
import org.red5.server.api.IConnection;
import org.red5.server.net.rtmp.RTMPConnection;
import org.red5.server.net.rtmp.codec.RTMPProtocolDecoder;
import org.red5.server.net.rtmp.message.Constants;
import org.red5.server.net.rtmp.message.Header;

public class Red5ClientTest {

    @Test
    public void testDecodeMessage() throws DecoderException {
        
        //Mocking out the connection
        RTMPConnection conn = EasyMock.createNiceMock(RTMPConnection.class);
        EasyMock.expect(conn.getEncoding()).andStubReturn(IConnection.Encoding.AMF0);
        EasyMock.replay(conn);
        
        //Setting up the header
        Header header = new Header();
        header.setDataType(Constants.TYPE_INVOKE);
        
        //Defining the RMTP AMF0 body that is causing the issue
        byte[] _resultPacket = Hex.decodeHex("0200075F726573756C74004000000000000000051101".toCharArray());
        ByteBuffer byteBuffer = ByteBuffer.wrap(_resultPacket);
        IoBuffer ioBuffer = new SimpleBufferAllocator().wrap(byteBuffer);
        
        //Attempting to decode the body, but will result in stack trace
        RTMPProtocolDecoder decoder = new RTMPProtocolDecoder();
        decoder.decodeMessage(conn, header, ioBuffer);
    }
}

Wireshark Packet Capture ScreenShot

wiresharkamf0

Incorrect timestamp processing

Hello,

We are currently using the Red5 Client module to consume an RTMP input stream and proxy it to a different output destination. Nevertheless, Red5 seems to be ignoring most RTMP messages and streaming is not working as expected. See the following debug logs:

2018-09-12 13:55:34.206 DEBUG org.red5.client.net.rtmp.RTMPMinaIoHandler - messageReceived
2018-09-12 13:55:34.206 DEBUG org.red5.client.net.rtmp.RTMPConnManager - Getting connection by session id: AZZRP5I8SU291
2018-09-12 13:55:34.206 DEBUG org.red5.server.api.Red5 - Set connection: AZZRP5I8SU291 with thread: NioProcessor-75
2018-09-12 13:55:34.206 DEBUG org.red5.server.api.Red5 - Caller: org.red5.client.net.rtmp.RTMPMinaIoHandler.messageReceived #136
2018-09-12 13:55:34.206 DEBUG org.red5.server.net.rtmp.RTMPConnection - Executor is null on AZZRP5I8SU291 state: connected
2018-09-12 13:55:34.206 DEBUG org.red5.client.net.rtmp.BaseRTMPClientHandler - NetStream dispatchEvent: Video - ts: -837759002 length: 140
2018-09-12 13:55:34.206 DEBUG org.red5.client.net.rtmp.BaseRTMPClientHandler - publishStreamData - stream data map: {1.0=org.red5.client.net.rtmp.BaseRTMPClientHandler$NetStreamPrivateData@1497d1d9}
2018-09-12 13:55:34.206 DEBUG org.red5.server.stream.consumer.ConnectionConsumer - Message timestamp: -837759002
2018-09-12 13:55:34.206 DEBUG org.red5.server.stream.consumer.ConnectionConsumer - Message has negative timestamp: -837759002

The code responsible for this behaviour is coming from red5-server-common, in the pushMessage method. If an incoming RTMP message has a negative timestamp, it is simply ignored.

Monitoring the source RTMP input with the rtmpdump tool shows that none of the timestamps that are sent to Red5 are negative. However, they have large values, more specifically between 231 and 232. The IRTMPEvent defines the timestamp as int, which is a signed data type ranging from -231 and 231 - 1. Any value between 231 and 232 -1 will overflow and be interpreted as a negative timestamp by Red5.

Adobe's official RTMP specification states the following:

Timestamps in RTMP are given as an integer number of milliseconds relative to an unspecified epoch. Typically, each stream will start with a timestamp of 0, but this is not required, as long as the two endpoints agree on the epoch. Note that this means that any synchronization across multiple streams (especially from separate hosts) requires some additional mechanism outside of RTMP.

Because timestamps are 32 bits long, they roll over every 49 days, 17 hours, 2 minutes and 47.296 seconds. Because streams are allowed to run continuously, potentially for years on end, an RTMP application SHOULD use serial number arithmetic [RFC1982] when processing timestamps, and SHOULD be capable of handling wraparound. For example, an application assumes that all adjacent timestamps are within 2^31 - 1 milliseconds of each other, so 10000 comes after 4000000000, and 3000000000 comes before 000000000.

Timestamp deltas are also specified as an unsigned integer number of milliseconds, relative to the previous timestamp. Timestamp deltas may be either 24 or 32 bits long.

If my understanding is correct, according to the specification RTMP applications should be using unsigned integer arithmetic and not assume that timestamps start at 0 at the beginning of each stream.

Two of our current encoder vendors currently can't be used in conjunction with Red5 as they don't start the timestamp at 0 and may use a value between 231 and 232. Even for encoder vendors who reset their timestamps to 0, we believe that if the stream has been running for more than 24 days, 20 hours, 31 minutes and 23.648 seconds (231 milliseconds), it will suddenly break down as the timestamps will be interpreted as negative by Red5 past that point.

Thanks in advance for your help!

Regards,

Pyves

NoSuchMethodError org.apache.mina.util.NamePreservingRunnable.<init> in connect()

On client.connect() i get error:
Exception in thread "ServerHandler.142" java.lang.NoSuchMethodError: org.apache.mina.util.NamePreservingRunnable.<init>(Ljava/lang/Runnable;Ljava/lang/String;)V at org.apache.mina.core.service.AbstractIoService.executeWorker(AbstractIoService.java:433) at org.apache.mina.core.service.AbstractIoService.executeWorker(AbstractIoService.java:425) at org.apache.mina.core.polling.AbstractPollingIoConnector.startupWorker(AbstractPollingIoConnector.java:411) at org.apache.mina.core.polling.AbstractPollingIoConnector.connect0(AbstractPollingIoConnector.java:393) at org.apache.mina.core.service.AbstractIoConnector.connect(AbstractIoConnector.java:268) at org.apache.mina.core.service.AbstractIoConnector.connect(AbstractIoConnector.java:187) at org.red5.client.net.rtmp.RTMPClient.startConnector(RTMPClient.java:85) at org.red5.client.net.rtmp.BaseRTMPClientHandler.connect(BaseRTMPClientHandler.java:288) at org.red5.client.net.rtmp.BaseRTMPClientHandler.connect(BaseRTMPClientHandler.java:261) at org.red5.client.net.rtmp.BaseRTMPClientHandler.connect(BaseRTMPClientHandler.java:199) at org.red5.client.net.rtmp.BaseRTMPClientHandler.connect(BaseRTMPClientHandler.java:181)

Red5 client fails to decode RTMP from FFmpeg server

Hello, and thank you for this project!

Problem summary

I'm using a Red5 RTMP client for connecting to and playing audio from an FFmpeg process (ffmpeg -re -f lavfi -i sine -f flv -c copy -flvflags no_duration_filesize -listen 1 rtmp://localhost:1935/live/testing). Before any audio is received by Red5, a decoding error occurs, due to a class cast exception inside RTMPProtocolDecoder::readTransactionId (class java.lang.String cannot be cast to class java.lang.Number).

Details

I've tried looking at this on both the Red5 side and FFmpeg side, and my understanding can be summed as follows:

Please correct me if the above doesn't make sense, or if you think I have misunderstood something. Based on the above, I'd like some help to answer the following questions:

  1. Why does Red5 parse messages differently based on header.getStreamId() being 0 or not? Is this rooted in something from the RTMP specification that can be referred to? From what I understand, this behaviour has been here since (at least) 2014 when code was pulled in from a fork.

  2. Is it incorrect of FFmpeg to send "@setDataFrame on Metadata" with Message Stream ID = 0? Is there something in the RTMP specification that provides more details on this topic?

Reproduction steps

Run an FFmpeg RTMP server:
ffmpeg -re -f lavfi -i sine -f flv -c copy -flvflags no_duration_filesize -listen 1 rtmp://localhost:1935/live/testing

Run the following Java program for connecting to the FFmpeg server with a Red5 client:

import org.red5.client.net.rtmp.RTMPClient;

/*
This example uses the following mvn dependencies:
<dependency>
  <groupId>org.red5</groupId>
  <artifactId>red5-client</artifactId>
  <version>1.2.12</version>
</dependency>
<dependency>
  <groupId>org.red5</groupId>
  <artifactId>red5-server-common</artifactId>
  <version>1.2.12</version>
</dependency>
 */

public class Red5AndFfmpeg {
  public static void main(String[] args) {
    var red5Client = new RTMPClient();
    red5Client.setStreamEventDispatcher(event -> System.out.println("Received event: " + event));
    red5Client.connect(
        "[::1]", // change to "localhost" for IPv4
        1935,
        "live",
        connectCall -> {
          assert connectCall.isSuccess();
          red5Client.createStream(
              streamCall -> {
                assert streamCall.isSuccess();
                double streamId = (Double) streamCall.getResult();
                red5Client.play(streamId, "testing", 0, -1);
              });
        });
  }
}

When running the above, I see the following output from the Java program:

15:18:11.868 [NioProcessor-2] DEBUG org.red5.io.amf.Input - String: @setDataFrame
15:18:11.868 [NioProcessor-2] DEBUG org.red5.io.object.Deserializer - Datatype: String
15:18:11.868 [NioProcessor-2] DEBUG org.red5.io.amf.Input - Length: 10 limit: 171
15:18:11.868 [NioProcessor-2] DEBUG org.red5.io.amf.Input - String: onMetaData
15:18:11.868 [NioProcessor-2] WARN org.red5.server.net.rtmp.codec.RTMPProtocolDecoder - Failed to decodeBuffer: pos 0, limit 970, chunk size 128, buffer 040000000000ab120000000002000d40736574446174614672616d6502000a6f6e4d657461446174610800000006000d617564696f6461746172617465004085888000000000000f617564696f73616d706c65726174650040e5888000000000000f617564696f73616d706c6573697a65004030000000000000000673746572656f0100000c617564696f63c46f64656369640040080000000000000007656e636f64657202000d4c61766635392e31362e3130300000090400000000080108000000003e00000001ff01fd02f803ee04e005cc06b0078d0862092d0aee0aa40b4e0cec0c7c0dff0d750edb0e330f7b0fb40fdd0ff60fff0ff80fe10fba0f830f3c0fe60e820e0e0e8d0dfd0c610cb80b040b440a7a09a708ca07e606fc050b0515041a031e021e011e001dff1dfe20fd25fc2dfb3bfa4ff969f88bf7b5f6e9f527f570c4f4c5f326f393f20ff298f130f1d6f08cf052f027f00cf001f006f01cf041f076f0bbf00ff172f1e4f164f2f2f28df334f4e7f4a6f56ff641f71cf8fff8eaf9dafacffbc8fcc5fdc5fec5ffc600c601c402bf03b704aa0597067d075c083309000ac30a7b0b280cc90c5d0de30d5b0ec50e200f6c0fa90fd50ff20ffe0ffb0fe7c40fc40f910f4e0ffb0e9a0e2a0eab0d1f0d860ce00b2d0b700aa909d708fd071b07320642054d04540357025801580057ff57fe59fd5dfc65fb72fa84f99df8bdf7e6f617f653f599f4ebf349f3b3f22cf2b2f146f1e9f09cf05df02ff011f002f004f015f037f069f0aaf0fbf05bf1c9f146f2d0f268f30df4bef47af540f610c4f7e9f7cbf8b3f9a2fa97fb90fc8cfd8bfe8bff8c008c018b0287037f047305610649072a080209d209970a530b020ca60c3c0dc60d410eaf0e0d0f5c0f9c0fcc0fed0ffd0ffd0fed0fcd0f9e0f5e0f0f0fb10e440ec90d400da90c060c580b9d0ad709080930084f076706790585048d0391029201920091ff91fe92fd96fc9ec4fba9fabaf9d1f8eff716f745f67ff5c2f411f46cf3d4f249f2ccf15df1fdf0acf06af038f016f004f002f010f02ef05cf09af0e7f043f1aff128f2b0f244f3e6f394f44ef512f6e0f6b7f797f87ef96cfa5ffb57fc53fd51fe51ff5200510150024d0347043c052b061507f807d208a4096c0a290bdb0b820c1b0da80d260e97c40ef90e4c0f8f0fc30fe70ffb0fff0ff20fd60faa0f6e0f220fc80e5e0ee70d610dcd0c2d0c800bc80a050a3809620883079c06b005bd04c503ca02cd01cd00ccffccfeccfdd0fcd6fbe0faeff905f922f846f774f6aaf5ecf438f491f3f6f268f2e7f175f112f1bdf078f042f01df007f001f00bf026f050f08bf0d4f02df195c4
15:18:11.870 [NioProcessor-2] WARN org.red5.server.net.rtmp.codec.RTMPProtocolDecoder - Closing connection because decoding failed: RTMPMinaConnection 0:0:0:0:0:0:0:1:1935 to null client: null session: VM1VKW8XESSKU state: connected
org.red5.server.net.protocol.ProtocolException: Error during decoding
	at org.red5.server.net.rtmp.codec.RTMPProtocolDecoder.decode(RTMPProtocolDecoder.java:195)
	at org.red5.server.net.rtmp.codec.RTMPProtocolDecoder.decodeBuffer(RTMPProtocolDecoder.java:120)
	at org.red5.client.net.rtmp.codec.RTMPMinaCodecFactory$1.decode(RTMPMinaCodecFactory.java:58)
	at org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:254)
	at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:650)
	at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1300(DefaultIoFilterChain.java:49)
	at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:1128)
	at org.red5.client.net.rtmpe.RTMPEIoFilter.messageReceived(RTMPEIoFilter.java:79)
	at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:650)
	at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1300(DefaultIoFilterChain.java:49)
	at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:1128)
	at org.apache.mina.core.filterchain.IoFilterAdapter.messageReceived(IoFilterAdapter.java:122)
	at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:650)
	at org.apache.mina.core.filterchain.DefaultIoFilterChain.fireMessageReceived(DefaultIoFilterChain.java:643)
	at org.apache.mina.core.polling.AbstractPollingIoProcessor.read(AbstractPollingIoProcessor.java:539)
	at org.apache.mina.core.polling.AbstractPollingIoProcessor.access$1200(AbstractPollingIoProcessor.java:68)
	at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.process(AbstractPollingIoProcessor.java:1224)
	at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.process(AbstractPollingIoProcessor.java:1213)
	at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:683)
	at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: java.lang.ClassCastException: class java.lang.String cannot be cast to class java.lang.Number (java.lang.String and java.lang.Number are in module java.base of loader 'bootstrap')
	at org.red5.server.net.rtmp.codec.RTMPProtocolDecoder.readTransactionId(RTMPProtocolDecoder.java:785)
	at org.red5.server.net.rtmp.codec.RTMPProtocolDecoder.decodeAction(RTMPProtocolDecoder.java:761)
	at org.red5.server.net.rtmp.codec.RTMPProtocolDecoder.decodeMessage(RTMPProtocolDecoder.java:528)
	at org.red5.server.net.rtmp.codec.RTMPProtocolDecoder.decodePacket(RTMPProtocolDecoder.java:308)
	at org.red5.server.net.rtmp.codec.RTMPProtocolDecoder.decode(RTMPProtocolDecoder.java:181)
	... 22 common frames omitted

This is the FFmpeg version I'm using:

$ ffmpeg -version
ffmpeg version 5.0 Copyright (c) 2000-2022 the FFmpeg developers
built with Apple clang version 13.0.0 (clang-1300.0.29.30)
configuration: --prefix=/usr/local/Cellar/ffmpeg/5.0 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox
libavutil      57. 17.100 / 57. 17.100
libavcodec     59. 18.100 / 59. 18.100
libavformat    59. 16.100 / 59. 16.100
libavdevice    59.  4.100 / 59.  4.100
libavfilter     8. 24.100 /  8. 24.100
libswscale      6.  4.100 /  6.  4.100
libswresample   4.  3.100 /  4.  3.100
libpostproc    56.  3.100 / 56.  3.100

Create Stream error in android

Am struggling to create simple stream in olfaDemo using red5 client libs(1.1.1) but it always return null as stream id in logs, some exceptions and returns connection closed in server logs.

My requirement is to simple audio flv streaming through android,I understand once i create stream that i can solve it easily

Am not sure whats the problem in cient lib side can you please help full log details here

08-02 17:22:32.964 5800-5800/? E/Zygote: v2
08-02 17:22:32.964 5800-5800/? I/libpersona: KNOX_SDCARD checking this for 10314
08-02 17:22:32.964 5800-5800/? I/libpersona: KNOX_SDCARD not a persona
08-02 17:22:32.964 5800-5800/? I/SELinux: Function: selinux_compare_spd_ram, SPD-policy is existed. and_ver=SEPF_SM-J500F_5.1.1 ver=48
08-02 17:22:32.974 5800-5800/? I/SELinux: Function: selinux_compare_spd_ram , priority [1] , priority version is VE=SEPF_SM-J500F_5.1.1_0048
08-02 17:22:32.974 5800-5800/? E/SELinux: [DEBUG] get_category: variable seinfo: default sensitivity: NULL, cateogry: NULL
08-02 17:22:32.984 5800-5800/? I/art: Late-enabling -Xcheck:jni
08-02 17:22:32.984 5800-5800/? D/TimaKeyStoreProvider: in addTimaSignatureService
08-02 17:22:32.994 5800-5808/? I/art: Ignoring second debugger -- accepting and dropping
08-02 17:22:32.994 5800-5800/? D/TimaKeyStoreProvider: TimaSignature is unavailable
08-02 17:22:32.994 5800-5800/? D/ActivityThread: Added TimaKesytore provider
08-02 17:22:32.994 5800-5808/? I/art: Debugger is no longer active
08-02 17:22:33.024 5800-5800/? W/ResourcesManager: getTopLevelResources: com.xxxxx.aaa.xxxxx for user 0
08-02 17:22:33.024 5800-5800/? I/InjectionManager: Inside getClassLibPath + mLibMap{0=, 1=}
08-02 17:22:33.044 5800-5800/? I/InjectionManager: Inside getClassLibPath caller
08-02 17:22:36.124 5800-5800/com.xxxxx.aaa.xxxxx D/FirebaseAuth: Notifying id token listeners about user ( gHu9qFD2GGUgUOtpOBRLrniA3cE3 ).
08-02 17:22:36.154 5800-5800/com.xxxxx.aaa.xxxxx D/FirebaseAuth: Notifying id token listeners about user ( gHu9qFD2GGUgUOtpOBRLrniA3cE3 ).
08-02 17:22:36.154 5800-5800/com.xxxxx.aaa.xxxxx D/FirebaseApp: com.google.firebase.crash.FirebaseCrash is not linked. Skipping initialization.
08-02 17:22:36.224 5800-5800/com.xxxxx.aaa.xxxxx V/FA: Registered activity lifecycle callback
08-02 17:22:36.224 5800-5800/com.xxxxx.aaa.xxxxx I/FirebaseInitProvider: FirebaseApp initialization successful
08-02 17:22:36.234 5800-5800/com.xxxxx.aaa.xxxxx I/InstantRun: starting instant run server: is main process
08-02 17:22:36.264 5800-5800/com.xxxxx.aaa.xxxxx D/InjectionManager: InjectionManager
08-02 17:22:36.264 5800-5800/com.xxxxx.aaa.xxxxx D/InjectionManager: fillFeatureStoreMap com.xxxxx.aaa.xxxxx
08-02 17:22:36.264 5800-5800/com.xxxxx.aaa.xxxxx I/InjectionManager: Constructor com.xxxxx.aaa.xxxxx, Feature store :{}
08-02 17:22:36.264 5800-5800/com.xxxxx.aaa.xxxxx I/InjectionManager: featureStore :{}
08-02 17:22:36.284 5800-5829/com.xxxxx.aaa.xxxxx W/ResourcesManager: getTopLevelResources: com.xxxxx.aaa.xxxxx for user 0
08-02 17:22:36.294 5800-5829/com.xxxxx.aaa.xxxxx V/FA: Collection enabled
08-02 17:22:36.294 5800-5829/com.xxxxx.aaa.xxxxx V/FA: App package, google app id: com.xxxxx.aaa.xxxxx, 1:20649275253:android:91776a2d1b020437
08-02 17:22:36.304 5800-5829/com.xxxxx.aaa.xxxxx I/FA: App measurement is starting up, version: 12451
08-02 17:22:36.304 5800-5829/com.xxxxx.aaa.xxxxx I/FA: To enable debug logging run: adb shell setprop log.tag.FA VERBOSE
08-02 17:22:36.304 5800-5829/com.xxxxx.aaa.xxxxx I/FA: To enable faster debug mode event logging run:
adb shell setprop debug.firebase.analytics.app com.xxxxx.aaa.xxxxx
08-02 17:22:36.304 5800-5829/com.xxxxx.aaa.xxxxx D/FA: Debug-level message logging enabled
08-02 17:22:36.354 5800-5800/com.xxxxx.aaa.xxxxx W/ResourcesManager: getTopLevelResources: com.xxxxx.aaa.xxxxx for user 0
08-02 17:22:36.364 5800-5829/com.xxxxx.aaa.xxxxx V/FA: Connecting to remote service
08-02 17:22:36.364 5800-5800/com.xxxxx.aaa.xxxxx D/DisplayManager: DisplayManager()
08-02 17:22:36.394 5800-5829/com.xxxxx.aaa.xxxxx V/FA: Connection attempt already in progress
08-02 17:22:36.414 5800-5800/com.xxxxx.aaa.xxxxx W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
08-02 17:22:36.474 5800-5800/com.xxxxx.aaa.xxxxx V/FA: onActivityCreated
08-02 17:22:36.494 5800-5800/com.xxxxx.aaa.xxxxx I/Timeline: Timeline: Activity_launch_request id:com.xxxxx.aaa.xxxxx time:211100207
08-02 17:22:36.504 5800-5800/com.xxxxx.aaa.xxxxx D/Activity: performCreate Call Injection manager
08-02 17:22:36.544 5800-5800/com.xxxxx.aaa.xxxxx D/PhoneWindow: FMB installDecor mIsFloating : false
08-02 17:22:36.544 5800-5800/com.xxxxx.aaa.xxxxx D/PhoneWindow: FMB installDecor flags : -2139029248
08-02 17:22:36.544 5800-5800/com.xxxxx.aaa.xxxxx D/FirebaseApp: Notifying auth state listeners.
08-02 17:22:36.544 5800-5800/com.xxxxx.aaa.xxxxx D/FirebaseApp: Notified 0 auth state listeners.
08-02 17:22:36.544 5800-5800/com.xxxxx.aaa.xxxxx D/FirebaseApp: Notifying auth state listeners.
08-02 17:22:36.544 5800-5800/com.xxxxx.aaa.xxxxx D/FirebaseApp: Notified 0 auth state listeners.
08-02 17:22:36.594 5800-5800/com.xxxxx.aaa.xxxxx W/ResourcesManager: getTopLevelResources: com.xxxxx.aaa.xxxxx for user 0
08-02 17:22:36.594 5800-5800/com.xxxxx.aaa.xxxxx V/FA: onActivityCreated
08-02 17:22:36.594 5800-5800/com.xxxxx.aaa.xxxxx D/PhoneWindow: FMB installDecor mIsFloating : false
08-02 17:22:36.604 5800-5800/com.xxxxx.aaa.xxxxx D/PhoneWindow: FMB installDecor flags : -2139029248
08-02 17:22:37.004 5800-5800/com.xxxxx.aaa.xxxxx D/Activity: performCreate Call Injection manager
08-02 17:22:37.064 5800-5834/com.xxxxx.aaa.xxxxx W/ResourcesManager: getTopLevelResources: com.google.android.gms for user 0
08-02 17:22:37.074 5800-5834/com.xxxxx.aaa.xxxxx W/ResourcesManager: Asset path '/system/framework/com.android.media.remotedisplay.jar' does not exist or contains no resources.
08-02 17:22:37.074 5800-5834/com.xxxxx.aaa.xxxxx W/ResourcesManager: Asset path '/system/framework/com.android.location.provider.jar' does not exist or contains no resources.
08-02 17:22:37.074 5800-5834/com.xxxxx.aaa.xxxxx I/InjectionManager: Inside getClassLibPath caller
08-02 17:22:37.074 5800-5800/com.xxxxx.aaa.xxxxx W/Firestore: (0.6.6-dev) [Firestore]: The behavior for java.util.Date objects stored in Firestore is going to change AND YOUR APP MAY BREAK.
To hide this warning and ensure your app does not break, you need to add the following code to your app before calling any other Cloud Firestore methods:

FirebaseFirestore firestore = FirebaseFirestore.getInstance();
FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
.setTimestampsInSnapshotsEnabled(true)
.build();
firestore.setFirestoreSettings(settings);

With this change, timestamps stored in Cloud Firestore will be read back as com.google.firebase.Timestamp objects instead of as system java.util.Date objects. So you will also need to update code expecting a java.util.Date to instead expect a Timestamp. For example:

// Old:
java.util.Date date = snapshot.getDate("created_at");
// New:
Timestamp timestamp = snapshot.getTimestamp("created_at");
java.util.Date date = timestamp.toDate();

Please audit all existing usages of java.util.Date when you enable the new behavior. In a future release, the behavior will be changed to the new behavior, so if you do not follow these steps, YOUR APP MAY BREAK.
08-02 17:22:37.124 5800-5834/com.xxxxx.aaa.xxxxx W/linker: libconscrypt_gmscore_jni.so: unused DT entry: type 0x6ffffffe arg 0x14dc
08-02 17:22:37.124 5800-5834/com.xxxxx.aaa.xxxxx W/linker: libconscrypt_gmscore_jni.so: unused DT entry: type 0x6fffffff arg 0x2
08-02 17:22:37.134 5800-5834/com.xxxxx.aaa.xxxxx V/NativeCrypto: Registering com/google/android/gms/org/conscrypt/NativeCrypto's 284 native methods...
08-02 17:22:37.154 5800-5833/com.xxxxx.aaa.xxxxx I/System.out: 17:22:37.157 [Thread-8843] DEBUG org.red5.client.net.rtmpAlt.RTMPMinaIoHandler - Set handler: org.red5.client.net.rtmpAlt.RTMPClient@136bc814
08-02 17:22:37.154 5800-5833/com.xxxxx.aaa.xxxxx I/System.out: 17:22:37.165 [Thread-8843] DEBUG org.red5.client.net.rtmpAlt.RTMPMinaIoHandler - Set handler: org.red5.client.net.rtmpAlt.RTMPClient@2f5278bd
08-02 17:22:37.154 5800-5833/com.xxxxx.aaa.xxxxx I/System.out: 17:22:37.168 [Thread-8843] DEBUG org.red5.client.net.rtmpAlt.BaseRTMPClientHandler - connect server: 192.168.0.105 port 1935 connect - params: {app=olfaDemo, objectEncoding=0, fpad=false, flashVer=WIN 11,2,202,235, audioCodecs=3575, videoFunction=1, pageUrl=null, path=olfaDemo, capabilities=15, swfUrl=null, videoCodecs=252, tcUrl=rtmp://192.168.0.105:1935/olfaDemo} callback: com.xxxxx.aaa.xxxxx.rtmp.Streamer$start$1@26152eb2 args: null
08-02 17:22:37.154 5800-5833/com.xxxxx.aaa.xxxxx I/System.out: 17:22:37.170 [Thread-8843] INFO org.red5.client.net.rtmpAlt.BaseRTMPClientHandler - rtmp://192.168.0.105:1935/olfaDemo
08-02 17:22:37.184 5800-5834/com.xxxxx.aaa.xxxxx I/art: Rejecting re-init on previously-failed class java.lang.Class<com.google.android.gms.org.conscrypt.Java7ExtendedSSLSession>
08-02 17:22:37.194 5800-5834/com.xxxxx.aaa.xxxxx I/art: Rejecting re-init on previously-failed class java.lang.Class<com.google.android.gms.org.conscrypt.Java7ExtendedSSLSession>
08-02 17:22:37.194 5800-5834/com.xxxxx.aaa.xxxxx I/art: Rejecting re-init on previously-failed class java.lang.Class<com.google.android.gms.org.conscrypt.Java8ExtendedSSLSession>
08-02 17:22:37.194 5800-5834/com.xxxxx.aaa.xxxxx I/art: Rejecting re-init on previously-failed class java.lang.Class<com.google.android.gms.org.conscrypt.Java8ExtendedSSLSession>
08-02 17:22:37.254 5800-5816/com.xxxxx.aaa.xxxxx I/art: Background sticky concurrent mark sweep GC freed 16086(1214KB) AllocSpace objects, 0(0B) LOS objects, 0% free, 16MB/16MB, paused 17.623ms total 122.447ms
08-02 17:22:37.274 5800-5800/com.xxxxx.aaa.xxxxx I/InjectionManager: dispatchOnViewCreated > Target : com.xxxxx.aaa.xxxxx.MainActivity isFragment :false
08-02 17:22:37.294 5800-5834/com.xxxxx.aaa.xxxxx I/ProviderInstaller: Installed default security provider GmsCore_OpenSSL
08-02 17:22:37.314 5800-5829/com.xxxxx.aaa.xxxxx I/FA: Tag Manager is not found and thus will not be used
08-02 17:22:37.314 5800-5800/com.xxxxx.aaa.xxxxx D/DisplayManager: DisplayManager()
08-02 17:22:37.324 5800-5839/com.xxxxx.aaa.xxxxx D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true
08-02 17:22:37.334 5800-5800/com.xxxxx.aaa.xxxxx D/PhoneWindow: FMB isFloatingMenuEnabled mFloatingMenuBtn : null
08-02 17:22:37.334 5800-5800/com.xxxxx.aaa.xxxxx D/PhoneWindow: FMB isFloatingMenuEnabled return false
08-02 17:22:37.344 5800-5829/com.xxxxx.aaa.xxxxx D/FA: Logging event (FE): screen_view(_vs), Bundle[{firebase_event_origin(_o)=auto, firebase_screen_class(_sc)=MainActivity, firebase_screen_id(_si)=457313154605215331}]
08-02 17:22:37.374 5800-5816/com.xxxxx.aaa.xxxxx W/art: Suspending all threads took: 10.855ms
08-02 17:22:37.384 5800-5816/com.xxxxx.aaa.xxxxx I/art: Background partial concurrent mark sweep GC freed 11019(589KB) AllocSpace objects, 0(0B) LOS objects, 39% free, 16MB/27MB, paused 18.716ms total 129.541ms
08-02 17:22:37.414 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:22:37.430 [NioProcessor-2] DEBUG org.red5.client.net.rtmpAlt.RTMPMinaIoHandler - Session created
08-02 17:22:37.424 5800-5839/com.xxxxx.aaa.xxxxx I/Adreno-EGL: <qeglDrvAPI_eglInitialize:379>: EGL 1.4 QUALCOMM build: AU_LINUX_ANDROID_LA.BR.1.1.3_RB1.05.01.00.032.018_msm8916_32_refs/tags/AU_LINUX_ANDROID_LA.BR.1.1.3_RB1.05.01.00.032.018__release_AU (I856e09677e)
OpenGL ES Shader Compiler Version: E031.25.03.04
Build Date: 05/03/15 Sun
Local Branch:
Remote Branch: refs/tags/AU_LINUX_ANDROID_LA.BR.1.1.3_RB1.05.01.00.032.018
Local Patches: NONE
Reconstruct Branch: NOTHING
08-02 17:22:37.424 5800-5839/com.xxxxx.aaa.xxxxx I/OpenGLRenderer: Initialized EGL, version 1.4
08-02 17:22:37.434 5800-5840/com.xxxxx.aaa.xxxxx I/art: Rejecting re-init on previously-failed class java.lang.Class<org.red5.server.AttributeStore$$Lambda$0>
08-02 17:22:37.434 5800-5840/com.xxxxx.aaa.xxxxx I/art: Rejecting re-init on previously-failed class java.lang.Class<org.red5.server.AttributeStore$$Lambda$0>
08-02 17:22:37.444 5800-5829/com.xxxxx.aaa.xxxxx V/FA: Connection attempt already in progress
08-02 17:22:37.444 5800-5829/com.xxxxx.aaa.xxxxx V/FA: Connection attempt already in progress
08-02 17:22:37.444 5800-5839/com.xxxxx.aaa.xxxxx D/OpenGLRenderer: Enabling debug mode 0
08-02 17:22:37.454 5800-5829/com.xxxxx.aaa.xxxxx V/FA: Activity resumed, time: 674462069
08-02 17:22:37.454 5800-5829/com.xxxxx.aaa.xxxxx D/FA: Connected to remote service
08-02 17:22:37.454 5800-5829/com.xxxxx.aaa.xxxxx V/FA: Processing queued up service tasks: 4
08-02 17:22:37.464 5800-5800/com.xxxxx.aaa.xxxxx E/RecyclerView: No adapter attached; skipping layout
08-02 17:22:37.504 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:22:37.515 [NioProcessor-2] DEBUG org.red5.server.BaseConnection - New BaseConnection - type: persistent
08-02 17:22:37.504 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:22:37.518 [NioProcessor-2] DEBUG org.red5.server.BaseConnection - Generated session id: DKJ30SV9WBXRM
08-02 17:22:37.534 5800-5800/com.xxxxx.aaa.xxxxx W/art: Before Android 4.1, method int android.support.v7.widget.DropDownListView.lookForSelectablePosition(int, boolean) would have incorrectly overridden the package-private method in android.widget.ListView
08-02 17:22:37.534 5800-5800/com.xxxxx.aaa.xxxxx I/InjectionManager: dispatchCreateOptionsMenu :com.xxxxx.aaa.xxxxx.MainActivity
08-02 17:22:37.534 5800-5800/com.xxxxx.aaa.xxxxx I/InjectionManager: dispatchPrepareOptionsMenu :com.xxxxx.aaa.xxxxx.MainActivity
08-02 17:22:37.604 5800-5800/com.xxxxx.aaa.xxxxx E/RecyclerView: No adapter attached; skipping layout
08-02 17:22:37.634 5800-5800/com.xxxxx.aaa.xxxxx I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@3f357c07 time:211101342
08-02 17:22:37.874 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:22:37.883 [NioProcessor-2] DEBUG org.red5.client.net.rtmpAlt.RTMPMinaIoHandler - Session opened
08-02 17:22:37.874 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:22:37.884 [NioProcessor-2] DEBUG org.red5.client.net.rtmpAlt.OutboundHandshake - generateClientRequest1
08-02 17:22:37.874 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:22:37.885 [NioProcessor-2] DEBUG org.red5.client.net.rtmpAlt.OutboundHandshake - Client digest position offset: 1278 algorithm: 1
08-02 17:22:37.874 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:22:37.888 [NioProcessor-2] DEBUG org.red5.client.net.rtmpAlt.OutboundHandshake - Digest is valid: true
08-02 17:22:37.874 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:22:37.889 [NioProcessor-2] DEBUG org.red5.client.net.rtmpAlt.RTMPConnManager - Getting connection by session id: DKJ30SV9WBXRM
08-02 17:22:37.874 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:22:37.891 [NioProcessor-2] DEBUG org.red5.client.net.rtmpAlt.RTMPMinaIoHandler - messageSent
08-02 17:22:37.884 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:22:37.898 [NioProcessor-2] DEBUG org.red5.client.net.rtmpAlt.RTMPMinaIoHandler - messageSent: 0300000005800007022d619d68ce4901cba182b10dfa41c60fe4a168506397455efc00cabe4b8715a324d66056a83d7eb763876a4a7b5af5ebd6ff6a92c2dde76523cc183cb93a0841ab08ffc338c14a7c5b3d7dd42a28300cf39a503f3f94b4b5e91ff416ab16e67c2abf411d18289ac689c47a1859200a848f602ea1a1c291fede2e1e8752a1e91845819fe76af8f725e491287a8f3579a8db3b57d2cc921f92083a8b7b9d200adb43776f366abef08c30dd72d2e585db8f631764444382f8e5ee3ff014e5835c1086564b36047268d4250718eba5af139838648c3c2860841227362027f39e66076f8adaa59d676a385e133605461bb5e321df5150cf1c51581ed03bbd4d0c9e91a300e055a6098ed9becc96527dd342d48fa277efb6ea0a96dac8ac95347deb8621309cacafdff8392d32dc7a7d9c72960fc950d7623af2d57610f39f445336415c577f254297d6c25a307719687f90949528529e2976f5bdca7b468159ba0f212e0227ceaa13813f4ecd663ee9f6e6ff0ee2032cbe91471c5cb3fd1485b561086b4db8ca6dbc1c5fe154d0ed445b3a4d94de313ea9d6926511a0cee5f1c134ddc78677cf0f93d237f4236a9b665a54b6ca697de39292ba2c7f7be0b715ff850bbe09bfa717c699bf7714a8b68285a1b80d833600a86c27add040a1fd471c21025d9141b14fb78e5293c4c81d4846d992969f7bcdfc92aa4526407a628255a0b3084d975f65c8d731341da2a239c8bccad1e3c0570c1fe6f546f54743765968168d7623b7015c1efe31e4548daea1dfa9f8238cfe274757e4fb67a93217e0baa66a3444d494c99b43f53db21adf4f85bc43239cf7c333dbdb18bf2173993cdee1810fd565f94ba3ea175f8cf8d9ce8d5305e946ca1eb0d5c87ed1ff815c4051cb3042fe2b171cdac4c5e4c9ca7be06b03771c35d2f3fcdc3e8dcb1e876e330a6b609b577d8a46e305227a45a883ca352618c073c23c63f8f29f3b72e94dbfcd4aefce5ac55adfa8c5b1da8b9d749bbf585dcec21d4c7f783ef22d67bb23088ff8ba6724027db3387e1c4e5a286f4cc5fa7b7143bbca3948a035100c46324fec8982b38346e89826930927f8be3e3e29b038ea76482ff0ea396b90118929e5a51203565e3793ec86c5bdef5d44a4ed3ae50e6c7bc6ba5fee5059b497b4fc44372fa5656191c8f973bd6135219791e71544f866b409c11c06cfe0d5cbad3f8d7f7f933802a09b3b268750424905154a0b3e120fa63893d4a5c3d643548c8bd46d233a4dd0c960cb9e14de1ad5d3fa6321894f313a5108aa2cdeceb0912009e1c545bff217006c6dd6b511892eb897359a9e8a7d42a3f23cacf624bca56b5461f68d7582cd5031f791a48f28545fd0fa923892f05553b6503585242c5820f5a9fcacfa80da585c17ac7dcba2e6e778e6a8d9f008f5da3824b429beabc02a2c8153d373cfa4ca30b708bfe99cfb6400c3bf47b9d90e833bdf6424822dc2263a9efc3a10c9f4edef72034e45fec15d1b2cc2091f37b9f052a3cddcb43f5de54fc78d9c0012261b9be87bf2ac95f84e277984ec09995c94413a565978e4cbed2cba5ab8f743a841e3e26cd77e4435264da8ae82bb540e38ad625eccc6d66af7d95ba4d089ebd1648787120db92ff7c8ead5b3a04a565378b02df4049e337d7141c9df2bbd6fff18d824a107d2ae908b6308e2de76962745b6050df88200b6fb3e4c029590c708088846901ea9dcd5bc996f801990be5463d72e5f43980899ec7246f0db902bfd7426186e0e891ca9193449eff1f2e01eea8dfb708360230cee50b282841637c04cedc612e183b71e9d6d18fe75920c6f51b748e47575ae4fdadc72074fecd2d098bc33a8595dd48b9a89faf2d52e0e243ac9b44e45b672da86845cdfae6a83233245360fa19e4ea9010cde5a75b5f09b582713ea3af30ce8f5d0b21a4d6834ff0705981a9904fb2c1aa28604dfacdaab885c31e8a2612cf182a6d82a90a6ebe0bcf2dc2271d87c7267103eb707d681d6080941e17080e17a39ae3811deac6398852fcd75bcc9c015e2cc7caba6d7569e680e0793b96e8c265b0a6c3320e7bc3bae47c31ff3fca62275be4c2eb9e5fc640b6bc435372ce893e036e63647904f66155d1f40f1b63d1b7f4be8490239f58bab1eb751c7
08-02 17:22:37.894 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:22:37.907 [NioProcessor-2] DEBUG org.red5.client.net.rtmpAlt.RTMPConnManager - Getting connection by session id: DKJ30SV9WBXRM
08-02 17:22:37.894 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:22:37.908 [NioProcessor-2] DEBUG org.red5.client.net.rtmpAlt.OutboundHandshake - addBuffer - pos: 0 limit: 1536 remain: 1536
08-02 17:22:37.894 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:22:37.909 [NioProcessor-2] DEBUG org.red5.client.net.rtmpeAlt.RTMPEIoFilter - decodeHandshakeS0S1
08-02 17:22:37.894 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:22:37.910 [NioProcessor-2] DEBUG org.red5.client.net.rtmpAlt.OutboundHandshake - addBuffer - pos: 2048 limit: 2048 remain: 0
08-02 17:22:37.894 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:22:37.911 [NioProcessor-2] DEBUG org.red5.client.net.rtmpAlt.OutboundHandshake - decodeServerResponse1
08-02 17:22:37.894 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:22:37.912 [NioProcessor-2] DEBUG org.red5.client.net.rtmpAlt.OutboundHandshake - Server digest position offset: 1116
08-02 17:22:37.904 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:22:37.913 [NioProcessor-2] DEBUG org.red5.client.net.rtmpAlt.OutboundHandshake - Server digest verified
08-02 17:22:37.904 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:22:37.915 [NioProcessor-2] DEBUG org.red5.client.net.rtmpAlt.RTMPConnManager - Getting connection by session id: DKJ30SV9WBXRM
08-02 17:22:37.904 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:22:37.917 [NioProcessor-2] DEBUG org.red5.client.net.rtmpAlt.RTMPMinaIoHandler - messageSent
08-02 17:22:37.914 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:22:37.921 [NioProcessor-2] DEBUG org.red5.client.net.rtmpAlt.RTMPMinaIoHandler - messageSent: 0f824926c52d4c5c788be84203a5fe912e076b5bf5265c621821a919898f9a31660c2f5cfd999c6f99b4ad31a54d0a1844ac5ecf4c3cc07525ac466b9c5e4abebe8a9fc71222287710679dcdb9790b9f0177708d8e0e5c0385759f76f83f475b52f93ead7c6305f2920d3fc491b8d21018c665442763ec5ee77f05c44808f9f6020d1e87558aa0e42be206d9c6bf963c07fcb497e409e51a72b3bfaffe2720221ca67d8399c9ff5339c37662e14fb256283c6e9d874b7b91adcf11ea52910a93b92e5301b23e14cad6f092c99f13e9782aedf1636c75c25edca098f799e56ca52c75ad185d8025d8bce3a30cf8653f1b724c6e6740b0d4e46f74f2b0e6c9bbd502ecde10af4b3b907dab423f223b5ea13f6d401d03bd12c607a8b7c018eb1f44684879e8b7e4a7091868c10855c592cd8e780f6c51626b6f11abc529a73eef3956ea23cf743594de0fd9d7202d6a4d47b105c92f819fb98a09fad5be9560c49d2ba32badefc3b0ad6c13a4d6e52b3e1b45dc63b771e82e882fd56ba81e2c187f55a6fb9901f6d89a69d5048dc2abfb39147d7446c5fcce1fadb609e3afef738fcdc35562c859e0cb0b162c3b575937f4923d9493232ff9c71cd2bdc0e0d72da5cb346009efc466eb45bb9eea356e8c856dda984b55210c3dbe2bf863046dbd3acfaa8543069bb5a92e926e390ed8cd886dc6928c6f3e0502d0efb845054f96ec9f581efa7298b83837fbcbda0b32f37b349dab6ada9943db133702b118709cfd0d1cf4ca3cc0fdcf6cedeb13705b92441e7cc56bd3e15451b763ad48c9911ed2ae258987b680cd297a30323f7f60e0aa612ef30d2988c930eda4777fc2c068758b9438b30314480458f8bc4da5c14fd9e867bc3d0e6c280a8e65741e8b0ae215c40a240ad0ad9ea487512a3ed93eb2e00e8033e09183e4b377b2c2c14ab1bf83c225f0f90506534febe8c4a922c1f635516cdd4cbf706cc5ccd399586d8a3fb6384e5620d1498dd0cc39ed38030d672d7ae261ce9eee431b7ca39da9be627c46755e78d589857ef79d28e02a7a3b8b8761df16241d802b5840708ecb5089c8f2e10a1aa2bc11d415ef81c5d1114888e0730f50019ddd655faa623eab3edaa31c820f96c55d993a824afc141453241c3e8cc28b8e2df1f8dbd7b2db89f1e431495b8dafad6eb3f31973a93feca90a2187726760e6767f10b7f03d8979411152a432132c81484175b856f4bee98c1fab092ac449973aa966a4ca294be45ceb3e7ae43e469abbef24c3b69b58ac7492a8f203633626ba03be98cdb63f0702d5b3bef601e7066e9a10a0993fc86cdcba20d7b2e5f3897be3724b9273217104e2b88438e6b4064279cb3a9182ae7414f4f5302b3960acf70d0cbaa4612d88b29be9889eddee8f4f424b800dc3d1a183453cd81bdd73ef2d06f5a66ccc430229df59a6407c1fcac6aae0e61bf2b0e63fe62a8febb810a5aca02d145fdd606e092e016172b196963c0836e15e1464cace5a84791128ac94837916cd4d2d6caa6709be5f7356b50315e7686c5564d0e7f8b1ab9f2652c57a729c55de06de506d5440e2e9b7220dd678d82388ab39256a9101336be6d526843e75b81680005fbd8945556d3ede520abad3dcb6b809b0981351092e6b63fdd72eb5318d084a137730ed3ffe8cf60e4b66f0127d3a490045d0782b9c76fbc209c6ebe819686812cc0d3b4fd1dfab387b0949a0e8f7ee535d70a7f24c80a2e7a66cf14ed9576b8cc0750c84c037908d3063572506e6d95b5d3aa3e53b53f066ae165e51ad0f1ce1abe3c990c86d1abd314910706b71754dd9a2e42448a9cd101332ac90b9aa389cba0679c78d2b5f6afe3f990cac7e4145f634205eb7fa25b33edbc7abe874dcbd6d5bd59dd21157f848065bcee40a23f5eee9015ab0fe841389e31e9e656cac51199f36b9047e3e23737bc57b3466b0a8918cf70cbfecc4adc495832a21db6f5c6650838eafa8d87519cf0c783d86c392c1b0713f54585f4db30c6553523c3514d0bd74940594cc7d87a8b392a6351b74f32af8ca43e7f8738c9738ebf0783e6a27fad0fd5c444ce240e3b5d09a99d68cb30be75a43a431897b34132f38fe36e0113e810daea3f37f4cc8337c1c1d6ac16fefdabcc2f7d6a3629d66c1968c78d8015f429e61
08-02 17:22:37.914 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:22:37.924 [NioProcessor-2] DEBUG org.red5.client.net.rtmpAlt.RTMPConnManager - Getting connection by session id: DKJ30SV9WBXRM
08-02 17:22:37.924 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:22:37.925 [NioProcessor-2] DEBUG org.red5.client.net.rtmpeAlt.RTMPEIoFilter - decodeHandshakeS2 - buffer: HeapBuffer[pos=0 lim=1025 cap=4096: 45 26 40 7A 62 82 55 A0 B3 08 4D 97 5F 65 C8 D7 31 34 1D A2 A2 39 C8 BC CA D1 E3 C0 57 0C 1F E6 F5 46 F5 47 43 76 59 68 16 8D 76 23 B7 01 5C 1E FE 31 E4 54 8D AE A1 DF A9 F8 23 8C FE 27 47 57 E4 FB 67 A9 32 17 E0 BA A6 6A 34 44 D4 94 C9 9B 43 F5 3D B2 1A DF 4F 85 BC 43 23 9C F7 C3 33 DB DB 18 BF 21 73 99 3C DE E1 81 0F D5 65 F9 4B A3 EA 17 5F 8C F8 D9 CE 8D 53 05 E9 46 CA 1E B0 D5 C8 7E D1 FF 81 5C 40 51 CB 30 42 FE 2B 17 1C DA C4 C5 E4 C9 CA 7B E0 6B 03 77 1C 35 D2 F3 FC DC 3E 8D CB 1E 87 6E 33 0A 6B 60 9B 57 7D 8A 46 E3 05 22 7A 45 A8 83 CA 35 26 18 C0 73 C2 3C 63 F8 F2 9F 3B 72 E9 4D BF CD 4A EF CE 5A C5 5A DF A8 C5 B1 DA 8B 9D 74 9B BF 58 5D CE C2 1D 4C 7F 78 3E F2 2D 67 BB 23 08 8F F8 BA 67 24 02 7D B3 38 7E 1C 4E 5A 28 6F 4C C5 FA 7B 71 43 BB CA 39 48 A0 35 10 0C 46 32 4F EC 89 82 B3 83 46 E8 98 26 93 09 27 F8 BE 3E 3E 29 B0 38 EA 76 48 2F F0 EA 39 6B 90 11 89 29 E5 A5 12 03 56 5E 37 93 EC 86 C5 BD EF 5D 44 A4 ED 3A E5 0E 6C 7B C6 BA 5F EE 50 59 B4 97 B4 FC 44 37 2F A5 65 61 91 C8 F9 73 BD 61 35 21 97 91 E7 15 44 F8 66 B4 09 C1 1C 06 CF E0 D5 CB AD 3F 8D 7F 7F 93 38 02 A0 9B 3B 26 87 50 42 49 05 15 4A 0B 3E 12 0F A6 38 93 D4 A5 C3 D6 43 54 8C 8B D4 6D 23 3A 4D D0 C9 60 CB 9E 14 DE 1A D5 D3 FA 63 21 89 4F 31 3A 51 08 AA 2C DE CE B0 91 20 09 E1 C5 45 BF F2 17 00 6C 6D D6 B5 11 89 2E B8 97 35 9A 9E 8A 7D 42 A3 F2 3C AC F6 24 BC A5 6B 54 61 F6 8D 75 82 CD 50 31 F7 91 A4 8F 28 54 5F D0 FA 92 38 92 F0 55 53 B6 50 35 85 24 2C 58 20 F5 A9 FC AC FA 80 DA 58 5C 17 AC 7D CB A2 E6 E7 78 E6 A8 D9 F0 08 F5 DA 38 24 B4 29 BE AB C0 2A 2C 81 53 D3 73 CF A4 CA 30 B7 08 BF E9 9C FB 64 00 C3 BF 47 B9 D9 0E 83 3B DF 64 24 82 2D C2 26 3A 9E FC 3A 10 C9 F4 ED EF 72 03 4E 45 FE C1 5D 1B 2C C2 09 1F 37 B9 F0 52 A3 CD DC B4 3F 5D E5 4F C7 8D 9C 00 12 26 1B 9B E8 7B F2 AC 95 F8 4E 27 79 84 EC 09 99 5C 94 41 3A 56 59 78 E4 CB ED 2C BA 5A B8 F7 43 A8 41 E3 E2 6C D7 7E 44 35 26 4D A8 AE 82 BB 54 0E 38 AD 62 5E CC C6 D6 6A F7 D9 5B A4 D0 89 EB D1 64 87 87 12 0D B9 2F F7 C8 EA D5 B3 A0 4A 56 53 78 B0 2D F4 04 9E 33 7D 71 41 C9 DF 2B BD 6F FF 18 D8 24 A1 07 D2 AE 90 8B 63 08 E2 DE 76 96 27 45 B6 05 0D F8 82 00 B6 FB 3E 4C 02 95 90 C7 08 08 88 46 90 1E A9 DC D5 BC 99 6F 80 19 90 BE 54 63 D7 2E 5F 43 98 08 99 EC 72 46 F0 DB 90 2B FD 74 26 18 6E 0E 89 1C A9 19 34 49 EF F1 F2 E0 1E EA 8D FB 70 83 60 23 0C EE 50 B2 82 84 16 37 C0 4C ED C6 12 E1 83 B7 1E 9D 6D 18 FE 75 92 0C 6F 51 B7 48 E4 75 75 AE 4F DA DC 72 07 4F EC D2 D0 98 BC 33 A8 59 5D D4 8B 9A 89 FA F2 D5 2E 0E 24 3A C9 B4 4E 45 B6 72 DA 86 84 5C DF AE 6A 83 23 32 45 36 0F A1 9E 4E A9 01 0C DE 5A 75 B5 F0 9B 58 27 13 EA 3A F3 0C E8 F5 D0 B2 1A 4D 68 34 FF 07 05 98 1A 99 04 FB 2C 1A A2 86 04 DF AC DA AB 88 5C 31 E8 A2 61 2C F1 82 A6 D8 2A 90 A6 EB E0 BC F2 DC 22 71 D8 7C 72 67 10 3E B7 07 D6 81 D6 08 09 41 E1 70 80 E1 7A 39 AE 38 11 DE AC 63 98 85 2F CD 75 BC C9 C0 15 E2 CC 7C AB A6 D7 56 9E 68 0E 07 93 B9 6E 8C 26 5B 0A 6C 33 20 E7 BC 3B AE 47 C3 1F F3 FC A6 22 75 BE 4C 2E B9 E5 FC 64 0B 6B C4 35 37 B1 B0 05 DF DA 8F A6 2F 81 D9 64 05 2E D8 C9 5F 3E F0 61 CA D7 B8 16 79 EC 2F DF CE 94 39 CD 14...]
08-02 17:22:37.924 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:22:37.934 [NioProcessor-2] DEBUG org.red5.client.net.rtmpAlt.OutboundHandshake - addBuffer - pos: 511 limit: 2048 remain: 1537
08-02 17:22:37.924 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:22:37.935 [NioProcessor-2] DEBUG org.red5.client.net.rtmpAlt.OutboundHandshake - decodeServerResponse2
08-02 17:22:37.924 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:22:37.937 [NioProcessor-2] DEBUG org.red5.client.net.rtmpAlt.OutboundHandshake - Compatible flash server
08-02 17:22:37.924 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:22:37.938 [NioProcessor-2] DEBUG org.red5.client.net.rtmpeAlt.RTMPEIoFilter - S2 decoding successful
08-02 17:22:37.924 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:22:37.939 [NioProcessor-2] DEBUG org.red5.client.net.rtmpeAlt.RTMPEIoFilter - Connected, removing handshake data
08-02 17:22:37.924 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:22:37.940 [NioProcessor-2] DEBUG org.red5.client.net.rtmpeAlt.RTMPEIoFilter - Adding RTMP protocol filter
08-02 17:22:37.934 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:22:37.950 [NioProcessor-2] DEBUG org.red5.client.net.rtmpAlt.BaseRTMPClientHandler - Writing 'connect' invoke: Invoke #1: Service: null Method: connect No params, invokeId: 1
08-02 17:22:37.944 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:22:37.954 [NioProcessor-2] DEBUG org.red5.client.net.rtmpAlt.RTMPConnManager - Getting connection by session id: DKJ30SV9WBXRM
08-02 17:22:37.944 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:22:37.956 [NioProcessor-2] WARN org.red5.client.net.rtmpAlt.RTMPMinaIoHandler - Exception caught Don't know how to handle message of type 'org.red5.server.net.rtmp.message.Packet'. Are you missing a protocol encoder?
08-02 17:22:37.944 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:22:37.960 [NioProcessor-2] ERROR org.red5.client.net.rtmpAlt.RTMPMinaIoHandler - Exception detail
08-02 17:22:37.944 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: java.lang.IllegalStateException: Don't know how to handle message of type 'org.red5.server.net.rtmp.message.Packet'. Are you missing a protocol encoder?
08-02 17:22:37.944 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.flushNow(AbstractPollingIoProcessor.java:1019)
08-02 17:22:37.944 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.flush(AbstractPollingIoProcessor.java:921)
08-02 17:22:37.954 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:688)
08-02 17:22:37.954 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64)
08-02 17:22:37.954 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
08-02 17:22:37.954 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
08-02 17:22:37.954 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: at java.lang.Thread.run(Thread.java:818)
08-02 17:22:42.694 5800-5829/com.xxxxx.aaa.xxxxx V/FA: Inactivity, disconnecting from the service
08-02 17:23:01.854 5800-5829/com.xxxxx.aaa.xxxxx V/FA: Recording user engagement, ms: 24573
08-02 17:23:01.854 5800-5829/com.xxxxx.aaa.xxxxx V/FA: Connecting to remote service
08-02 17:23:01.854 5800-5829/com.xxxxx.aaa.xxxxx V/FA: Activity paused, time: 674486642
08-02 17:23:01.864 5800-5829/com.xxxxx.aaa.xxxxx D/FA: Logging event (FE): user_engagement(_e), Bundle[{firebase_event_origin(_o)=auto, engagement_time_msec(_et)=24573, firebase_screen_class(_sc)=MainActivity, firebase_screen_id(_si)=457313154605215331}]
08-02 17:23:01.894 5800-5829/com.xxxxx.aaa.xxxxx V/FA: Connection attempt already in progress
08-02 17:23:01.894 5800-5829/com.xxxxx.aaa.xxxxx D/FA: Connected to remote service
08-02 17:23:01.894 5800-5829/com.xxxxx.aaa.xxxxx V/FA: Processing queued up service tasks: 2
08-02 17:23:06.944 5800-5829/com.xxxxx.aaa.xxxxx V/FA: Inactivity, disconnecting from the service
08-02 17:23:38.294 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:23:38.311 [NioProcessor-2] DEBUG org.red5.client.net.rtmpAlt.RTMPMinaIoHandler - Session closed
08-02 17:23:38.304 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:23:38.312 [NioProcessor-2] DEBUG org.red5.client.net.rtmpAlt.RTMPConnManager - Getting connection by session id: DKJ30SV9WBXRM
08-02 17:23:38.304 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:23:38.313 [NioProcessor-2] DEBUG org.red5.server.net.rtmp.RTMPConnection - Connection calls pending: 1
08-02 17:23:38.304 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: get result here kavinull
08-02 17:23:38.304 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:23:38.316 [NioProcessor-2] DEBUG org.red5.client.net.rtmpAlt.BaseRTMPClientHandler - createStream - callback: com.xxxxx.aaa.xxxxx.rtmp.Streamer$start$1$1@ebfefec
08-02 17:23:38.304 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:23:38.319 [NioProcessor-2] DEBUG org.red5.client.net.rtmpAlt.BaseRTMPClientHandler - CreateStreamCallBack com.xxxxx.aaa.xxxxx.rtmp.Streamer$start$1$1
08-02 17:23:38.304 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:23:38.320 [NioProcessor-2] DEBUG org.red5.client.net.rtmpAlt.BaseRTMPClientHandler - invoke method: createStream params null callback org.red5.client.net.rtmpAlt.BaseRTMPClientHandler$CreateStreamCallBack@3f5b3fb5
08-02 17:23:38.314 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:23:38.323 [NioProcessor-2] DEBUG org.red5.client.net.rtmpAlt.BaseRTMPClientHandler - connectionClosed
08-02 17:23:38.314 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:23:38.324 [NioProcessor-2] DEBUG org.red5.server.net.rtmp.BaseRTMPHandler - connectionClosed: DKJ30SV9WBXRM
08-02 17:23:38.314 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:23:38.324 [NioProcessor-2] DEBUG org.red5.server.net.rtmp.RTMPConnection - Connection calls pending: 2
08-02 17:23:38.314 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: get result here kavinull
08-02 17:23:38.314 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:23:38.325 [NioProcessor-2] DEBUG org.red5.client.net.rtmpAlt.BaseRTMPClientHandler - createStream - callback: com.xxxxx.aaa.xxxxx.rtmp.Streamer$start$1$1@ebfefec
08-02 17:23:38.314 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:23:38.326 [NioProcessor-2] DEBUG org.red5.client.net.rtmpAlt.BaseRTMPClientHandler - CreateStreamCallBack com.xxxxx.aaa.xxxxx.rtmp.Streamer$start$1$1
08-02 17:23:38.314 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:23:38.327 [NioProcessor-2] DEBUG org.red5.client.net.rtmpAlt.BaseRTMPClientHandler - invoke method: createStream params null callback org.red5.client.net.rtmpAlt.BaseRTMPClientHandler$CreateStreamCallBack@241764a
08-02 17:23:38.314 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:23:38.328 [NioProcessor-2] DEBUG org.red5.client.net.rtmpAlt.BaseRTMPClientHandler - CreateStreamCallBack resultReceived - stream id: null call: Service: null Method: createStream No params
08-02 17:23:38.314 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:23:38.329 [NioProcessor-2] DEBUG org.red5.client.net.rtmpAlt.BaseRTMPClientHandler - Connection: RTMPMinaConnection 192.168.0.105:1935 to null client: null session: DKJ30SV9WBXRM state: connected
08-02 17:23:38.314 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: check the STREAM ID PARU DAnull
08-02 17:23:38.314 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:23:38.330 [NioProcessor-2] DEBUG org.red5.client.net.rtmpAlt.BaseRTMPClientHandler - CreateStreamCallBack resultReceived - stream id: null call: Service: null Method: createStream No params
08-02 17:23:38.314 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:23:38.331 [NioProcessor-2] DEBUG org.red5.client.net.rtmpAlt.BaseRTMPClientHandler - Connection: RTMPMinaConnection 192.168.0.105:1935 to null client: null session: DKJ30SV9WBXRM state: connected
08-02 17:23:38.314 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: check the STREAM ID PARU DAnull
08-02 17:23:38.324 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:23:38.332 [NioProcessor-2] DEBUG org.red5.server.net.rtmp.RTMPConnection - close: DKJ30SV9WBXRM
08-02 17:23:38.324 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:23:38.333 [NioProcessor-2] DEBUG org.red5.server.net.rtmp.RTMPConnection - State: connected
08-02 17:23:38.324 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:23:38.340 [NioProcessor-2] DEBUG ROOT - Red5LoggerFactory instanced by Thread: NioProcessor-2
08-02 17:23:38.334 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:23:38.343 [NioProcessor-2] WARN org.red5.client.net.rtmpAlt.RTMPMinaIoHandler - Exception caught Failed resolution of: Ljava/lang/management/ManagementFactory;
08-02 17:23:38.344 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: 17:23:38.346 [NioProcessor-2] ERROR org.red5.client.net.rtmpAlt.RTMPMinaIoHandler - Exception detail
08-02 17:23:38.344 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: java.lang.NoClassDefFoundError: Failed resolution of: Ljava/lang/management/ManagementFactory;
08-02 17:23:38.344 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: at org.red5.server.api.Red5.(Red5.java:100)
08-02 17:23:38.344 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: at org.red5.server.api.Red5.setConnectionLocal(Red5.java:126)
08-02 17:23:38.344 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: at org.red5.server.net.rtmp.RTMPConnection.close(RTMPConnection.java:971)
08-02 17:23:38.344 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: at org.red5.server.net.rtmp.RTMPMinaConnection.close(RTMPMinaConnection.java:121)
08-02 17:23:38.344 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: at org.red5.server.net.rtmp.BaseRTMPHandler.connectionClosed(BaseRTMPHandler.java:183)
08-02 17:23:38.344 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: at org.red5.client.net.rtmpAlt.BaseRTMPClientHandler.connectionClosed(BaseRTMPClientHandler.java:753)
08-02 17:23:38.344 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: at org.red5.client.net.rtmpAlt.RTMPMinaIoHandler.sessionClosed(RTMPMinaIoHandler.java:116)
08-02 17:23:38.344 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: at org.apache.mina.core.filterchain.DefaultIoFilterChain$TailFilter.sessionClosed(DefaultIoFilterChain.java:938)
08-02 17:23:38.344 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextSessionClosed(DefaultIoFilterChain.java:597)
08-02 17:23:38.344 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$900(DefaultIoFilterChain.java:48)
08-02 17:23:38.344 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.sessionClosed(DefaultIoFilterChain.java:1078)
08-02 17:23:38.344 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: at org.apache.mina.core.filterchain.IoFilterAdapter.sessionClosed(IoFilterAdapter.java:97)
08-02 17:23:38.344 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextSessionClosed(DefaultIoFilterChain.java:597)
08-02 17:23:38.344 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$900(DefaultIoFilterChain.java:48)
08-02 17:23:38.344 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.sessionClosed(DefaultIoFilterChain.java:1078)
08-02 17:23:38.344 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: at org.apache.mina.core.filterchain.IoFilterAdapter.sessionClosed(IoFilterAdapter.java:97)
08-02 17:23:38.344 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextSessionClosed(DefaultIoFilterChain.java:597)
08-02 17:23:38.344 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: at org.apache.mina.core.filterchain.DefaultIoFilterChain.fireSessionClosed(DefaultIoFilterChain.java:590)
08-02 17:23:38.344 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: at org.apache.mina.core.service.IoServiceListenerSupport.fireSessionDestroyed(IoServiceListenerSupport.java:251)
08-02 17:23:38.344 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.removeNow(AbstractPollingIoProcessor.java:1160)
08-02 17:23:38.344 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.removeSessions(AbstractPollingIoProcessor.java:864)
08-02 17:23:38.344 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:694)
08-02 17:23:38.344 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64)
08-02 17:23:38.344 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
08-02 17:23:38.344 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
08-02 17:23:38.344 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: at java.lang.Thread.run(Thread.java:818)
08-02 17:23:38.344 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: Caused by: java.lang.ClassNotFoundException: Didn't find class "java.lang.management.ManagementFactory" on path: DexPathList[[zip file "/data/app/com.xxxxx.aaa.xxxxx-2/base.apk", zip file "/data/app/com.xxxxx.aaa.xxxxx-2/split_lib_dependencies_apk.apk", zip file "/data/app/com.xxxxx.aaa.xxxxx-2/split_lib_slice_0_apk.apk", zip file "/data/app/com.xxxxx.aaa.xxxxx-2/split_lib_slice_1_apk.apk", zip file "/data/app/com.xxxxx.aaa.xxxxx-2/split_lib_slice_2_apk.apk", zip file "/data/app/com.xxxxx.aaa.xxxxx-2/split_lib_slice_3_apk.apk", zip file "/data/app/com.xxxxx.aaa.xxxxx-2/split_lib_slice_4_apk.apk", zip file "/data/app/com.xxxxx.aaa.xxxxx-2/split_lib_slice_5_apk.apk", zip file "/data/app/com.xxxxx.aaa.xxxxx-2/split_lib_slice_6_apk.apk", zip file "/data/app/com.xxxxx.aaa.xxxxx-2/split_lib_slice_7_apk.apk", zip file "/data/app/com.xxxxx.aaa.xxxxx-2/split_lib_slice_8_apk.apk", zip file "/data/app/com.xxxxx.aaa.xxxxx-2/split_lib_slice_9_apk.apk"],nativeLibraryDirectories=[/data/app/com.xxxxx.aaa.xxxxx-2/lib/arm, /vendor/lib, /system/lib]]
08-02 17:23:38.344 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
08-02 17:23:38.344 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
08-02 17:23:38.344 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
08-02 17:23:38.344 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: ... 26 common frames omitted
08-02 17:23:38.344 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: Suppressed: java.lang.ClassNotFoundException: java.lang.management.ManagementFactory
08-02 17:23:38.344 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: at java.lang.Class.classForName(Native Method)
08-02 17:23:38.344 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
08-02 17:23:38.344 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
08-02 17:23:38.344 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
08-02 17:23:38.344 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: ... 27 common frames omitted
08-02 17:23:38.344 5800-5840/com.xxxxx.aaa.xxxxx I/System.out: Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available

it is written in kotlin as like below

@synchronized
fun start(publishName: String, publishMode: String,
params: Array?) {

rtmpClient = RTMPClient()

val defParams = rtmpClient.makeDefaultConnectionParams(
        host, port, app)

try {
 //   rtmpClient.connect(host, port, defParams, this, params);
    rtmpClient.connect(host, port, defParams, org.red5.server.api.service.IPendingServiceCallback {

        println("get result here kavi"+it.result)

        if ("connect" == it.serviceMethodName) {
            state = STREAM_CREATING
            rtmpClient.createStream {

                //returns null always here
                println("check the STREAM ID here" + it.result);
            }
        }


    }, params);
}

catch ( e:Exception)
{

    println(e)
}

// rtmpClient.connect(host, port, "oflaDemo")
}

Memory leak in red5-client

I've faced this issue when I was using red5-client v1.0.5-RELEASE so I've upgraded the red5-client to v1.0.9-RELEASE but still there is a memory leak.

Details:

Below is a description for the memory leak reason in red5-client v1.0.9-RELEASE, although there is a memory leak in v1.0.5-RELEASE but with different causes but will not talk about here.

connMap Map in org.red5.client.net.rtmp.RTMPConnManager causes this leakage. Connection will be put in the map when connection is created and removed when connection is closed. However, removeConnection method that handles removing connection from connMap never be reached.

/** {@inheritDoc} */
    @Override
    public RTMPConnection removeConnection(String sessionId) {
        log.debug("Removing connection with session id: {}", sessionId);
        if (log.isTraceEnabled()) {
            log.trace("Connections ({}) at pre-remove: {}", connMap.size(), connMap.values());
        }
        // remove from map
        RTMPConnection conn = connMap.remove(sessionId);
        if (conn != null) {
            log.trace("Connections: {}", conns.decrementAndGet());
            Red5.setConnectionLocal(null);
        }
        return conn;
    }

Because there is a condition in connectionClosed method from org.red5.server.net.rtmp.BaseRTMPHandler to invoke above removeConnection(String sessionId) and this condition will never be true.

/** {@inheritDoc} */
    public void connectionClosed(RTMPConnection conn) {
        log.debug("connectionClosed: {}", conn.getSessionId());
        if (conn.getStateCode() != RTMP.STATE_DISCONNECTED) {
            // inform any callbacks for pending calls that the connection is closed
            conn.sendPendingServiceCallsCloseError();
            // close the connection
            if (conn.getStateCode() != RTMP.STATE_DISCONNECTING) {
                conn.close();
            }
            // set as disconnected
            conn.setStateCode(RTMP.STATE_DISCONNECTED);
        }
        IoSession session = conn.getIoSession();
        // This is the condition I'm talking about>>
        if (session != null && session.containsAttribute(RTMPConnection.RTMP_CONN_MANAGER)) {
            // Unreachable code>>
            @SuppressWarnings("unchecked")
            IConnectionManager<RTMPConnection> connManager = (IConnectionManager<RTMPConnection>) ((WeakReference<?>) session.getAttribute(RTMPConnection.RTMP_CONN_MANAGER)).get();
            if (connManager != null) {
                connManager.removeConnection(conn.getSessionId());
            } else {
                log.debug("Connection manager was not found in the session");
            }
        }
        log.trace("connectionClosed: {}", conn);
    }

This session.getAttribute(RTMPConnection.RTMP_CONN_MANAGER) asks for an attribute with name rtmp.connection.manager to get the connectionManager instance but it doesn't exist because no one set this attribute!

I've looked at org.red5.server.net.rtmp.RTMPMinaIoHandler class, it's very similar to the one in the client but it sets the rtmp.connection.manager attribute with connectionManager instance when sessionOpened as below:

/** {@inheritDoc} */
    @Override
    public void sessionOpened(IoSession session) throws Exception {
        String sessionId = (String) session.getAttribute(RTMPConnection.RTMP_SESSION_ID);
        log.debug("Session opened: {} id: {}", session.getId(), sessionId);
        RTMPConnManager connManager = (RTMPConnManager) RTMPConnManager.getInstance();
        session.setAttribute(RTMPConnection.RTMP_CONN_MANAGER, new WeakReference<IConnectionManager<RTMPConnection>>(connManager));
        RTMPMinaConnection conn = (RTMPMinaConnection) connManager.getConnectionBySessionId(sessionId);
        handler.connectionOpened(conn);
    }

But org.red5.client.net.rtmp.RTMPMinaIoHandler doesn't and that what causes the issue:

/** {@inheritDoc} */
    @Override
    public void sessionOpened(IoSession session) throws Exception {
        log.debug("Session opened");
        super.sessionOpened(session);
        // get the handshake from the session
        RTMPHandshake handshake = (RTMPHandshake) session.getAttribute(RTMPConnection.RTMP_HANDSHAKE);
        // create and send C0+C1
        IoBuffer clientRequest1 = ((OutboundHandshake) handshake).generateClientRequest1();
        session.write(clientRequest1);
    }

Could you advice me if my conclusion is right and this is a really memory leak or there is something I misunderstood?
I've asked a question on stackOverflow with the same contents, you can find it here

Red5 Client - Rtmp stream to FLV

Hi @mondain ,

I had accomplished to run the ClientTest java file with a custom server host, port and stream name set in the PropertiesReader and the client was able to connect successfully.

I was wondering how I would be able to save the audio/video and aggregate messages into an FLV file from the stream. I am aware that Red5-io has the functionality to read and write FLV files however I do not know how to make ClientTest output to an FLV file.

Thank you.

ChunkSize Problem

### When client connected success to server and server reponses set Chunk Size 4096, then client invokes method "call" and data size is between 129 and 4095, the data won't send to server.

below is log info.
19:41:56.649 [NioProcessor-2] DEBUG o.r.c.net.rtmp.BaseRTMPClientHandler - invoke method: execute params [{cmd=SEND_MSG, param={uid=1111111, uname=SYSTEM, tuid=2222222, content={"uid":1111111,"uname":"System","type":0,"content":"%3CTextFlow+xmlns%3D%22http%3A%2F%2Fns.adobe.com%2FtextLayout%2F2008%22+version%3D%223.0.0%22+whitespacecollapse%3D%22preserve%22+paddingtop%3D%225%22%3E%3Cp+fontSize%3D%2214%22+fontFamily%3D%22%E5%AE%8B%E4%BD%93%22+color%3D%22%23000000%22%3E%3Cspan+fontSize%3D%2214%22+fontFamily%3D%22%E5%AE%8B%E4%BD%93%22+color%3D%22%23000000%22%3E%E5%93%88%E5%93%88+%E6%B5%8B%E8%AF%95%3C%2Fspan%3E%3C%2Fp%3E%3C%2FTextFlow%3E","ts":"2020-02-28 18:00:00"}, type=0}}] callback cn.compass.App$1@52ee888
19:41:56.650 [NioProcessor-2] TRACE org.red5.server.net.rtmp.Channel - write to stream id: 0 channel: 3
19:41:56.650 [NioProcessor-2] TRACE o.r.server.net.rtmp.message.Packet - Header: empty event: Invoke #2: Service: null Method: execute Num Params: 1 0: {cmd=SEND_MSG, param={uid=1111111, uname=SYSTEM, tuid=2222222, content={"uid":1111111,"uname":"System","type":0,"content":"%3CTextFlow+xmlns%3D%22http%3A%2F%2Fns.adobe.com%2FtextLayout%2F2008%22+version%3D%223.0.0%22+whitespacecollapse%3D%22preserve%22+paddingtop%3D%225%22%3E%3Cp+fontSize%3D%2214%22+fontFamily%3D%22%E5%AE%8B%E4%BD%93%22+color%3D%22%23000000%22%3E%3Cspan+fontSize%3D%2214%22+fontFamily%3D%22%E5%AE%8B%E4%BD%93%22+color%3D%22%23000000%22%3E%E5%93%88%E5%93%88+%E6%B5%8B%E8%AF%95%3C%2Fspan%3E%3C%2Fp%3E%3C%2FTextFlow%3E","ts":"2020-02-28 18:00:00"}, type=0}}
19:41:56.650 [NioProcessor-2] TRACE o.r.s.net.rtmp.RTMPMinaConnection - Write lock wait count: 0 closed: false
19:41:56.650 [NioProcessor-2] TRACE o.r.s.net.rtmp.RTMPMinaConnection - Writing message
19:41:56.650 [NioProcessor-2] TRACE o.r.s.n.r.c.RTMPMinaProtocolEncoder - Session id: 5NYKUYF7EFHZN
19:41:56.650 [NioProcessor-2] DEBUG o.r.client.net.rtmp.RTMPConnManager - Getting connection by session id: 5NYKUYF7EFHZN
19:41:56.650 [NioProcessor-2] DEBUG org.red5.server.api.Red5 - Set connection: 5NYKUYF7EFHZN with thread: NioProcessor-2
19:41:56.651 [NioProcessor-2] DEBUG org.red5.server.api.Red5 - Caller: org.red5.client.net.rtmp.codec.RTMPMinaCodecFactory$2.encode #83
19:41:56.651 [NioProcessor-2] TRACE o.r.c.n.r.c.RTMPClientProtocolEncoder - Not dropping due to flag, source type: 0 (0=vod,1=live)
19:41:56.651 [NioProcessor-2] TRACE o.r.c.n.r.c.RTMPClientProtocolEncoder - Invoke Invoke #2: Service: null Method: execute Num Params: 1 0: {cmd=SEND_MSG, param={uid=1111111, uname=SYSTEM, tuid=2222222, content={"uid":1111111,"uname":"System","type":0,"content":"%3CTextFlow+xmlns%3D%22http%3A%2F%2Fns.adobe.com%2FtextLayout%2F2008%22+version%3D%223.0.0%22+whitespacecollapse%3D%22preserve%22+paddingtop%3D%225%22%3E%3Cp+fontSize%3D%2214%22+fontFamily%3D%22%E5%AE%8B%E4%BD%93%22+color%3D%22%23000000%22%3E%3Cspan+fontSize%3D%2214%22+fontFamily%3D%22%E5%AE%8B%E4%BD%93%22+color%3D%22%23000000%22%3E%E5%93%88%E5%93%88+%E6%B5%8B%E8%AF%95%3C%2Fspan%3E%3C%2Fp%3E%3C%2FTextFlow%3E","ts":"2020-02-28 18:00:00"}, type=0}}
19:41:56.651 [NioProcessor-2] DEBUG o.r.c.n.r.c.RTMPClientProtocolEncoder - Service: null Method: execute Num Params: 1 0: {cmd=SEND_MSG, param={uid=1111111, uname=SYSTEM, tuid=2222222, content={"uid":1111111,"uname":"System","type":0,"content":"%3CTextFlow+xmlns%3D%22http%3A%2F%2Fns.adobe.com%2FtextLayout%2F2008%22+version%3D%223.0.0%22+whitespacecollapse%3D%22preserve%22+paddingtop%3D%225%22%3E%3Cp+fontSize%3D%2214%22+fontFamily%3D%22%E5%AE%8B%E4%BD%93%22+color%3D%22%23000000%22%3E%3Cspan+fontSize%3D%2214%22+fontFamily%3D%22%E5%AE%8B%E4%BD%93%22+color%3D%22%23000000%22%3E%E5%93%88%E5%93%88+%E6%B5%8B%E8%AF%95%3C%2Fspan%3E%3C%2Fp%3E%3C%2FTextFlow%3E","ts":"2020-02-28 18:00:00"}, type=0}}
19:41:56.651 [NioProcessor-2] DEBUG o.r.c.n.r.c.RTMPClientProtocolEncoder - encodeCommand - command: Invoke #2: Service: null Method: execute Num Params: 1 0: {cmd=SEND_MSG, param={uid=1111111, uname=SYSTEM, tuid=2222222, content={"uid":1111111,"uname":"System","type":0,"content":"%3CTextFlow+xmlns%3D%22http%3A%2F%2Fns.adobe.com%2FtextLayout%2F2008%22+version%3D%223.0.0%22+whitespacecollapse%3D%22preserve%22+paddingtop%3D%225%22%3E%3Cp+fontSize%3D%2214%22+fontFamily%3D%22%E5%AE%8B%E4%BD%93%22+color%3D%22%23000000%22%3E%3Cspan+fontSize%3D%2214%22+fontFamily%3D%22%E5%AE%8B%E4%BD%93%22+color%3D%22%23000000%22%3E%E5%93%88%E5%93%88+%E6%B5%8B%E8%AF%95%3C%2Fspan%3E%3C%2Fp%3E%3C%2FTextFlow%3E","ts":"2020-02-28 18:00:00"}, type=0}}
19:41:56.651 [NioProcessor-2] DEBUG org.red5.server.api.Red5 - Get connection: 5NYKUYF7EFHZN on thread: NioProcessor-2
19:41:56.651 [NioProcessor-2] DEBUG o.r.c.n.r.c.RTMPClientProtocolEncoder - Call: Service: null Method: execute Num Params: 1 0: {cmd=SEND_MSG, param={uid=1111111, uname=SYSTEM, tuid=2222222, content={"uid":1111111,"uname":"System","type":0,"content":"%3CTextFlow+xmlns%3D%22http%3A%2F%2Fns.adobe.com%2FtextLayout%2F2008%22+version%3D%223.0.0%22+whitespacecollapse%3D%22preserve%22+paddingtop%3D%225%22%3E%3Cp+fontSize%3D%2214%22+fontFamily%3D%22%E5%AE%8B%E4%BD%93%22+color%3D%22%23000000%22%3E%3Cspan+fontSize%3D%2214%22+fontFamily%3D%22%E5%AE%8B%E4%BD%93%22+color%3D%22%23000000%22%3E%E5%93%88%E5%93%88+%E6%B5%8B%E8%AF%95%3C%2Fspan%3E%3C%2Fp%3E%3C%2FTextFlow%3E","ts":"2020-02-28 18:00:00"}, type=0}} pending: true
19:41:56.651 [NioProcessor-2] DEBUG o.r.c.n.r.c.RTMPClientProtocolEncoder - This is a pending call, send request
19:41:56.651 [NioProcessor-2] TRACE org.red5.io.object.Serializer - serialize
19:41:56.651 [NioProcessor-2] TRACE org.red5.io.object.Serializer - Wrote as basic
19:41:56.652 [NioProcessor-2] TRACE org.red5.io.object.Serializer - serialize
19:41:56.652 [NioProcessor-2] TRACE org.red5.io.object.Serializer - Wrote as basic
19:41:56.652 [NioProcessor-2] TRACE org.red5.io.object.Serializer - serialize
19:41:56.652 [NioProcessor-2] TRACE org.red5.io.object.Serializer - Wrote as basic
19:41:56.652 [NioProcessor-2] DEBUG o.r.c.n.r.c.RTMPClientProtocolEncoder - Writing params
19:41:56.652 [NioProcessor-2] TRACE org.red5.io.object.Serializer - serialize
19:41:56.652 [NioProcessor-2] TRACE org.red5.io.object.Serializer - writeComplex
19:41:56.652 [NioProcessor-2] TRACE org.red5.io.object.Serializer - writeListType
19:41:56.652 [NioProcessor-2] TRACE org.red5.io.object.Serializer - writeArrayType
19:41:56.652 [NioProcessor-2] TRACE org.red5.io.object.Serializer - writeXMLType
19:41:56.652 [NioProcessor-2] TRACE org.red5.io.object.Serializer - serialize
19:41:56.652 [NioProcessor-2] TRACE org.red5.io.object.Serializer - Wrote as basic
19:41:56.652 [NioProcessor-2] TRACE org.red5.io.object.Serializer - serialize
19:41:56.652 [NioProcessor-2] TRACE org.red5.io.object.Serializer - writeComplex
19:41:56.652 [NioProcessor-2] TRACE org.red5.io.object.Serializer - writeListType
19:41:56.652 [NioProcessor-2] TRACE org.red5.io.object.Serializer - writeArrayType
19:41:56.652 [NioProcessor-2] TRACE org.red5.io.object.Serializer - writeXMLType
19:41:56.652 [NioProcessor-2] TRACE org.red5.io.object.Serializer - serialize
19:41:56.652 [NioProcessor-2] TRACE org.red5.io.object.Serializer - Wrote as basic
19:41:56.653 [NioProcessor-2] TRACE org.red5.io.object.Serializer - serialize
19:41:56.653 [NioProcessor-2] TRACE org.red5.io.object.Serializer - Wrote as basic
19:41:56.653 [NioProcessor-2] TRACE org.red5.io.object.Serializer - serialize
19:41:56.653 [NioProcessor-2] TRACE org.red5.io.object.Serializer - Wrote as basic
19:41:56.653 [NioProcessor-2] TRACE org.red5.io.object.Serializer - serialize
19:41:56.653 [NioProcessor-2] TRACE org.red5.io.object.Serializer - Wrote as basic
19:41:56.653 [NioProcessor-2] TRACE org.red5.io.object.Serializer - serialize
19:41:56.654 [NioProcessor-2] TRACE org.red5.io.object.Serializer - Wrote as basic
19:41:56.654 [NioProcessor-2] DEBUG org.red5.server.api.Red5 - Get connection: 5NYKUYF7EFHZN on thread: NioProcessor-2
19:41:56.654 [NioProcessor-2] TRACE o.r.c.n.r.c.RTMPClientProtocolEncoder - Channel id: 3 chunkSize: 4096
19:41:56.654 [NioProcessor-2] TRACE o.r.c.n.r.c.RTMPClientProtocolEncoder - HEADER_SAME_SOURCE lastHeader: Header [streamId=0, channelId=3, dataType=20, timerBase=0, timerDelta=0, size=395, extended=false]
19:41:56.654 [NioProcessor-2] TRACE o.r.c.n.r.c.RTMPClientProtocolEncoder - Encoded chunk HEADER_SAME_SOURCE Header [streamId=0, channelId=3, dataType=20, timerBase=0, timerDelta=0, size=615, extended=false]
19:41:56.654 [NioProcessor-2] TRACE o.r.s.n.r.c.RTMPMinaProtocolEncoder - Writing output data: 43000000000267140200076578656375746500400000000000000005030003636d6402000853454e445f4d53470005706172616d03000375696400413e9618000000000005756e616d6502000653595354454d00047475696400413e9acc000000000007636f6e74656e740201ec7b22756964223a323030343530342c22756e616d65223a2253797374656d222c2274797065223a302c22636f6e74656e74223a2225334354657874466c6f772b786d6c6e73253344253232687474702533412532462532466e732e61646f62652e636f6d253246746578744c61796f7574253246323030382532322b76657273696f6e253344253232332e302e302532322b77686974657370616365636f6c6c6170736525334425323270726573657276652532322b70616464696e67746f7025334425323235253232253345253343702b666f6e7453697a6525334425323231342532322b666f6e7446616d696c792533442532322545352541452538422545342542442539332532322b636f6c6f722533442532322532333030303030302532322533452533437370616e2b666f6e7453697a6525334425323231342532322b666f6e7446616d696c792533442532322545352541452538422545342542442539332532322b636f6c6f722533442532322532333030303030302532322533452545352539332538382545352539332538382b2545362542352538422545382541462539352533432532467370616e2533452533432532467025334525334325324654657874466c6f77253345222c227473223a22323032302d30322d32382031383a30303a3030227d0004747970650000000000000000000000090000090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
19:41:56.654 [NioProcessor-2] DEBUG org.red5.server.api.Red5 - Set connection: null with thread: NioProcessor-2
19:41:56.654 [NioProcessor-2] DEBUG org.red5.server.api.Red5 - Caller: org.red5.client.net.rtmp.codec.RTMPMinaCodecFactory$2.encode #102
19:41:56.654 [NioProcessor-2] DEBUG o.r.client.net.rtmp.RTMPConnManager - Getting connection by session id: 5NYKUYF7EFHZN
19:41:56.654 [NioProcessor-2] TRACE o.r.client.net.rtmpe.RTMPEIoFilter - Non-encrypted message
19:41:56.654 [NioProcessor-2] DEBUG o.r.client.net.rtmp.RTMPConnManager - Getting connection by session id: 5NYKUYF7EFHZN
19:41:56.654 [NioProcessor-2] TRACE o.r.client.net.rtmpe.RTMPEIoFilter - Non-encrypted message
19:41:56.654 [NioProcessor-2] DEBUG org.red5.server.api.Red5 - Set connection: null with thread: NioProcessor-2
19:41:56.655 [NioProcessor-2] DEBUG org.red5.server.api.Red5 - Caller: org.red5.client.net.rtmp.RTMPMinaIoHandler.messageReceived #127
19:41:56.655 [NioProcessor-2] DEBUG o.r.c.net.rtmp.RTMPMinaIoHandler - messageSent
19:41:56.655 [NioProcessor-2] TRACE o.r.c.net.rtmp.RTMPMinaIoHandler - Session id: 5NYKUYF7EFHZN
19:41:56.655 [NioProcessor-2] DEBUG o.r.client.net.rtmp.RTMPConnManager - Getting connection by session id: 5NYKUYF7EFHZN
19:41:56.655 [NioProcessor-2] TRACE o.r.server.net.rtmp.BaseRTMPHandler - Message sent

if add two line codes before invoking method like below:

RTMP rtmp = ((RTMPConnection) Red5.getConnectionLocal()).getState();
rtmp.setWriteChunkSize(128);

it will success

19:46:53.874 [NioProcessor-2] DEBUG o.r.c.net.rtmp.BaseRTMPClientHandler - invoke method: execute params [{cmd=SEND_MSG, param={uid=1111111, uname=SYSTEM, tuid=2222222, content={"uid":1111111,"uname":"System","type":0,"content":"%3CTextFlow+xmlns%3D%22http%3A%2F%2Fns.adobe.com%2FtextLayout%2F2008%22+version%3D%223.0.0%22+whitespacecollapse%3D%22preserve%22+paddingtop%3D%225%22%3E%3Cp+fontSize%3D%2214%22+fontFamily%3D%22%E5%AE%8B%E4%BD%93%22+color%3D%22%23000000%22%3E%3Cspan+fontSize%3D%2214%22+fontFamily%3D%22%E5%AE%8B%E4%BD%93%22+color%3D%22%23000000%22%3E%E5%93%88%E5%93%88+%E6%B5%8B%E8%AF%95%3C%2Fspan%3E%3C%2Fp%3E%3C%2FTextFlow%3E","ts":"2020-02-28 18:00:00"}, type=0}}] callback cn.compass.App$1@500538e6
19:46:53.874 [NioProcessor-2] TRACE org.red5.server.net.rtmp.Channel - write to stream id: 0 channel: 3
19:46:53.874 [NioProcessor-2] TRACE o.r.server.net.rtmp.message.Packet - Header: empty event: Invoke #2: Service: null Method: execute Num Params: 1 0: {cmd=SEND_MSG, param={uid=1111111, uname=SYSTEM, tuid=2222222, content={"uid":1111111,"uname":"System","type":0,"content":"%3CTextFlow+xmlns%3D%22http%3A%2F%2Fns.adobe.com%2FtextLayout%2F2008%22+version%3D%223.0.0%22+whitespacecollapse%3D%22preserve%22+paddingtop%3D%225%22%3E%3Cp+fontSize%3D%2214%22+fontFamily%3D%22%E5%AE%8B%E4%BD%93%22+color%3D%22%23000000%22%3E%3Cspan+fontSize%3D%2214%22+fontFamily%3D%22%E5%AE%8B%E4%BD%93%22+color%3D%22%23000000%22%3E%E5%93%88%E5%93%88+%E6%B5%8B%E8%AF%95%3C%2Fspan%3E%3C%2Fp%3E%3C%2FTextFlow%3E","ts":"2020-02-28 18:00:00"}, type=0}}
19:46:53.876 [NioProcessor-2] TRACE o.r.s.net.rtmp.RTMPMinaConnection - Write lock wait count: 0 closed: false
19:46:53.876 [NioProcessor-2] TRACE o.r.s.net.rtmp.RTMPMinaConnection - Writing message
19:46:53.876 [NioProcessor-2] TRACE o.r.s.n.r.c.RTMPMinaProtocolEncoder - Session id: OJJ0LHPV93USW
19:46:53.876 [NioProcessor-2] DEBUG o.r.client.net.rtmp.RTMPConnManager - Getting connection by session id: OJJ0LHPV93USW
19:46:53.876 [NioProcessor-2] DEBUG org.red5.server.api.Red5 - Set connection: OJJ0LHPV93USW with thread: NioProcessor-2
19:46:53.876 [NioProcessor-2] DEBUG org.red5.server.api.Red5 - Caller: org.red5.client.net.rtmp.codec.RTMPMinaCodecFactory$2.encode #83
19:46:53.877 [NioProcessor-2] TRACE o.r.c.n.r.c.RTMPClientProtocolEncoder - Not dropping due to flag, source type: 0 (0=vod,1=live)
19:46:53.877 [NioProcessor-2] TRACE o.r.c.n.r.c.RTMPClientProtocolEncoder - Invoke Invoke #2: Service: null Method: execute Num Params: 1 0: {cmd=SEND_MSG, param={uid=1111111, uname=SYSTEM, tuid=2222222, content={"uid":1111111,"uname":"System","type":0,"content":"%3CTextFlow+xmlns%3D%22http%3A%2F%2Fns.adobe.com%2FtextLayout%2F2008%22+version%3D%223.0.0%22+whitespacecollapse%3D%22preserve%22+paddingtop%3D%225%22%3E%3Cp+fontSize%3D%2214%22+fontFamily%3D%22%E5%AE%8B%E4%BD%93%22+color%3D%22%23000000%22%3E%3Cspan+fontSize%3D%2214%22+fontFamily%3D%22%E5%AE%8B%E4%BD%93%22+color%3D%22%23000000%22%3E%E5%93%88%E5%93%88+%E6%B5%8B%E8%AF%95%3C%2Fspan%3E%3C%2Fp%3E%3C%2FTextFlow%3E","ts":"2020-02-28 18:00:00"}, type=0}}
19:46:53.877 [NioProcessor-2] DEBUG o.r.c.n.r.c.RTMPClientProtocolEncoder - Service: null Method: execute Num Params: 1 0: {cmd=SEND_MSG, param={uid=1111111, uname=SYSTEM, tuid=2222222, content={"uid":1111111,"uname":"System","type":0,"content":"%3CTextFlow+xmlns%3D%22http%3A%2F%2Fns.adobe.com%2FtextLayout%2F2008%22+version%3D%223.0.0%22+whitespacecollapse%3D%22preserve%22+paddingtop%3D%225%22%3E%3Cp+fontSize%3D%2214%22+fontFamily%3D%22%E5%AE%8B%E4%BD%93%22+color%3D%22%23000000%22%3E%3Cspan+fontSize%3D%2214%22+fontFamily%3D%22%E5%AE%8B%E4%BD%93%22+color%3D%22%23000000%22%3E%E5%93%88%E5%93%88+%E6%B5%8B%E8%AF%95%3C%2Fspan%3E%3C%2Fp%3E%3C%2FTextFlow%3E","ts":"2020-02-28 18:00:00"}, type=0}}
19:46:53.877 [NioProcessor-2] DEBUG o.r.c.n.r.c.RTMPClientProtocolEncoder - encodeCommand - command: Invoke #2: Service: null Method: execute Num Params: 1 0: {cmd=SEND_MSG, param={uid=1111111, uname=SYSTEM, tuid=2222222, content={"uid":1111111,"uname":"System","type":0,"content":"%3CTextFlow+xmlns%3D%22http%3A%2F%2Fns.adobe.com%2FtextLayout%2F2008%22+version%3D%223.0.0%22+whitespacecollapse%3D%22preserve%22+paddingtop%3D%225%22%3E%3Cp+fontSize%3D%2214%22+fontFamily%3D%22%E5%AE%8B%E4%BD%93%22+color%3D%22%23000000%22%3E%3Cspan+fontSize%3D%2214%22+fontFamily%3D%22%E5%AE%8B%E4%BD%93%22+color%3D%22%23000000%22%3E%E5%93%88%E5%93%88+%E6%B5%8B%E8%AF%95%3C%2Fspan%3E%3C%2Fp%3E%3C%2FTextFlow%3E","ts":"2020-02-28 18:00:00"}, type=0}}
19:46:53.877 [NioProcessor-2] DEBUG org.red5.server.api.Red5 - Get connection: OJJ0LHPV93USW on thread: NioProcessor-2
19:46:53.877 [NioProcessor-2] DEBUG o.r.c.n.r.c.RTMPClientProtocolEncoder - Call: Service: null Method: execute Num Params: 1 0: {cmd=SEND_MSG, param={uid=1111111, uname=SYSTEM, tuid=2222222, content={"uid":1111111,"uname":"System","type":0,"content":"%3CTextFlow+xmlns%3D%22http%3A%2F%2Fns.adobe.com%2FtextLayout%2F2008%22+version%3D%223.0.0%22+whitespacecollapse%3D%22preserve%22+paddingtop%3D%225%22%3E%3Cp+fontSize%3D%2214%22+fontFamily%3D%22%E5%AE%8B%E4%BD%93%22+color%3D%22%23000000%22%3E%3Cspan+fontSize%3D%2214%22+fontFamily%3D%22%E5%AE%8B%E4%BD%93%22+color%3D%22%23000000%22%3E%E5%93%88%E5%93%88+%E6%B5%8B%E8%AF%95%3C%2Fspan%3E%3C%2Fp%3E%3C%2FTextFlow%3E","ts":"2020-02-28 18:00:00"}, type=0}} pending: true
19:46:53.877 [NioProcessor-2] DEBUG o.r.c.n.r.c.RTMPClientProtocolEncoder - This is a pending call, send request
19:46:53.877 [NioProcessor-2] TRACE org.red5.io.object.Serializer - serialize
19:46:53.877 [NioProcessor-2] TRACE org.red5.io.object.Serializer - Wrote as basic
19:46:53.877 [NioProcessor-2] TRACE org.red5.io.object.Serializer - serialize
19:46:53.877 [NioProcessor-2] TRACE org.red5.io.object.Serializer - Wrote as basic
19:46:53.877 [NioProcessor-2] TRACE org.red5.io.object.Serializer - serialize
19:46:53.877 [NioProcessor-2] TRACE org.red5.io.object.Serializer - Wrote as basic
19:46:53.878 [NioProcessor-2] DEBUG o.r.c.n.r.c.RTMPClientProtocolEncoder - Writing params
19:46:53.878 [NioProcessor-2] TRACE org.red5.io.object.Serializer - serialize
19:46:53.878 [NioProcessor-2] TRACE org.red5.io.object.Serializer - writeComplex
19:46:53.878 [NioProcessor-2] TRACE org.red5.io.object.Serializer - writeListType
19:46:53.878 [NioProcessor-2] TRACE org.red5.io.object.Serializer - writeArrayType
19:46:53.878 [NioProcessor-2] TRACE org.red5.io.object.Serializer - writeXMLType
19:46:53.878 [NioProcessor-2] TRACE org.red5.io.object.Serializer - serialize
19:46:53.878 [NioProcessor-2] TRACE org.red5.io.object.Serializer - Wrote as basic
19:46:53.878 [NioProcessor-2] TRACE org.red5.io.object.Serializer - serialize
19:46:53.878 [NioProcessor-2] TRACE org.red5.io.object.Serializer - writeComplex
19:46:53.878 [NioProcessor-2] TRACE org.red5.io.object.Serializer - writeListType
19:46:53.878 [NioProcessor-2] TRACE org.red5.io.object.Serializer - writeArrayType
19:46:53.878 [NioProcessor-2] TRACE org.red5.io.object.Serializer - writeXMLType
19:46:53.878 [NioProcessor-2] TRACE org.red5.io.object.Serializer - serialize
19:46:53.878 [NioProcessor-2] TRACE org.red5.io.object.Serializer - Wrote as basic
19:46:53.878 [NioProcessor-2] TRACE org.red5.io.object.Serializer - serialize
19:46:53.878 [NioProcessor-2] TRACE org.red5.io.object.Serializer - Wrote as basic
19:46:53.879 [NioProcessor-2] TRACE org.red5.io.object.Serializer - serialize
19:46:53.879 [NioProcessor-2] TRACE org.red5.io.object.Serializer - Wrote as basic
19:46:53.879 [NioProcessor-2] TRACE org.red5.io.object.Serializer - serialize
19:46:53.879 [NioProcessor-2] TRACE org.red5.io.object.Serializer - Wrote as basic
19:46:53.879 [NioProcessor-2] TRACE org.red5.io.object.Serializer - serialize
19:46:53.879 [NioProcessor-2] TRACE org.red5.io.object.Serializer - Wrote as basic
19:46:53.879 [NioProcessor-2] DEBUG org.red5.server.api.Red5 - Get connection: OJJ0LHPV93USW on thread: NioProcessor-2
19:46:53.879 [NioProcessor-2] TRACE o.r.c.n.r.c.RTMPClientProtocolEncoder - Channel id: 3 chunkSize: 128
19:46:53.879 [NioProcessor-2] TRACE o.r.c.n.r.c.RTMPClientProtocolEncoder - HEADER_SAME_SOURCE lastHeader: Header [streamId=0, channelId=3, dataType=20, timerBase=0, timerDelta=0, size=395, extended=false]
19:46:53.879 [NioProcessor-2] TRACE o.r.c.n.r.c.RTMPClientProtocolEncoder - Encoded chunk HEADER_SAME_SOURCE Header [streamId=0, channelId=3, dataType=20, timerBase=0, timerDelta=0, size=615, extended=false]
19:46:53.879 [NioProcessor-2] TRACE o.r.c.n.r.c.RTMPClientProtocolEncoder - HEADER_CONTINUE lastHeader: Header [streamId=0, channelId=3, dataType=20, timerBase=0, timerDelta=0, size=615, extended=false]
19:46:53.879 [NioProcessor-2] TRACE o.r.c.n.r.c.RTMPClientProtocolEncoder - Encoded chunk HEADER_CONTINUE Header [streamId=0, channelId=3, dataType=20, timerBase=0, timerDelta=0, size=615, extended=false]
19:46:53.880 [NioProcessor-2] TRACE o.r.c.n.r.c.RTMPClientProtocolEncoder - HEADER_CONTINUE lastHeader: Header [streamId=0, channelId=3, dataType=20, timerBase=0, timerDelta=0, size=615, extended=false]
19:46:53.880 [NioProcessor-2] TRACE o.r.c.n.r.c.RTMPClientProtocolEncoder - Encoded chunk HEADER_CONTINUE Header [streamId=0, channelId=3, dataType=20, timerBase=0, timerDelta=0, size=615, extended=false]
19:46:53.880 [NioProcessor-2] TRACE o.r.c.n.r.c.RTMPClientProtocolEncoder - HEADER_CONTINUE lastHeader: Header [streamId=0, channelId=3, dataType=20, timerBase=0, timerDelta=0, size=615, extended=false]
19:46:53.880 [NioProcessor-2] TRACE o.r.c.n.r.c.RTMPClientProtocolEncoder - Encoded chunk HEADER_CONTINUE Header [streamId=0, channelId=3, dataType=20, timerBase=0, timerDelta=0, size=615, extended=false]
19:46:53.880 [NioProcessor-2] TRACE o.r.c.n.r.c.RTMPClientProtocolEncoder - HEADER_CONTINUE lastHeader: Header [streamId=0, channelId=3, dataType=20, timerBase=0, timerDelta=0, size=615, extended=false]
19:46:53.880 [NioProcessor-2] TRACE o.r.c.n.r.c.RTMPClientProtocolEncoder - Encoded chunk HEADER_CONTINUE Header [streamId=0, channelId=3, dataType=20, timerBase=0, timerDelta=0, size=615, extended=false]
19:46:53.880 [NioProcessor-2] TRACE o.r.s.n.r.c.RTMPMinaProtocolEncoder - Writing output data: 43000000000267140200076578656375746500400000000000000005030003636d6402000853454e445f4d53470005706172616d03000375696400413e9618000000000005756e616d6502000653595354454d00047475696400413e9acc000000000007636f6e74656e740201ec7b22756964223a323030343530342c22756e616d65223a225379c37374656d222c2274797065223a302c22636f6e74656e74223a2225334354657874466c6f772b786d6c6e73253344253232687474702533412532462532466e732e61646f62652e636f6d253246746578744c61796f7574253246323030382532322b76657273696f6e253344253232332e302e302532322b7768697465737061c36365636f6c6c6170736525334425323270726573657276652532322b70616464696e67746f7025334425323235253232253345253343702b666f6e7453697a6525334425323231342532322b666f6e7446616d696c792533442532322545352541452538422545342542442539332532322b636f6c6f72253344253232253233c33030303030302532322533452533437370616e2b666f6e7453697a6525334425323231342532322b666f6e7446616d696c792533442532322545352541452538422545342542442539332532322b636f6c6f722533442532322532333030303030302532322533452545352539332538382545352539332538382b2545362542c3352538422545382541462539352533432532467370616e2533452533432532467025334525334325324654657874466c6f77253345222c227473223a22323032302d30322d32382031383a30303a3030227d00047479706500000000000000000000000900000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
19:46:53.880 [NioProcessor-2] DEBUG org.red5.server.api.Red5 - Set connection: null with thread: NioProcessor-2
19:46:53.880 [NioProcessor-2] DEBUG org.red5.server.api.Red5 - Caller: org.red5.client.net.rtmp.codec.RTMPMinaCodecFactory$2.encode #102
19:46:53.880 [NioProcessor-2] DEBUG o.r.client.net.rtmp.RTMPConnManager - Getting connection by session id: OJJ0LHPV93USW
19:46:53.880 [NioProcessor-2] TRACE o.r.client.net.rtmpe.RTMPEIoFilter - Non-encrypted message
19:46:53.881 [NioProcessor-2] DEBUG o.r.client.net.rtmp.RTMPConnManager - Getting connection by session id: OJJ0LHPV93USW
19:46:53.881 [NioProcessor-2] TRACE o.r.client.net.rtmpe.RTMPEIoFilter - Non-encrypted message
19:46:53.881 [NioProcessor-2] DEBUG org.red5.server.api.Red5 - Set connection: null with thread: NioProcessor-2
19:46:53.881 [NioProcessor-2] DEBUG org.red5.server.api.Red5 - Caller: org.red5.client.net.rtmp.RTMPMinaIoHandler.messageReceived #127
19:46:53.881 [NioProcessor-2] DEBUG o.r.c.net.rtmp.RTMPMinaIoHandler - messageSent
19:46:53.881 [NioProcessor-2] TRACE o.r.c.net.rtmp.RTMPMinaIoHandler - Session id: OJJ0LHPV93USW
19:46:53.881 [NioProcessor-2] DEBUG o.r.client.net.rtmp.RTMPConnManager - Getting connection by session id: OJJ0LHPV93USW
19:46:53.881 [NioProcessor-2] TRACE o.r.server.net.rtmp.BaseRTMPHandler - Message sent
19:46:53.885 [NioProcessor-2] TRACE o.r.client.net.rtmpe.RTMPEIoFilter - Session id: OJJ0LHPV93USW
19:46:53.885 [NioProcessor-2] DEBUG o.r.client.net.rtmp.RTMPConnManager - Getting connection by session id: OJJ0LHPV93USW
19:46:53.885 [NioProcessor-2] TRACE o.r.client.net.rtmpe.RTMPEIoFilter - Bytes read: 3410 written: 4110
19:46:53.885 [NioProcessor-2] TRACE o.r.client.net.rtmpe.RTMPEIoFilter - Not decrypting message: HeapBuffer[pos=0 lim=34 cap=2048: 03 00 00 00 00 00 16 14 00 00 00 00 02 00 07 5F 72 65 73 75 6C 74 00 40 00 00 00 00 00 00 00 05 01 01...]
19:46:53.885 [NioProcessor-2] DEBUG o.a.m.f.codec.ProtocolCodecFilter - Processing a MESSAGE_RECEIVED for session 1
19:46:53.885 [NioProcessor-2] TRACE o.r.s.n.r.c.RTMPMinaProtocolDecoder - decode buffer position: 0
19:46:53.885 [NioProcessor-2] TRACE o.r.s.n.r.c.RTMPMinaProtocolDecoder - Session id: OJJ0LHPV93USW
19:46:53.885 [NioProcessor-2] DEBUG o.r.client.net.rtmp.RTMPConnManager - Getting connection by session id: OJJ0LHPV93USW
19:46:53.885 [NioProcessor-2] DEBUG org.red5.server.api.Red5 - Set connection: OJJ0LHPV93USW with thread: NioProcessor-2
19:46:53.885 [NioProcessor-2] DEBUG org.red5.server.api.Red5 - Caller: org.red5.client.net.rtmp.codec.RTMPMinaCodecFactory$1.decode #37
19:46:53.885 [NioProcessor-2] TRACE o.r.s.net.rtmp.message.ChunkHeader - CHUNK header byte 03, count 1, header 0, channel 3
19:46:53.885 [NioProcessor-2] TRACE o.r.s.n.r.codec.RTMPProtocolDecoder - HEADER_NEW lastHeader: Header [streamId=0, channelId=3, dataType=20, timerBase=0, timerDelta=0, size=242, extended=false]
19:46:53.885 [NioProcessor-2] TRACE o.r.s.n.r.codec.RTMPProtocolDecoder - Decoded chunk HEADER_NEW Header [streamId=0, channelId=3, dataType=20, timerBase=0, timerDelta=0, size=22, extended=false]
19:46:53.886 [NioProcessor-2] TRACE o.r.server.net.rtmp.message.Packet - Header: Header [streamId=0, channelId=3, dataType=20, timerBase=0, timerDelta=0, size=22, extended=false]
19:46:53.886 [NioProcessor-2] TRACE org.red5.io.amf.Input - Input: 0200075f726573756c74004000000000000000050101
19:46:53.886 [NioProcessor-2] TRACE org.red5.io.amf.Input - Data type: 2
19:46:53.886 [NioProcessor-2] TRACE org.red5.io.object.Deserializer - Type: 4 target: class java.lang.String
19:46:53.886 [NioProcessor-2] TRACE org.red5.io.amf.Input - Std string type
19:46:53.886 [NioProcessor-2] DEBUG org.red5.io.amf.Input - Length: 7 limit: 22
19:46:53.886 [NioProcessor-2] DEBUG org.red5.io.amf.Input - String: _result
19:46:53.886 [NioProcessor-2] TRACE o.r.s.n.r.codec.RTMPProtocolDecoder - Action: _result
19:46:53.886 [NioProcessor-2] TRACE org.red5.io.amf.Input - Data type: 0
19:46:53.886 [NioProcessor-2] TRACE org.red5.io.object.Deserializer - Type: 3 target: class java.lang.Number
19:46:53.886 [NioProcessor-2] DEBUG org.red5.io.amf.Input - readNumber from 11 bytes
19:46:53.886 [NioProcessor-2] DEBUG org.red5.io.amf.Input - Number: 2.0
19:46:53.886 [NioProcessor-2] TRACE org.red5.io.amf.Input - Data type: 5
19:46:53.886 [NioProcessor-2] TRACE org.red5.io.object.Deserializer - Type: 1 target: class java.lang.Object
19:46:53.886 [NioProcessor-2] TRACE org.red5.io.amf.Input - Data type: 1
19:46:53.886 [NioProcessor-2] TRACE org.red5.io.object.Deserializer - Type: 2 target: class java.lang.Object
19:46:53.886 [NioProcessor-2] DEBUG o.r.s.n.r.codec.RTMPProtocolDecoder - Num params: 1
19:46:53.886 [NioProcessor-2] DEBUG o.r.s.n.r.codec.RTMPProtocolDecoder - > 0: true
19:46:53.886 [NioProcessor-2] TRACE o.r.s.n.r.codec.RTMPProtocolDecoder - Decoded message: Invoke #2: Service: null Method: _result Num Params: 1 0: true
19:46:53.886 [NioProcessor-2] TRACE o.r.s.n.r.codec.RTMPProtocolDecoder - Last read header after decode: Header [streamId=0, channelId=3, dataType=20, timerBase=0, timerDelta=0, size=22, extended=false]
19:46:53.886 [NioProcessor-2] TRACE o.r.s.n.r.c.RTMPMinaProtocolDecoder - Decoded: [Packet [[header data type=20, channel=3, timer=0], [message timestamp=0]]]
19:46:53.886 [NioProcessor-2] TRACE o.r.s.n.r.c.RTMPMinaProtocolDecoder - Writing Packet [[header data type=20, channel=3, timer=0], [message timestamp=0]] to decoder output: org.apache.mina.filter.codec.ProtocolCodecFilter$ProtocolDecoderOutputImpl@6bf4c182
19:46:53.886 [NioProcessor-2] TRACE o.r.s.n.r.c.RTMPMinaProtocolDecoder - Input buffer position: 34
19:46:53.886 [NioProcessor-2] DEBUG org.red5.server.api.Red5 - Set connection: null with thread: NioProcessor-2
19:46:53.886 [NioProcessor-2] DEBUG org.red5.server.api.Red5 - Caller: org.red5.client.net.rtmp.codec.RTMPMinaCodecFactory$1.decode #69
19:46:53.887 [NioProcessor-2] DEBUG o.r.c.net.rtmp.RTMPMinaIoHandler - messageReceived
19:46:53.887 [NioProcessor-2] TRACE o.r.c.net.rtmp.RTMPMinaIoHandler - Session id: OJJ0LHPV93USW
19:46:53.887 [NioProcessor-2] DEBUG o.r.client.net.rtmp.RTMPConnManager - Getting connection by session id: OJJ0LHPV93USW
19:46:53.887 [NioProcessor-2] DEBUG org.red5.server.api.Red5 - Set connection: OJJ0LHPV93USW with thread: NioProcessor-2
19:46:53.887 [NioProcessor-2] DEBUG org.red5.server.api.Red5 - Caller: org.red5.client.net.rtmp.RTMPMinaIoHandler.messageReceived #125
19:46:53.887 [NioProcessor-2] TRACE o.r.server.net.rtmp.RTMPConnection - handleMessageReceived - OJJ0LHPV93USW
19:46:53.887 [NioProcessor-2] DEBUG o.r.server.net.rtmp.RTMPConnection - Executor is null on OJJ0LHPV93USW state: connected
19:46:53.887 [NioProcessor-2] TRACE o.r.server.net.rtmp.BaseRTMPHandler - messageReceived connection: OJJ0LHPV93USW
19:46:53.887 [NioProcessor-2] TRACE o.r.server.net.rtmp.BaseRTMPHandler - Message received - header: Header [streamId=0, channelId=3, dataType=20, timerBase=0, timerDelta=0, size=22, extended=false]
19:46:53.887 [NioProcessor-2] TRACE o.r.server.net.rtmp.RTMPConnection - messageReceived
19:46:53.887 [NioProcessor-2] TRACE o.r.server.net.rtmp.RTMPConnection - updateBytesRead
19:46:53.887 [NioProcessor-2] TRACE o.r.server.net.rtmp.BaseRTMPHandler - Header / message data type: 20
19:46:53.887 [NioProcessor-2] TRACE o.r.c.net.rtmp.BaseRTMPClientHandler - onCommand: Invoke #2: Service: null Method: _result Num Params: 1 0: true, id: 2
19:46:53.887 [NioProcessor-2] DEBUG o.r.c.net.rtmp.BaseRTMPClientHandler - Service name: _result args[0]: true
19:46:53.887 [NioProcessor-2] DEBUG o.r.c.net.rtmp.BaseRTMPClientHandler - Received result for pending call - Service: null Method: execute Num Params: 1 0: {cmd=SEND_MSG, param={uid=1111111, uname=SYSTEM, tuid=2222222, content={"uid":1111111,"uname":"System","type":0,"content":"%3CTextFlow+xmlns%3D%22http%3A%2F%2Fns.adobe.com%2FtextLayout%2F2008%22+version%3D%223.0.0%22+whitespacecollapse%3D%22preserve%22+paddingtop%3D%225%22%3E%3Cp+fontSize%3D%2214%22+fontFamily%3D%22%E5%AE%8B%E4%BD%93%22+color%3D%22%23000000%22%3E%3Cspan+fontSize%3D%2214%22+fontFamily%3D%22%E5%AE%8B%E4%BD%93%22+color%3D%22%23000000%22%3E%E5%93%88%E5%93%88+%E6%B5%8B%E8%AF%95%3C%2Fspan%3E%3C%2Fp%3E%3C%2FTextFlow%3E","ts":"2020-02-28 18:00:00"}, type=0}}
Response true
19:46:53.887 [NioProcessor-2] DEBUG org.red5.server.api.Red5 - Set connection: null with thread: NioProcessor-2
19:46:53.887 [NioProcessor-2] DEBUG org.red5.server.api.Red5 - Caller: org.red5.client.net.rtmp.RTMPMinaIoHandler.messageReceived #127

Task rejected

We try to make a RTMP Client using red5-client.
We have this error :
org.springframework.core.task.TaskRejectedException: Executor [java.util.concurrent.ThreadPoolExecutor@4b22cc13[Running, pool size = 1, active threads = 1, queued tasks = 16, completed tasks = 263]] did not accept task: org.springframework.util.concurrent.ListenableFutureTask@15858f02
at org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor.submitListenable(ThreadPoolTaskExecutor.java:297) ~[spring-context-4.0.6.RELEASE.jar:4.0.6.RELEASE]
at org.red5.server.net.rtmp.RTMPMinaConnection.handleMessageReceived(RTMPMinaConnection.java:159) ~[red5-server-1.0.4-SNAPSHOT.jar:na]
at org.red5.client.net.rtmp.RTMPMinaIoHandler.messageReceived(RTMPMinaIoHandler.java:188) [red5-client-1.0.3-RELEASE.jar:1.0.3-RELEASE]
at org.apache.mina.core.filterchain.DefaultIoFilterChain$TailFilter.messageReceived(DefaultIoFilterChain.java:690) [mina-core-2.0.7.jar:na]
at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:417) [mina-core-2.0.7.jar:na]
at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:47) [mina-core-2.0.7.jar:na]
at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:765) [mina-core-2.0.7.jar:na]
at org.apache.mina.filter.codec.ProtocolCodecFilter$ProtocolDecoderOutputImpl.flush(ProtocolCodecFilter.java:407) [mina-core-2.0.7.jar:na]
at org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:236) [mina-core-2.0.7.jar:na]
at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:417) [mina-core-2.0.7.jar:na]
at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:47) [mina-core-2.0.7.jar:na]
at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:765) [mina-core-2.0.7.jar:na]
at org.red5.client.net.rtmpe.RTMPEIoFilter.messageReceived(RTMPEIoFilter.java:132) [red5-client-1.0.3-RELEASE.jar:1.0.3-RELEASE]
at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:417) [mina-core-2.0.7.jar:na]
at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:47) [mina-core-2.0.7.jar:na]
at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:765) [mina-core-2.0.7.jar:na]
at org.apache.mina.core.filterchain.IoFilterAdapter.messageReceived(IoFilterAdapter.java:109) [mina-core-2.0.7.jar:na]
at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:417) [mina-core-2.0.7.jar:na]
at org.apache.mina.core.filterchain.DefaultIoFilterChain.fireMessageReceived(DefaultIoFilterChain.java:410) [mina-core-2.0.7.jar:na]
at org.apache.mina.core.polling.AbstractPollingIoProcessor.read(AbstractPollingIoProcessor.java:710) [mina-core-2.0.7.jar:na]
at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:664) [mina-core-2.0.7.jar:na]
at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:653) [mina-core-2.0.7.jar:na]
at org.apache.mina.core.polling.AbstractPollingIoProcessor.access$600(AbstractPollingIoProcessor.java:67) [mina-core-2.0.7.jar:na]
at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:1124) [mina-core-2.0.7.jar:na]
at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64) [mina-core-2.0.7.jar:na]
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [na:1.7.0_45]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [na:1.7.0_45]
at java.lang.Thread.run(Unknown Source) [na:1.7.0_45]
Caused by: java.util.concurrent.RejectedExecutionException: Task org.springframework.util.concurrent.ListenableFutureTask@4628a18a rejected from java.util.concurrent.ThreadPoolExecutor@4b22cc13[Running, pool size = 1, active threads = 1, queued tasks = 16, completed tasks = 263]
at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(Unknown Source) ~[na:1.7.0_45]
at java.util.concurrent.ThreadPoolExecutor.reject(Unknown Source) [na:1.7.0_45]
at java.util.concurrent.ThreadPoolExecutor.execute(Unknown Source) [na:1.7.0_45]
at org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor.submitListenable(ThreadPoolTaskExecutor.java:293) ~[spring-context-4.0.6.RELEASE.jar:4.0.6.RELEASE]
... 27 common frames omitted

How can we fix this ? Is it possible to configure the queue size ?

RTMP handshake failing on s2 processing

HI, I discovered a bug, and a solution, for the outbound RTMP handshake of the red5 client:

The code in question is below:

    if (c2 != null) {
                        // set state to indicate we're waiting for S2
                        conn.getState().setState(RTMP.STATE_HANDSHAKE);
                        //log.trace("C2 byte order: {}", c2.order());
                        session.write(c2);
                        // if we got S0S1+S2 continue processing
                        if (handshake.getBufferSize() >= Constants.HANDSHAKE_SIZE) {
                            // clear
                            buf.clear();
                            // re-set
                            buf = handshake.getBufferAsIoBuffer();
                            if (handshake.decodeServerResponse2(buf)) {
                                log.debug("S2 decoding successful");
                            } else {
                                log.warn("Handshake failed on S2 processing");
                            }
                            completeConnection(session, conn, rtmp, handshake);
                        }

In my use of red5, whenever the code reached this point, and tired to decode the S2 handshake here, it always fails, I believe it is due to the reason I have described in the below sequence diagram:

image

I believe the fix would be this:

int remaining = buf.remaining();
                if (remaining > 0) {
                    // store the remaining bytes in a thread local for use by S2 decoding
                    handshake.addBuffer(buf);
                    log.warn("Stored {} bytes for later decoding", remaining);
                }
                IoBuffer c2 = handshake.decodeServerResponse1(IoBuffer.wrap(dst));
                if (c2 != null) {
                    // set state to indicate we're waiting for S2
                    conn.getState().setState(RTMP.STATE_HANDSHAKE);
                    //log.trace("C2 byte order: {}", c2.order());
                    session.write(c2);
                    // if we got S0S1+S2 continue processing
                    if (handshake.getBufferSize() >= Constants.HANDSHAKE_SIZE && remaining > 0) {
                        // clear
                        buf.clear();
                        // re-set
                        buf = handshake.getBufferAsIoBuffer();
                        if (handshake.decodeServerResponse2(buf)) {
                            log.debug("S2 decoding successful");
                        } else {
                            log.warn("Handshake failed on S2 processing");
                        }
                        completeConnection(session, conn, rtmp, handshake);
                    }

AMF3 connect failed and decode error

  1. src/main/java/org/red5/client/net/rtmp/BaseRTMPClientHandler.java onCommand method

    log.trace("onCommand: {}, id: {}", command, command.getTransactionId());
    final IServiceCall call = command.getCall();
    final String methodName = call.getServiceMethodName();
    log.debug("Service name: {} args[0]: {}", methodName, (call.getArguments().length != 0 ? call.getArguments()[0] : ""));
    if ("_result".equals(methodName) || "_error".equals(methodName)) {
        final IPendingServiceCall pendingCall = conn.getPendingCall(command.getTransactionId());
        log.debug("Received result for pending call - {}", pendingCall);
        if (pendingCall != null) {
            if ("connect".equals(methodName)) {
                Integer encoding = (Integer) connectionParams.get("objectEncoding");
                if (encoding != null && encoding.intValue() == 3) {
                    log.debug("Setting encoding to AMF3");
                    conn.getState().setEncoding(IConnection.Encoding.AMF3);
                }
            }
        }
        handlePendingCallResult(conn, (Invoke) command);
        return;
    }
    

    if ("connect".equals(methodName)) is unreach code, it should be if ("connect".equals(pendingCall.getServiceMethodName()))

  2. server use these code to send data to client (org.red5.server.net.rtmp.codec.RTMPProtocolEncoder encodeCommand(IoBuffer out, ICommand command))

    Output output = new org.red5.io.amf.Output(out);
    final IServiceCall call = command.getCall();
    final boolean isPending = (call.getStatus() == Call.STATUS_PENDING);
    log.debug("Call: {} pending: {}", call, isPending);
    if (!isPending) {
        log.debug("Call has been executed, send result");
        Serializer.serialize(output, call.isSuccess() ? "_result" : "_error");
    } else {
        log.debug("This is a pending call, send request");
        final String action = (call.getServiceName() == null) ? call.getServiceMethodName() : call.getServiceName() + '.' + call.getServiceMethodName();
        Serializer.serialize(output, action); // seems right
    }
    if (command instanceof Invoke) {
        Serializer.serialize(output, Integer.valueOf(command.getTransactionId()));
        Serializer.serialize(output, command.getConnectionParams());
    }
    

    and decode data like this( org.red5.server.net.rtmp.codec.RTMPProtocolDecoder decodeInvoke(Encoding encoding, IoBuffer in) )

    if (action != null) {
        Invoke invoke = new Invoke();
        invoke.setTransactionId(Deserializer.<Number> deserialize(input, Number.class).intValue());
        // now go back to the actual encoding to decode parameters
        if (encoding == Encoding.AMF3) {
            input = new org.red5.io.amf3.Input(in);
            ((org.red5.io.amf3.Input) input).enforceAMF3();
        } else {
            input = new org.red5.io.amf.Input(in);
        }
        // get / set the parameters if there any
        Object[] params = in.hasRemaining() ? handleParameters(in, invoke, input) : new Object[0];
    

    red5-client will thrown decode error cause Serializer.serialize(output, command.getConnectionParams());(still AMF0 but skip) when use AMF3.

    Now I try to override decodeInvoke method in RTMPClientProtocolDecoder
    `
    @OverRide
    public Invoke decodeInvoke(Encoding encoding, IoBuffer in) {

      // for response, the action string and invokeId is always encoded as AMF0 we use the first byte to decide which encoding to use
      in.mark();
      byte tmp = in.get();
      in.reset();
      Input input;
      if (encoding == Encoding.AMF3 && tmp == AMF.TYPE_AMF3_OBJECT) {
          input = new org.red5.io.amf3.Input(in);
          ((org.red5.io.amf3.Input) input).enforceAMF3();
      } else {
          input = new org.red5.io.amf.Input(in);
      }
      // get the action
      String action = Deserializer.deserialize(input, String.class);
      if (log.isTraceEnabled()) {
          log.trace("Action {}", action);
      }
      // throw a runtime exception if there is no action
      if (action != null) {
          Invoke invoke = new Invoke();
          invoke.setTransactionId(Deserializer.<Number> deserialize(input, Number.class).intValue());
          // get / set the parameters if there any
          Object[] params = in.hasRemaining() ? clientHandleParameters(encoding,in, invoke, input) : new Object[0];
          // determine service information
          final int dotIndex = action.lastIndexOf('.');
          String serviceName = (dotIndex == -1) ? null : action.substring(0, dotIndex);
          // pull off the prefixes since java doesnt allow this on a method name
          if (serviceName != null && (serviceName.startsWith("@") || serviceName.startsWith("|"))) {
              serviceName = serviceName.substring(1);
          }
          String serviceMethod = (dotIndex == -1) ? action : action.substring(dotIndex + 1, action.length());
          // pull off the prefixes since java doesn't allow this on a method name
          if (serviceMethod.startsWith("@") || serviceMethod.startsWith("|")) {
              serviceMethod = serviceMethod.substring(1);
          }
          PendingCall call = new PendingCall(serviceName, serviceMethod, params);
          invoke.setCall(call);
          return invoke;
      } else {
          // TODO replace this with something better as time permits
          throw new RuntimeException("Action was null");
      }
    

    }
    `

`
/**
* Sets incoming connection parameters and / or returns encoded parameters for use in a call.
*
* @param in
* @param notify
* @param input
* @return parameters array
*/
private Object[] clientHandleParameters(Encoding encoding,IoBuffer in, Notify notify, Input input) {

    Object[] params = new Object[] {};
    List<Object> paramList = new ArrayList<Object>();
    final Object obj = Deserializer.deserialize(input, Object.class);
    if (obj instanceof Map) {
        // Before the actual parameters we sometimes (connect) get a map of parameters, this is usually null, but if set should be
        // passed to the connection object.
        @SuppressWarnings("unchecked")
        final Map<String, Object> connParams = (Map<String, Object>) obj;
        notify.setConnectionParams(connParams);
    } else if (obj != null) {
        paramList.add(obj);
    }

    // now go back to the actual encoding to decode parameters
    if (encoding == Encoding.AMF3) {
        input = new org.red5.io.amf3.Input(in);
        ((org.red5.io.amf3.Input) input).enforceAMF3();
    } else {
        input = new org.red5.io.amf.Input(in);
    }

    while (in.hasRemaining()) {
        paramList.add(Deserializer.deserialize(input, Object.class));
    }
    params = paramList.toArray();
    if (log.isDebugEnabled()) {
        log.debug("Num params: {}", paramList.size());
        for (int i = 0; i < params.length; i++) {
            log.debug(" > {}: {}", i, params[i]);
        }
    }
    return params;
}

`
and it fixed the decode error.

Issue using StreamRelay

Hi,

we've compiled the master version of red5-client with maven (we needed to change the red5 server version from 1.0.2 to 1.0.2-RC2, with 1.0.2-RELEASE it doesn't work).

StreamRelay is not working, it connects to the Red5 server but getting this and no relay stream is published.

We've published a nellymoser 8kwh sample audio stream using a flash sample swf.

Any idea?

11:45:41.543 [NioProcessor-2] INFO o.r.s.n.r.codec.RTMPProtocolDecoder - > 0: {level=status, description=Connection succeeded., data={type=red5, version=4,0,0,1121}, capabilities=31, code=NetConnection.Connect.Success, fmsVer=RED5/1,0,2,0, mode=1}
11:45:41.543 [NioProcessor-2] DEBUG o.r.c.net.rtmp.RTMPMinaIoHandler - messageReceived
11:45:41.543 [NioProcessor-2] DEBUG o.r.client.net.rtmp.RTMPConnManager - Getting connection by session id: I3YLEKAQA6YS7
11:45:41.543 [NioProcessor-2] DEBUG o.r.server.net.rtmp.RTMPConnManager - Getting connection by session id: I3YLEKAQA6YS7
11:45:41.543 [NioProcessor-2] WARN o.r.server.net.rtmp.RTMPConnManager - Connection not found for I3YLEKAQA6YS7
11:45:41.544 [NioProcessor-2] DEBUG o.r.c.net.rtmp.RTMPMinaIoHandler - messageReceived
11:45:41.544 [ThreadPoolTaskExecutor-1] ERROR o.r.s.net.rtmp.ReceivedMessageTask - Error processing received message I3YLEKAQA6YS7
java.lang.NullPointerException: null
at org.red5.server.net.rtmp.BaseRTMPHandler.messageReceived(BaseRTMPHandler.java:66) ~[red5-client-1.0.2-RC2-jar-with-dependencies.jar:na]
at org.red5.server.net.rtmp.ReceivedMessageTask.run(ReceivedMessageTask.java:36) ~[red5-client-1.0.2-RC2-jar-with-dependencies.jar:na]
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [na:1.7.0_51]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [na:1.7.0_51]
at java.lang.Thread.run(Unknown Source) [na:1.7.0_51]
11:45:41.545 [NioProcessor-2] DEBUG o.r.client.net.rtmp.RTMPConnManager - Getting connection by session id: I3YLEKAQA6YS7
11:45:41.546 [NioProcessor-2] DEBUG o.r.server.net.rtmp.RTMPConnManager - Getting connection by session id: I3YLEKAQA6YS7
11:45:41.546 [NioProcessor-2] WARN o.r.server.net.rtmp.RTMPConnManager - Connection not found for I3YLEKAQA6YS7

restreaming to wowza

Hi,
I'm trying to publish a video stream from red5 to wowza.

I had Problems setting up the Proxy with org.red5.proxy.StreamingProxy.
After some debugging I found out that the stream id comes as Double.
Changing private int streamId; to private Number streamId; (here) solved my problem. Don't know if any other streaming servers are affected.

Kind regards

website down

HTTP Status 404 – Not Found

Type Status Report

Description The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.

Apache Tomcat/9.0.27

RTMPClient.invoke() fails with parameters longer than 82 bytes

Hey everyone!

Seeing something very strange with RTMPClient.invoke...

If the parameter size is more than 82 bytes the message never arrives at the server. Not sure what could be the issue here, but somebody reported EXACTLY the same issue about 2 years ago here: https://groups.google.com/forum/#!topic/red5interest/SCJmUJnJGA4

final RTMPClient client = new RTMPClient();
        client.connect("localhost", 1935, "liveremote/0586e318-6277-11e3-adc2-22000a1d91fe", new IPendingServiceCallback() 
        {
            @Override
            public void resultReceived(IPendingServiceCall result) 
            {
                if (result.isSuccess())
                {
                    ArrayList<Object> list = new ArrayList<>();

                    list.add(new Object[]{ "fujifilm-x100s-video-test-1080p-full-hd-hdmp4_720.mp4" });
                    list.add(new Object[]{ "canon-500d-test-video-720-hd-30-fr-hdmp4_720.mp4" });

                    Object[] params = { "64", "cc-video-processed/", list };

                    client.invoke("loadPlaylist", params, new IPendingServiceCallback() 
                    {
                        @Override
                        public void resultReceived(IPendingServiceCall result)
                        {
                            //
                        }
                    });
                }
            }
        });

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.