
Real-time video conferencing SDK offering drop-in UI, customizable components, screen sharing, recording, chat, participant management, breakout rooms, polls, pagination, and self-hosting support.
Real-time video conferencing for Android & Kotlin Multiplatform — drop-in solution with pre-built UI or full customization.
📖 Full Documentation → | 🌐 mediasfu.com
// build.gradle.kts (app level)
dependencies {
// For Android-only projects (recommended):
implementation("com.mediasfu:mediasfu-sdk-android:1.0.0")
// For Kotlin Multiplatform projects:
// implementation("com.mediasfu:mediasfu-sdk:1.0.0")
}import com.mediasfu.sdk.ui.mediasfu.MediasfuGeneric
import com.mediasfu.sdk.ui.mediasfu.MediasfuGenericOptions
import com.mediasfu.sdk.model.Credentials
@Composable
fun App() {
// Option 1: No credentials (testing/demo)
MediasfuGeneric()
// Option 2: With MediaSFU Cloud credentials
// MediasfuGeneric(
// options = MediasfuGenericOptions(
// credentials = Credentials(apiUserName = "your_username", apiKey = "your_api_key")
// )
// )
}./gradlew :androidApp:installDebugDone! You have a full-featured video conferencing app with:
dependencies {
// For Android-only projects (recommended):
implementation("com.mediasfu:mediasfu-sdk-android:1.0.0")
// For Kotlin Multiplatform projects:
// implementation("com.mediasfu:mediasfu-sdk:1.0.0")
}Add to AndroidManifest.xml:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />All room types are convenience wrappers around MediasfuGeneric with pre-configured event types:
| Type | Default Event Type | Use Case |
|---|---|---|
MediasfuGeneric |
CONFERENCE |
General meetings |
MediasfuBroadcast |
BROADCAST |
Live streaming |
MediasfuWebinar |
WEBINAR |
Educational sessions |
MediasfuConference |
CONFERENCE |
Business meetings |
MediasfuChat |
CHAT |
Chat-focused |
import com.mediasfu.sdk.ui.mediasfu.*
import com.mediasfu.sdk.model.Credentials
val options = MediasfuGenericOptions(
credentials = Credentials(apiUserName = "user", apiKey = "key")
)
// Pick the right one for your use case - all use the same options!
MediasfuWebinar(options = options)
MediasfuBroadcast(options = options)
MediasfuConference(options = options)Import and use components directly — no boilerplate:
import com.mediasfu.sdk.ui.AudioGrid
import com.mediasfu.sdk.ui.FlexibleGrid
import com.mediasfu.sdk.ui.components.display.AudioGridOptions
import com.mediasfu.sdk.ui.components.display.FlexibleGridOptions
@Composable
fun CustomLayout(parameters: MediasfuParameters) {
// Just like Flutter/React!
AudioGrid(AudioGridOptions(
participants = parameters.participants,
columnsPerRow = 3
))
FlexibleGrid(FlexibleGridOptions(
parameters = parameters,
columns = 2
))
}| Component | Description |
|---|---|
AudioGrid |
Audio participant grid |
AudioCard |
Single audio participant |
FlexibleGrid |
Flexible video grid |
FlexibleVideo |
Main video display |
MiniCard |
Compact participant card |
Pagination |
Page controls |
AlertComponent |
Alert messages |
MainAspectComponent |
Layout container |
@Composable
fun App() {
MediasfuGeneric(options = options)
}@Composable
fun App() {
var parameters by remember { mutableStateOf<MediasfuParameters?>(null) }
// Hidden MediaSFU backend
MediasfuGeneric(
options = options.copy(returnUI = false),
onParametersUpdate = { parameters = it }
)
// Your custom UI
parameters?.let { params ->
Column {
Text("Room: ${params.roomName}")
Button(onClick = { params.clickVideo(params) }) {
Text(if (params.videoAlreadyOn) "Stop Video" else "Start Video")
}
}
}
}@Composable
fun CustomMainScreen(parameters: MediasfuParameters) {
Column {
FlexibleVideo(FlexibleVideoOptions(parameters = parameters))
FlexibleGrid(FlexibleGridOptions(parameters = parameters))
}
}
MediasfuGeneric(
options = options,
customComponent = { CustomMainScreen(it) }
)// Media controls
parameters.clickVideo(parameters) // Toggle video
parameters.clickAudio(parameters) // Toggle audio
parameters.clickScreenShare(parameters) // Toggle screen share
// State
parameters.videoAlreadyOn // Boolean
parameters.audioAlreadyOn // Boolean
parameters.participants // List<Participant>
// Modals
parameters.updateIsParticipantsModalVisible(true)
parameters.updateIsMessagesModalVisible(true)No API key needed for self-hosting. Use MediaSFU Open:
import com.mediasfu.sdk.ui.mediasfu.MediasfuGeneric
import com.mediasfu.sdk.ui.mediasfu.MediasfuGenericOptions
MediasfuGeneric(
options = MediasfuGenericOptions(
connectMediaSFU = false,
localLink = "http://your-server:3000"
)
)MIT © MediaSFU
Real-time video conferencing for Android & Kotlin Multiplatform — drop-in solution with pre-built UI or full customization.
📖 Full Documentation → | 🌐 mediasfu.com
// build.gradle.kts (app level)
dependencies {
// For Android-only projects (recommended):
implementation("com.mediasfu:mediasfu-sdk-android:1.0.0")
// For Kotlin Multiplatform projects:
// implementation("com.mediasfu:mediasfu-sdk:1.0.0")
}import com.mediasfu.sdk.ui.mediasfu.MediasfuGeneric
import com.mediasfu.sdk.ui.mediasfu.MediasfuGenericOptions
import com.mediasfu.sdk.model.Credentials
@Composable
fun App() {
// Option 1: No credentials (testing/demo)
MediasfuGeneric()
// Option 2: With MediaSFU Cloud credentials
// MediasfuGeneric(
// options = MediasfuGenericOptions(
// credentials = Credentials(apiUserName = "your_username", apiKey = "your_api_key")
// )
// )
}./gradlew :androidApp:installDebugDone! You have a full-featured video conferencing app with:
dependencies {
// For Android-only projects (recommended):
implementation("com.mediasfu:mediasfu-sdk-android:1.0.0")
// For Kotlin Multiplatform projects:
// implementation("com.mediasfu:mediasfu-sdk:1.0.0")
}Add to AndroidManifest.xml:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />All room types are convenience wrappers around MediasfuGeneric with pre-configured event types:
| Type | Default Event Type | Use Case |
|---|---|---|
MediasfuGeneric |
CONFERENCE |
General meetings |
MediasfuBroadcast |
BROADCAST |
Live streaming |
MediasfuWebinar |
WEBINAR |
Educational sessions |
MediasfuConference |
CONFERENCE |
Business meetings |
MediasfuChat |
CHAT |
Chat-focused |
import com.mediasfu.sdk.ui.mediasfu.*
import com.mediasfu.sdk.model.Credentials
val options = MediasfuGenericOptions(
credentials = Credentials(apiUserName = "user", apiKey = "key")
)
// Pick the right one for your use case - all use the same options!
MediasfuWebinar(options = options)
MediasfuBroadcast(options = options)
MediasfuConference(options = options)Import and use components directly — no boilerplate:
import com.mediasfu.sdk.ui.AudioGrid
import com.mediasfu.sdk.ui.FlexibleGrid
import com.mediasfu.sdk.ui.components.display.AudioGridOptions
import com.mediasfu.sdk.ui.components.display.FlexibleGridOptions
@Composable
fun CustomLayout(parameters: MediasfuParameters) {
// Just like Flutter/React!
AudioGrid(AudioGridOptions(
participants = parameters.participants,
columnsPerRow = 3
))
FlexibleGrid(FlexibleGridOptions(
parameters = parameters,
columns = 2
))
}| Component | Description |
|---|---|
AudioGrid |
Audio participant grid |
AudioCard |
Single audio participant |
FlexibleGrid |
Flexible video grid |
FlexibleVideo |
Main video display |
MiniCard |
Compact participant card |
Pagination |
Page controls |
AlertComponent |
Alert messages |
MainAspectComponent |
Layout container |
@Composable
fun App() {
MediasfuGeneric(options = options)
}@Composable
fun App() {
var parameters by remember { mutableStateOf<MediasfuParameters?>(null) }
// Hidden MediaSFU backend
MediasfuGeneric(
options = options.copy(returnUI = false),
onParametersUpdate = { parameters = it }
)
// Your custom UI
parameters?.let { params ->
Column {
Text("Room: ${params.roomName}")
Button(onClick = { params.clickVideo(params) }) {
Text(if (params.videoAlreadyOn) "Stop Video" else "Start Video")
}
}
}
}@Composable
fun CustomMainScreen(parameters: MediasfuParameters) {
Column {
FlexibleVideo(FlexibleVideoOptions(parameters = parameters))
FlexibleGrid(FlexibleGridOptions(parameters = parameters))
}
}
MediasfuGeneric(
options = options,
customComponent = { CustomMainScreen(it) }
)// Media controls
parameters.clickVideo(parameters) // Toggle video
parameters.clickAudio(parameters) // Toggle audio
parameters.clickScreenShare(parameters) // Toggle screen share
// State
parameters.videoAlreadyOn // Boolean
parameters.audioAlreadyOn // Boolean
parameters.participants // List<Participant>
// Modals
parameters.updateIsParticipantsModalVisible(true)
parameters.updateIsMessagesModalVisible(true)No API key needed for self-hosting. Use MediaSFU Open:
import com.mediasfu.sdk.ui.mediasfu.MediasfuGeneric
import com.mediasfu.sdk.ui.mediasfu.MediasfuGenericOptions
MediasfuGeneric(
options = MediasfuGenericOptions(
connectMediaSFU = false,
localLink = "http://your-server:3000"
)
)MIT © MediaSFU