From 36f0e22d5699e6f5af0118fbc97d5bb04149b381 Mon Sep 17 00:00:00 2001 From: Alex McKenzie Date: Fri, 3 Apr 2026 11:06:35 +1000 Subject: [PATCH] Allow configuration of the RTMP connect command As an example, this would allow setting a custom `flashVer` to identify the application to the server. --- .../rtmp/elements/endpoints/RtmpEndpoint.kt | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/extensions/rtmp/src/main/java/io/github/thibaultbee/streampack/ext/rtmp/elements/endpoints/RtmpEndpoint.kt b/extensions/rtmp/src/main/java/io/github/thibaultbee/streampack/ext/rtmp/elements/endpoints/RtmpEndpoint.kt index b0d3d8eea..a66f95796 100644 --- a/extensions/rtmp/src/main/java/io/github/thibaultbee/streampack/ext/rtmp/elements/endpoints/RtmpEndpoint.kt +++ b/extensions/rtmp/src/main/java/io/github/thibaultbee/streampack/ext/rtmp/elements/endpoints/RtmpEndpoint.kt @@ -19,6 +19,7 @@ import android.content.Context import io.github.komedia.komuxer.flv.tags.FLVTag import io.github.komedia.komuxer.rtmp.RtmpConnectionBuilder import io.github.komedia.komuxer.rtmp.client.RtmpClient +import io.github.komedia.komuxer.rtmp.client.RtmpClientSettings import io.github.komedia.komuxer.rtmp.connect import io.github.komedia.komuxer.rtmp.messages.command.StreamPublishType import io.github.thibaultbee.streampack.core.configuration.mediadescriptor.MediaDescriptor @@ -56,7 +57,9 @@ import java.io.IOException * An endpoint that send frame to an RTMP server. */ class RtmpEndpoint internal constructor( - defaultDispatcher: CoroutineDispatcher, val ioDispatcher: CoroutineDispatcher + defaultDispatcher: CoroutineDispatcher, + val ioDispatcher: CoroutineDispatcher, + private val clientSettings: RtmpClientSettings = RtmpClientSettings() ) : IEndpointInternal { private val coroutineScope = CoroutineScope(SupervisorJob() + defaultDispatcher) private val mutex = Mutex() @@ -109,7 +112,7 @@ class RtmpEndpoint internal constructor( return@withContext } - rtmpClient = connectionBuilder.connect(descriptor.uri.toString()).apply { + rtmpClient = connectionBuilder.connect(descriptor.uri.toString(), settings = clientSettings).apply { _isOpenFlow.emit(true) socketContext.invokeOnCompletion { throwable -> @@ -236,9 +239,17 @@ class RtmpEndpoint internal constructor( /** * A factory to build a [RtmpEndpoint]. + * + * @param clientSettings optional [RtmpClientSettings] forwarded to every + * endpoint created by this factory. Use the [RtmpClientSettings.connectInfo] + * lambda to customise the RTMP connect command — for example, to set a + * custom `flashVer` string that identifies your application to the server. */ -class RtmpEndpointFactory : IEndpointInternal.Factory { +class RtmpEndpointFactory( + private val clientSettings: RtmpClientSettings = RtmpClientSettings() +) : IEndpointInternal.Factory { override fun create( context: Context, dispatcherProvider: IDispatcherProvider - ): IEndpointInternal = RtmpEndpoint(dispatcherProvider.default, dispatcherProvider.io) + ): IEndpointInternal = + RtmpEndpoint(dispatcherProvider.default, dispatcherProvider.io, clientSettings) }