mergeVideoAndAudio function

Future<void> mergeVideoAndAudio({
  1. required Uri videoUrl,
  2. required Uri audioUrl,
  3. required int totalFileDuration,
  4. required void error(
    1. String e
    ),
  5. required void onProgress(
    1. double progress
    ),
  6. required void onComplete(
    1. File file
    ),
})

Implementation

Future<void> mergeVideoAndAudio({
  required Uri videoUrl,
  required Uri audioUrl,
  required int totalFileDuration,
  required void Function(String e) error,
  required void Function(double progress) onProgress,
  required void Function(File file) onComplete,
}) async {
  final appDir = await getApplicationDocumentsDirectory();
  final outputFilePath =
      '${appDir.path}/${DateTime.now().millisecondsSinceEpoch}.mp4';

  String ffmpegCommand = '-i $videoUrl -i $audioUrl -c copy $outputFilePath';
  int? lastReportedProgress;

  await FFmpegKit.executeAsync(ffmpegCommand, (session) async {
    final returnCode = await session.getReturnCode();
    if (ReturnCode.isSuccess(returnCode)) {
      onComplete(File(outputFilePath));
      NotificationManager.dismissNotification(
          NotificationManager.getNotificationID(videoUrl.toString()));
    } else {
      error("Failed to merge video and audio streams.");
    }
  }, (lo) {
    log("FFmpeg Log: ${lo.getMessage()}");
  }, (statistics) {
    final progress = //= (statistics.time * 100) ~/ totalFileDuration;
        ((statistics.getTime() * 100) ~/ totalFileDuration).clamp(0, 100);
    if (progress != lastReportedProgress) {
      lastReportedProgress = progress;
      onProgress(progress.toDouble());
    }
    NotificationManager.showProgressNotification(
      notificationID:
          NotificationManager.getNotificationID(videoUrl.toString()),
      title: 'Downloading...',
      progress: progress.toDouble(),
    );
  });
  onProgress(100);
}