I’m recording video from both the front and back cameras and I get a PIP video and a horizontal stacked video. I need to merge both videos after that. The problem with merging is that it requires both the videos (PIP and stacked) to have the same resolution and aspect ratio. This is not the case. So the FFMPEG command being executed in code to generate both these videos needs to be modified to make the resolution and aspect ratio the same.
//app -> build.gradle
implementation "com.writingminds:FFmpegAndroid:0.3.2"
private fun connectFfmPeg() {
val overlayX = 10
val overlayY = 10
val overlayWidth = 200
val overlayHeight = 350
outputFile1 = createVideoPath().absolutePath
outputFile2 = createVideoPath().absolutePath
//Command to generate PIP video
val cmd1 = arrayOf(
"-y",
"-i",
videoPath1,
"-i",
videoPath2,
"-filter_complex",
"[1:v]scale=$overlayWidth:$overlayHeight [pip]; [0:v][pip] overlay=$overlayX:$overlayY",
"-preset",
"ultrafast",
outputFile1
)
//Command to generate horizontal stack video
val cmd2 = arrayOf(
"-y",
"-i",
videoPath1,
"-i",
videoPath2,
"-filter_complex",
"hstack",
"-preset",
"ultrafast",
outputFile2
)
val ffmpeg = FFmpeg.getInstance(this)
//Both commands are executed
//Following execution code is OK
//Omitted for brevity
}
Here is mergeVideos()
executed lastly.
private fun mergeVideos(ffmpeg: FFmpeg) {
//Sample command:
/*
ffmpeg -y -i output_a.mp4 -i output_b.mp4
-filter_complex "[0:v:0][0:a:0][1:v:0][1:a:0]concat=n=2:v=1:a=1[outv][outa]"
-map "[outv]" -map "[outa]" -preset "ultrafast" output.mp4
*/
finalOutputFile = createVideoPath().absolutePath
val cmd = arrayOf(
"-y",
"-i",
outputFile1,
"-i",
outputFile2,
"-filter_complex",
"[0:v:0][0:a:0][1:v:0][1:a:0]concat=n=2:v=1:a=1[outv][outa]",
"-map", "[outv]",
"-map", "[outa]",
"-preset", "ultrafast",
finalOutputFile
)
//Execution code omitted for brevity
}
Error: Upon execution of mergeVideos()
, there is no progress or failure method called. The Logcat stays where it is and the app does not crash either.
Possible solution:
Once I got the generated PIP and horizontal stacked videos to my device’s local storage, I tried out some FFMPEG commands on the prompt to process them after moving them to my laptop and it works on the command line:
//First two commands can't be executed in Kotlin code
//This is the main problem
ffmpeg -i v1.mp4 -vf "scale=640:640,setdar=1:1" output_a.mp4
ffmpeg -i v2.mp4 -vf "scale=640:640,setdar=1:1" output_b.mp4
ffmpeg -y -i output_a.mp4 -i output_b.mp4 -filter_complex "[0:v:0][0:a:0][1:v:0][1:a:0]concat=n=2:v=1:a=1[outv][outa]" -map "[outv]" -map "[outa]" -preset "ultrafast" output.mp4
//Merge is successful via command prompt
Please suggest a solution