From 86bf41034220bd3285c1643a4f6652981efdb948 Mon Sep 17 00:00:00 2001 From: Rutvik Tak <65209850+rutvik110@users.noreply.github.com> Date: Sat, 10 Feb 2024 06:58:33 +0530 Subject: [PATCH 1/5] images to video generation cli command tests added --- test/ffmpeg/ffmpeg_command_test.dart | 36 ++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/test/ffmpeg/ffmpeg_command_test.dart b/test/ffmpeg/ffmpeg_command_test.dart index d5d7b2c..5a0fbc4 100644 --- a/test/ffmpeg/ffmpeg_command_test.dart +++ b/test/ffmpeg/ffmpeg_command_test.dart @@ -113,6 +113,42 @@ void main() { ), ); }); + + test("converts a group of images to a video", () { + final command = FfmpegCommand.simple( + inputs: [ + // file%d.png represents images named like file0.png, file1.png, file2.png, etc. + FfmpegInput.asset("assets/images/file%d.png"), + + FfmpegInput.asset("assets/audio/audio.mp3"), + ], + args: [ + const CliArg(name: 'y'), + const CliArg(name: 'c:a', value: 'aac'), + const CliArg(name: 'qscale:v', value: '1'), + ], + outputFilepath: 'assets/output/file.mp4', + ); + + expect( + command.toCli(), + const CliCommand( + executable: 'ffmpeg', + args: [ + "-i", + "assets/images/file%d.png", + "-i", + "assets/audio/audio.mp3", + "-y", + "-c:a", + "aac", + "-qscale:v", + "1", + "assets/output/file.mp4" + ], + ), + ); + }); }); }); } From eefc3f463583f2d977378b979ebabb82c1c35dbc Mon Sep 17 00:00:00 2001 From: Rutvik Tak <65209850+rutvik110@users.noreply.github.com> Date: Sun, 11 Feb 2024 10:43:23 +0530 Subject: [PATCH 2/5] test updates --- test/ffmpeg/ffmpeg_command_test.dart | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/ffmpeg/ffmpeg_command_test.dart b/test/ffmpeg/ffmpeg_command_test.dart index 5a0fbc4..5b6d660 100644 --- a/test/ffmpeg/ffmpeg_command_test.dart +++ b/test/ffmpeg/ffmpeg_command_test.dart @@ -117,8 +117,8 @@ void main() { test("converts a group of images to a video", () { final command = FfmpegCommand.simple( inputs: [ - // file%d.png represents images named like file0.png, file1.png, file2.png, etc. - FfmpegInput.asset("assets/images/file%d.png"), + // screenshot%d.png represents images named like screenshot0.png, screenshot1.png, screenshot2.png, etc. + FfmpegInput.asset("assets/images/screenshot%d.png"), FfmpegInput.asset("assets/audio/audio.mp3"), ], @@ -127,7 +127,7 @@ void main() { const CliArg(name: 'c:a', value: 'aac'), const CliArg(name: 'qscale:v', value: '1'), ], - outputFilepath: 'assets/output/file.mp4', + outputFilepath: 'assets/output/generated_video.mp4', ); expect( @@ -136,7 +136,7 @@ void main() { executable: 'ffmpeg', args: [ "-i", - "assets/images/file%d.png", + "assets/images/screenshot%d.png", "-i", "assets/audio/audio.mp3", "-y", @@ -144,7 +144,7 @@ void main() { "aac", "-qscale:v", "1", - "assets/output/file.mp4" + "assets/output/generated_video.mp4" ], ), ); From 008cc3bd3b2f703e4935692cead26b07b742d7f8 Mon Sep 17 00:00:00 2001 From: Rutvik Tak <65209850+rutvik110@users.noreply.github.com> Date: Sun, 11 Feb 2024 10:47:34 +0530 Subject: [PATCH 3/5] moved ffmpeg use cases tests to new file --- test/ffmpeg/ffmpeg_command_test.dart | 36 ----------------------- test/use_cases/use_cases_test.dart | 44 ++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 36 deletions(-) create mode 100644 test/use_cases/use_cases_test.dart diff --git a/test/ffmpeg/ffmpeg_command_test.dart b/test/ffmpeg/ffmpeg_command_test.dart index 5b6d660..d5d7b2c 100644 --- a/test/ffmpeg/ffmpeg_command_test.dart +++ b/test/ffmpeg/ffmpeg_command_test.dart @@ -113,42 +113,6 @@ void main() { ), ); }); - - test("converts a group of images to a video", () { - final command = FfmpegCommand.simple( - inputs: [ - // screenshot%d.png represents images named like screenshot0.png, screenshot1.png, screenshot2.png, etc. - FfmpegInput.asset("assets/images/screenshot%d.png"), - - FfmpegInput.asset("assets/audio/audio.mp3"), - ], - args: [ - const CliArg(name: 'y'), - const CliArg(name: 'c:a', value: 'aac'), - const CliArg(name: 'qscale:v', value: '1'), - ], - outputFilepath: 'assets/output/generated_video.mp4', - ); - - expect( - command.toCli(), - const CliCommand( - executable: 'ffmpeg', - args: [ - "-i", - "assets/images/screenshot%d.png", - "-i", - "assets/audio/audio.mp3", - "-y", - "-c:a", - "aac", - "-qscale:v", - "1", - "assets/output/generated_video.mp4" - ], - ), - ); - }); }); }); } diff --git a/test/use_cases/use_cases_test.dart b/test/use_cases/use_cases_test.dart new file mode 100644 index 0000000..f0fe6f5 --- /dev/null +++ b/test/use_cases/use_cases_test.dart @@ -0,0 +1,44 @@ +import 'package:ffmpeg_cli/ffmpeg_cli.dart'; +import 'package:test/test.dart'; + +void main() { + group("FFMPEG", () { + group("use cases", () { + test("converts a group of screenshots to a video", () { + final command = FfmpegCommand.simple( + inputs: [ + // screenshot%d.png represents images named in format screenshot0.png, screenshot1.png, screenshot2.png, etc. + FfmpegInput.asset("assets/images/screenshot%d.png"), + + FfmpegInput.asset("assets/audio/audio.mp3"), + ], + args: [ + const CliArg(name: 'y'), + const CliArg(name: 'c:a', value: 'aac'), + const CliArg(name: 'qscale:v', value: '1'), + ], + outputFilepath: 'assets/output/generated_video.mp4', + ); + + expect( + command.toCli(), + const CliCommand( + executable: 'ffmpeg', + args: [ + "-i", + "assets/images/screenshot%d.png", + "-i", + "assets/audio/audio.mp3", + "-y", + "-c:a", + "aac", + "-qscale:v", + "1", + "assets/output/generated_video.mp4" + ], + ), + ); + }); + }); + }); +} From 6f033a63c3af4363cb40038902d58ee414c0274e Mon Sep 17 00:00:00 2001 From: Rutvik Tak <65209850+rutvik110@users.noreply.github.com> Date: Sun, 11 Feb 2024 11:37:47 +0530 Subject: [PATCH 4/5] separated tests for image to video creation with/without audio, included a video formatting option --- test/use_cases/use_cases_test.dart | 64 +++++++++++++++++++++++++++--- 1 file changed, 59 insertions(+), 5 deletions(-) diff --git a/test/use_cases/use_cases_test.dart b/test/use_cases/use_cases_test.dart index f0fe6f5..2eef8dd 100644 --- a/test/use_cases/use_cases_test.dart +++ b/test/use_cases/use_cases_test.dart @@ -4,18 +4,72 @@ import 'package:test/test.dart'; void main() { group("FFMPEG", () { group("use cases", () { - test("converts a group of screenshots to a video", () { + test("creates a video from a group of screenshots", () { final command = FfmpegCommand.simple( inputs: [ - // screenshot%d.png represents images named in format screenshot0.png, screenshot1.png, screenshot2.png, etc. + // screenshot%d.png represents images named in format screenshot0.png, + // screenshot1.png, etc. + FfmpegInput.asset("assets/images/screenshot%d.png"), + ], + args: [ + // Used to overwrite an existing output file without asking for + // confirmation. + const CliArg(name: 'y'), + + // Sets the video quality scale used while video encoding. + const CliArg(name: 'qscale:v', value: '1'), + + // Sets the pixel format for the video frames. + // + // Note: Not always necessary but may need to provide for generated video to + // be compatible with QuickTime and most other players. + // More info here, https://trac.ffmpeg.org/wiki/Encode/H.264#Encodingfordumbplayers + const CliArg(name: 'pix_fmt', value: 'yuv420p'), + ], + outputFilepath: 'assets/output/generated_video.mp4', + ); + + expect( + command.toCli(), + const CliCommand( + executable: 'ffmpeg', + args: [ + "-i", + "assets/images/screenshot%d.png", + "-y", + "-qscale:v", + "1", + "-pix_fmt", + "yuv420p", + "assets/output/generated_video.mp4", + ], + ), + ); + }); + + test("creates a video from a group of screenshots and an audio file", () { + final command = FfmpegCommand.simple( + inputs: [ + // screenshot%d.png represents images named in format screenshot0.png, + // screenshot1.png, etc. FfmpegInput.asset("assets/images/screenshot%d.png"), FfmpegInput.asset("assets/audio/audio.mp3"), ], args: [ + // Used to overwrite an existing output file without asking for + // confirmation. const CliArg(name: 'y'), - const CliArg(name: 'c:a', value: 'aac'), + + // Sets the video quality scale used while video encoding. const CliArg(name: 'qscale:v', value: '1'), + + // Sets the pixel format for the video frames. + // + // Note: Not always necessary but may need to provide for generated video to + // be compatible with QuickTime and most other players. + // More info here, https://trac.ffmpeg.org/wiki/Encode/H.264#Encodingfordumbplayers + const CliArg(name: 'pix_fmt', value: 'yuv420p'), ], outputFilepath: 'assets/output/generated_video.mp4', ); @@ -30,10 +84,10 @@ void main() { "-i", "assets/audio/audio.mp3", "-y", - "-c:a", - "aac", "-qscale:v", "1", + "-pix_fmt", + "yuv420p", "assets/output/generated_video.mp4" ], ), From 788540135510dac734b95a59637347554835b980 Mon Sep 17 00:00:00 2001 From: Rutvik Tak <65209850+rutvik110@users.noreply.github.com> Date: Sun, 11 Feb 2024 13:21:32 +0530 Subject: [PATCH 5/5] test output file names update --- test/use_cases/use_cases_test.dart | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test/use_cases/use_cases_test.dart b/test/use_cases/use_cases_test.dart index 2eef8dd..7222ab8 100644 --- a/test/use_cases/use_cases_test.dart +++ b/test/use_cases/use_cases_test.dart @@ -4,7 +4,7 @@ import 'package:test/test.dart'; void main() { group("FFMPEG", () { group("use cases", () { - test("creates a video from a group of screenshots", () { + test("create a video from a group of screenshots", () { final command = FfmpegCommand.simple( inputs: [ // screenshot%d.png represents images named in format screenshot0.png, @@ -26,7 +26,7 @@ void main() { // More info here, https://trac.ffmpeg.org/wiki/Encode/H.264#Encodingfordumbplayers const CliArg(name: 'pix_fmt', value: 'yuv420p'), ], - outputFilepath: 'assets/output/generated_video.mp4', + outputFilepath: 'assets/output/movie.mp4', ); expect( @@ -41,13 +41,13 @@ void main() { "1", "-pix_fmt", "yuv420p", - "assets/output/generated_video.mp4", + "assets/output/movie.mp4", ], ), ); }); - test("creates a video from a group of screenshots and an audio file", () { + test("create a video from a group of screenshots and an audio file", () { final command = FfmpegCommand.simple( inputs: [ // screenshot%d.png represents images named in format screenshot0.png, @@ -71,7 +71,7 @@ void main() { // More info here, https://trac.ffmpeg.org/wiki/Encode/H.264#Encodingfordumbplayers const CliArg(name: 'pix_fmt', value: 'yuv420p'), ], - outputFilepath: 'assets/output/generated_video.mp4', + outputFilepath: 'assets/output/movie.mp4', ); expect( @@ -88,7 +88,7 @@ void main() { "1", "-pix_fmt", "yuv420p", - "assets/output/generated_video.mp4" + "assets/output/movie.mp4" ], ), );