Pipeline YouTube con relay, overlay e publisher sync lato backend; fix GL pauseGlDuringRotation su Android per evitare crash in rotazione durante lo streaming Flutter. Co-authored-by: Cursor <cursoragent@cursor.com>
88 lines
2.4 KiB
Dart
88 lines
2.4 KiB
Dart
import 'package:flutter/services.dart';
|
|
|
|
/// Bridge verso engine nativo Android (CameraX + RootEncoder).
|
|
class StreamingChannel {
|
|
StreamingChannel._();
|
|
|
|
static const MethodChannel _channel =
|
|
MethodChannel('com.matchlivetv.match_live_tv/streaming');
|
|
|
|
static const EventChannel _metricsChannel =
|
|
EventChannel('com.matchlivetv.match_live_tv/streaming_events');
|
|
|
|
static Future<void> startPreview() async {
|
|
await _channel.invokeMethod('startPreview');
|
|
}
|
|
|
|
static Future<bool> bindPreview() async {
|
|
final ok = await _channel.invokeMethod<bool>('bindPreview');
|
|
return ok ?? false;
|
|
}
|
|
|
|
/// Dopo rotazione: riallinea preview/stream senza fermare RTMP.
|
|
static Future<void> syncOrientation() async {
|
|
await _channel.invokeMethod<void>('syncOrientation');
|
|
}
|
|
|
|
static Future<void> stopPreview() async {
|
|
await _channel.invokeMethod('stopPreview');
|
|
}
|
|
|
|
static Future<void> startStream({
|
|
required String rtmpUrl,
|
|
int targetBitrate = 3000000,
|
|
int targetFps = 30,
|
|
int width = 1280,
|
|
int height = 720,
|
|
bool portrait = false,
|
|
int rotation = 0,
|
|
}) async {
|
|
await _channel.invokeMethod('startStream', {
|
|
'rtmpUrl': rtmpUrl,
|
|
'videoBitrate': targetBitrate,
|
|
'fps': targetFps,
|
|
'width': width,
|
|
'height': height,
|
|
'portrait': portrait,
|
|
'rotation': rotation,
|
|
});
|
|
}
|
|
|
|
/// Ripresa dopo pausa: resetta stati RTMP residui (CONNECTING/RECONNECTING).
|
|
static Future<void> resumeStream({
|
|
required String rtmpUrl,
|
|
int targetBitrate = 3000000,
|
|
int targetFps = 30,
|
|
int width = 1280,
|
|
int height = 720,
|
|
bool portrait = false,
|
|
int rotation = 0,
|
|
}) async {
|
|
await _channel.invokeMethod('resumeStream', {
|
|
'rtmpUrl': rtmpUrl,
|
|
'videoBitrate': targetBitrate,
|
|
'fps': targetFps,
|
|
'width': width,
|
|
'height': height,
|
|
'portrait': portrait,
|
|
'rotation': rotation,
|
|
});
|
|
}
|
|
|
|
static Future<void> stopStream() async {
|
|
await _channel.invokeMethod('stopStream');
|
|
}
|
|
|
|
static Future<void> pauseStream() async {
|
|
await _channel.invokeMethod('pauseStream');
|
|
}
|
|
|
|
static Future<Map<String, dynamic>?> getMetrics() async {
|
|
final result =
|
|
await _channel.invokeMethod<Map<dynamic, dynamic>>('getMetrics');
|
|
return result?.map((key, value) => MapEntry(key.toString(), value));
|
|
}
|
|
|
|
static EventChannel get metricsStream => _metricsChannel;
|
|
}
|