画中画优化:让用户选择两个文件;尝试使用表达式来指定画中画的位置

pull/221/head
Qiming 2 years ago
parent 23394279e7
commit e77e4202e3
  1. 23
      app/src/main/java/com/frank/ffmpeg/activity/VideoHandleActivity.kt
  2. 26
      app/src/main/java/com/frank/ffmpeg/util/FFmpegUtil.java

@ -53,6 +53,9 @@ class VideoHandleActivity : BaseActivity() {
private var list :List<String> ?= null private var list :List<String> ?= null
private var isJointing = false private var isJointing = false
private var firstSrcFile: String = ""
private var selectingSecondFile = false
@SuppressLint("HandlerLeak") @SuppressLint("HandlerLeak")
private val mHandler = object : Handler() { private val mHandler = object : Handler() {
override fun handleMessage(msg: Message) { override fun handleMessage(msg: Message) {
@ -295,17 +298,25 @@ class VideoHandleActivity : BaseActivity() {
commandLine = FFmpegUtil.videoToImage(srcFile, mStartTime, mDuration, mFrameRate, outputPath) commandLine = FFmpegUtil.videoToImage(srcFile, mStartTime, mDuration, mFrameRate, outputPath)
} }
12 -> { //combine into picture-in-picture video 12 -> { //combine into picture-in-picture video
val inputFile1 = PATH + File.separator + "beyond.mp4" // NOTE: The first video should be bigger than the second one.
val inputFile2 = PATH + File.separator + "small_girl.mp4" if (selectingSecondFile) { // User has selected 2 files
if (!FileUtil.checkFileExist(inputFile1) && !FileUtil.checkFileExist(inputFile2)) { selectingSecondFile = false
if (!FileUtil.checkFileExist(firstSrcFile) && !FileUtil.checkFileExist(srcFile)) {
showToast("请选择两个源文件")
return return
} }
//x and y coordinate points need to be calculated according to the size of full video and small video //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 //For example: full video is 320x240, small video is 120x90, so x=200 y=150
val x = 200 //val x = 200
val y = 150 //val y = 150
outputPath = PATH + File.separator + "PicInPic.mp4" outputPath = PATH + File.separator + "PicInPic.mp4"
commandLine = FFmpegUtil.picInPicVideo(inputFile1, inputFile2, x, y, outputPath) commandLine = FFmpegUtil.picInPicVideoInCorner(firstSrcFile, srcFile, 2, outputPath)
} else {
firstSrcFile = srcFile
selectingSecondFile = true
showToast("画中画:请再选择一个文件")
selectFile() // pop up to select another source file
}
} }
13 -> { //playing speed of video 13 -> { //playing speed of video
outputPath = PATH + File.separator + "speed.mp4" outputPath = PATH + File.separator + "speed.mp4"

@ -638,6 +638,32 @@ public class FFmpegUtil {
return insert(pipVideo.split(" "), 2, inputPath1, 4, inputPath2, outputPath); 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) * move moov box in the front of mdat box, when moox box is behind mdat box(only mp4)
* *

Loading…
Cancel
Save