stream-video-flutter icon indicating copy to clipboard operation
stream-video-flutter copied to clipboard

Linux: No implementation found for method trackClone on channel FlutterWebRTC

Open Rodrigodd opened this issue 5 months ago • 6 comments

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.

Rodrigodd avatar Jul 07 '25 16:07 Rodrigodd

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?

renefloor avatar Jul 08 '25 07:07 renefloor

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?

Rodrigodd avatar Jul 08 '25 11:07 Rodrigodd

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

renefloor avatar Jul 11 '25 08:07 renefloor

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:

log.txt

Rodrigodd avatar Jul 11 '25 12:07 Rodrigodd

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?

renefloor avatar Jul 11 '25 13:07 renefloor

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.

Rodrigodd avatar Jul 11 '25 14:07 Rodrigodd