Linux: No implementation found for method trackClone on channel FlutterWebRTC
I am trying to follow the quick start guide at https://getstream.io/video/docs/flutter/, on a Linux machine, but I am stumbling on the following error:
2025-07-07 11:59:01.393086 🚨 (E/SV:CallSession-0): [start] failed: MissingPluginException(No implementation found for method trackClone on channel FlutterWebRTC.Method)
2025-07-07 11:59:01.394482 🚨 (E/SV:Call-1): [startSession] failed: Result.Failure{error: VideoErrorWithCause{message: MissingPluginException(No implementation found for method trackClone on channel FlutterWebRTC.Method), exception: MissingPluginException(No implementation found for method trackClone on channel FlutterWebRTC.Method), stackTrace: #0 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:368:7)
<asynchronous suspension>
#1 MediaStreamTrackNative.clone (package:stream_webrtc_flutter/src/native/media_stream_track_impl.dart:135:22)
<asynchronous suspension>
#2 PublisherRtcManager._addTransceiver (package:stream_video/src/webrtc/rtc_manager.dart:797:29)
<asynchronous suspension>
#3 PublisherRtcManager.publishVideoTrack (package:stream_video/src/webrtc/rtc_manager.dart:702:35)
<asynchronous suspension>
#4 Call.setCameraEnabled (package:stream_video/src/call/call.dart:2426:9)
<asynchronous suspension>
#5 Call._applyConnectOptions (package:stream_video/src/call/call.dart:1613:5)
<asynchronous suspension>
#6 Call._startSession.<anonymous closure> (package:stream_video/src/call/call.dart:1077:9)
<asynchronous suspension>
#7 CallSession.start (package:stream_video/src/call/session/call_session.dart:395:7)
<asynchronous suspension>
#8 Call._startSession (package:stream_video/src/call/call.dart:1073:20)
<asynchronous suspension>
#9 Call._join.<anonymous closure> (package:stream_video/src/call/call.dart:787:31)
<asynchronous suspension>
#10 BasicLock.synchronized (package:synchronized/src/basic_lock.dart:38:16)
<asynchronous suspension>
#11 CancelableCompleter.complete.<anonymous closure> (package:async/src/cancelable_operation.dart:433:16)
<asynchronous suspension>
}}
From the code I can see that trackClone was supposed to be implemented in stream_webrtc_flutter-1.0.9/common/cpp/src/flutter_webrtc.cc, but in fact it is not implemented.
Does stream-video-flutter have support for Linux? flutter-webrtc (which stream_webrtc_flutter appears to be a fork of) does have Linux support. There is also an issue tracking Linux support in this repo, marked "closed as complete", but with no clarification if it actually have Linux support or not.
Hi @Rodrigodd, thanks for your interest in the video sdk. Currently we don't support linux and windows, so new features are now (always) implemented on these platforms and we don't continuously test them. We also have barely any people mentioning or asking for Linux support, so thanks for reaching out, so we can prioritize it. Can you share a little bit about your plans? Are you currently just playing around with the sdk, or do you have concrete plans where you need Linux support?
We are evaluating a video calling service and SDK for use in a product running embedded Linux.
Do you think it is feasible to use the getstream.io service directly through flutter-webrtc or other means, without relying on the SDK, or is that approach not supported?
I would not recommend to run getstream.io service directly with webrtc without our sdk's. We don't support that.
I've looked at it before, and spend a little bit of time on it since your question.
Could you maybe give our dev builds a try?
It's related to these PR's: https://github.com/GetStream/stream-video-flutter/pull/1023 https://github.com/GetStream/webrtc-flutter/pull/37
I've run it on windows, but all these changes should also work on linux.
You can test them by adding these overrides:
dependency_overrides:
stream_video:
git:
url: https://github.com/GetStream/stream-video-flutter.git
path: packages/stream_video
ref: 504a16c057c19dc23bfbbcdf3929fef11fd1217e
stream_webrtc_flutter:
git:
url: https://github.com/GetStream/webrtc-flutter.git
ref: 97955b478acfb1bbc11fa48623e0049788195cf9
Thanks for looking into it!
I tried the changes here, and I now I can enter a call and receive video and audio, but transmitting audio and video is not working. I tested what the "Create Call" in the dashboard.getstream.io, what both connections in the same machine.
I could not find anything specific in the logs that explain the problem, so I attached it below. I already deleted my API key, so I think it is safe to share:
Hi @Rodrigodd , thanks for the logs.
Is this your own app, or is this the dogfooding example app from this repository. If it's your own app, could you also give the dogfooding app a try?
It is just a demo app, based on the quick start from the documentation:
lib/main.dart
import 'package:flutter/material.dart';
import 'package:stream_video_flutter/stream_video_flutter.dart';
Future<void> main() async {
// Ensure Flutter is able to communicate with Plugins
WidgetsFlutterBinding.ensureInitialized();
// Initialize Stream video and set the API key along with the user for our app.
final client = StreamVideo(
'api-key',
user: User.regular(userId: 'user_id', name: 'User ID'),
userToken: 'user-token',
options: StreamVideoOptions(logPriority: Priority.info),
);
// Set up our call object and pass it the call type and ID. The most common call type is `default`, which enables full audio and video transmission
final call = client.makeCall(
callType: StreamCallType.defaultType(),
id: 'default_call-id',
);
call.callEvents.on((e) {
debugPrint("new event $e");
});
// Connect to the call we created
await call.join();
runApp(DemoAppHome(call: call));
}
class DemoAppHome extends StatelessWidget {
const DemoAppHome({Key? key, required this.call}) : super(key: key);
final Call call;
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: StreamCallContainer(
// Stream's pre-made component
call: call,
),
),
);
}
}
I could not get the dogfooding app to work, it only display "Error loading app", with the following error in the terminal:
Unsupported operation: DefaultFirebaseOptions have not been configured for linux - you can reconfigure this by running the FlutterFire CLI again.
I tried to workaround it by using the config of another platform:
diff --git a/dogfooding/lib/app/app.dart b/dogfooding/lib/app/app.dart
index 2d9bb1c6..5095949d 100644
--- a/dogfooding/lib/app/app.dart
+++ b/dogfooding/lib/app/app.dart
@@ -43,7 +43,7 @@ class _StreamDogFoodingAppState extends State<StreamDogFoodingApp> {
Future<void> _loadApp(BuildContext context) async {
// Initialise Firebase
await Firebase.initializeApp(
- options: DefaultFirebaseOptions.currentPlatform,
+ options: DefaultFirebaseOptions.macos,
);
// Configure crash handlers
But then I got
PlatformException(channel-error, Unable to establish connection on channel: "dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.initializeCore"., null, null)
I am not familiar with firebase, so I don't know what those configurations do.