diff --git a/app/src/main/java/com/frank/ffmpeg/activity/VideoHandleActivity.kt b/app/src/main/java/com/frank/ffmpeg/activity/VideoHandleActivity.kt index 75131ba..30e8233 100644 --- a/app/src/main/java/com/frank/ffmpeg/activity/VideoHandleActivity.kt +++ b/app/src/main/java/com/frank/ffmpeg/activity/VideoHandleActivity.kt @@ -53,6 +53,9 @@ class VideoHandleActivity : BaseActivity() { private var list :List ?= null private var isJointing = false + private var firstSrcFile: String = "" + private var selectingSecondFile = false + @SuppressLint("HandlerLeak") private val mHandler = object : Handler() { override fun handleMessage(msg: Message) { @@ -295,17 +298,25 @@ class VideoHandleActivity : BaseActivity() { commandLine = FFmpegUtil.videoToImage(srcFile, mStartTime, mDuration, mFrameRate, outputPath) } 12 -> { //combine into picture-in-picture video - val inputFile1 = PATH + File.separator + "beyond.mp4" - val inputFile2 = PATH + File.separator + "small_girl.mp4" - if (!FileUtil.checkFileExist(inputFile1) && !FileUtil.checkFileExist(inputFile2)) { - return + // NOTE: The first video should be bigger than the second one. + if (selectingSecondFile) { // User has selected 2 files + selectingSecondFile = false + if (!FileUtil.checkFileExist(firstSrcFile) && !FileUtil.checkFileExist(srcFile)) { + showToast("请选择两个源文件") + return + } + //x and y coordinate points need to be calculated according to the size of full video and small video + //For example: full video is 320x240, small video is 120x90, so x=200 y=150 + //val x = 200 + //val y = 150 + outputPath = PATH + File.separator + "PicInPic.mp4" + commandLine = FFmpegUtil.picInPicVideoInCorner(firstSrcFile, srcFile, 2, outputPath) + } else { + firstSrcFile = srcFile + selectingSecondFile = true + showToast("画中画:请再选择一个文件") + selectFile() // pop up to select another source file } - //x and y coordinate points need to be calculated according to the size of full video and small video - //For example: full video is 320x240, small video is 120x90, so x=200 y=150 - val x = 200 - val y = 150 - outputPath = PATH + File.separator + "PicInPic.mp4" - commandLine = FFmpegUtil.picInPicVideo(inputFile1, inputFile2, x, y, outputPath) } 13 -> { //playing speed of video outputPath = PATH + File.separator + "speed.mp4" diff --git a/app/src/main/java/com/frank/ffmpeg/util/FFmpegUtil.java b/app/src/main/java/com/frank/ffmpeg/util/FFmpegUtil.java index 9406f1f..7262420 100644 --- a/app/src/main/java/com/frank/ffmpeg/util/FFmpegUtil.java +++ b/app/src/main/java/com/frank/ffmpeg/util/FFmpegUtil.java @@ -638,6 +638,32 @@ public class FFmpegUtil { return insert(pipVideo.split(" "), 2, inputPath1, 4, inputPath2, outputPath); } + /** + * convert videos into picture-in-picture mode + * + * @param whichCorner 0: top-left; 1: top-right; 2: bottom-left; 3: bottom-right + * @return convert success or not + */ + public static String[] picInPicVideoInCorner(String inputPath1, String inputPath2, int whichCorner, String outputPath) { + String pipCmd = "ffmpeg -i -i -filter_complex "; + switch (whichCorner) { + case 1: + pipCmd += "overlay=W-w"; + break; + case 2: + pipCmd += "overlay=0:H-h"; + break; + case 3: + pipCmd += "overlay=W-w:H-h"; + break; + case 0: + default: + pipCmd += "overlay"; + break; + } + return insert(pipCmd.split(" "), 2, inputPath1, 4, inputPath2, outputPath); + } + /** * move moov box in the front of mdat box, when moox box is behind mdat box(only mp4) *