mergeVideoAndAudio function
Future<void>
mergeVideoAndAudio(
{ - required Uri videoUrl,
- required Uri audioUrl,
- required int totalFileDuration,
- required void error(
- String e
),
- required void onProgress(
- double progress
),
- required void onComplete(
- 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';
String ffmpegCommand = '-hwaccel auto -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(),
);
});
}