I'm trying to convert images into a video slideshow with some transition. I have used flutter_ffmpeg plugin , with this plugin I have created with only 3 images but I want to add n numbers of images but couldn't able to find solutions for it. I tried to add more images but it throws error.
I'm gonna add some piece of code below :
- Instance of FlutterFFmpeg
final FlutterFFmpeg _flutterFFmpeg = FlutterFFmpeg();
- Picking multiple images from the gallery and applying command to convert images into a video
void mergeImageVideo() async {
final ImagePicker picker = ImagePicker();
final images = await picker.pickMultiImage();
var im1 = images[0].path;
var im2 = images[1].path;
var im3 = images[2].path;
//-shortest
openLoadingDialog(context, "Creating video");
generateFilePath("ImageVideoMerge").then((outputFile) {
var backgroundColor = 'FFF44336';
String ffmpegCommand = VideoUtil.generateImagesToVideoScript(
im1, im2, im3, outputFile, 'mpeg4', '', backgroundColor);
print("ffmpegCommand==> $ffmpegCommand");
_flutterFFmpeg.execute(ffmpegCommand).then((v) {
if (v == 0) {
var file = File(outputFile);
Navigator.pop(context);
showSnackBar(context, "Images Added Successfully", Colors.black);
updateVideoPlayer(file);
} else {
Navigator.pop(context);
}
}).then((executionId) {
});
});
}
method to get ffmpeg command (images into video with scale transition)
static String generateImagesToVideoScript(
String image1Path,
String image2Path,
String image3Path,
String videoFilePath,
String videoCodec,
String customOptions,
String backgroundColor
) {
// ignore: prefer_interpolation_to_compose_strings
return "-hide_banner -y -loop 1 -i '" +
image1Path +
"' " +
"-loop 1 -i \"" +
image2Path +
"\" " +
"-loop 1 -i \"" +
image3Path +
"\" " +
"-filter_complex " +
"\" " +
"[0:v]setpts=PTS-STARTPTS,scale=w=640:h=424,setsar=sar=1/1,split=2[stream1out1][stream1out2];" +
"[1:v]setpts=PTS-STARTPTS,scale=w=640:h=424,setsar=sar=1/1,split=2[stream2out1][stream2out2];" +
"[2:v]setpts=PTS-STARTPTS,scale=w=640:h=424,setsar=sar=1/1,split=2[stream3out1][stream3out2];" +
"[stream1out1]pad=width=640:height=427:x=(640-iw)/2:y=(427-ih)/2:color=#$backgroundColor,trim=duration=3,select=lte(n\\,90)[stream1overlaid];" +
"[stream1out2]pad=width=640:height=427:x=(640-iw)/2:y=(427-ih)/2:color=#$backgroundColor,trim=duration=1,select=lte(n\\,30)[stream1ending];" +
"[stream2out1]pad=width=640:height=427:x=(640-iw)/2:y=(427-ih)/2:color=#$backgroundColor,trim=duration=2,select=lte(n\\,60)[stream2overlaid];" +
"[stream2out2]pad=width=640:height=427:x=(640-iw)/2:y=(427-ih)/2:color=#$backgroundColor,trim=duration=1,select=lte(n\\,30),split=2[stream2starting][stream2ending];" +
"[stream3out1]pad=width=640:height=427:x=(640-iw)/2:y=(427-ih)/2:color=#$backgroundColor,trim=duration=2,select=lte(n\\,60)[stream3overlaid];" +
"[stream3out2]pad=width=640:height=427:x=(640-iw)/2:y=(427-ih)/2:color=#$backgroundColor,trim=duration=1,select=lte(n\\,30)[stream3starting];" +
"[stream2starting][stream1ending]blend=all_expr='if(gte(X,(W/2)*T/1)*lte(X,W-(W/2)*T/1),B,A)':shortest=1[stream2blended];" +
"[stream3starting][stream2ending]blend=all_expr='if(gte(X,(W/2)*T/1)*lte(X,W-(W/2)*T/1),B,A)':shortest=1[stream3blended];" +
"[stream1overlaid][stream2blended][stream2overlaid][stream3blended][stream3overlaid]concat=n=5:v=1:a=0,scale=w=640:h=424,format=yuv420p[video]\"" +
" -map [video] -vsync 2 -async 1 " +
customOptions +
"-c:v " +
videoCodec +
" -r 30 " +
videoFilePath;
}