compressVideo method

Future<void> compressVideo({
  1. required BuildContext context,
  2. required File video,
  3. required String outputPathWithFilename,
  4. bool deleteOriginalFile = false,
})

Implementation

Future<void> compressVideo({
  required BuildContext context,
  required File video,
  required String outputPathWithFilename,
  bool deleteOriginalFile = false,
}) async {
  try {
    // ✅ Create a StreamController to convert the plugin's "subscribe" into a Dart Stream
    final controller = StreamController<double>();

    // Subscribe to progress updates
    final subscription = VideoCompress.compressProgress$.subscribe((progress) {
      controller.add(progress); // Forward to our stream
    });

    // Show progress dialog using your existing ProgressDialog widget
    showDialog(
      context: context,
      barrierDismissible: false,
      builder: (context) {
        return ProgressDialog(progressStream: controller.stream);
      },
    );

    // Start video compression
    MediaInfo? mediaInfo = await VideoCompress.compressVideo(
      video.path,
      quality: VideoQuality.DefaultQuality,
      deleteOrigin: deleteOriginalFile,
    );

    // ✅ Clean up after compression
    subscription.unsubscribe(); // Stop listening
    await controller.close();

    // Close progress dialog
    if (context.mounted) {
      Navigator.of(context).pop();
    }

    // Save compressed video
    if (mediaInfo?.file != null) {
      final file = File(outputPathWithFilename);
      await file.writeAsBytes(await mediaInfo!.file!.readAsBytes());
    }
  } catch (e) {
    throw Exception(e);
  }
}