Merge pull request #221 from luqiming666/master

画中画优化:让用户选择两个文件;尝试使用表达式来指定画中画的位置;音频处理波形图的一个优化
pull/222/head
xufuji456 2 years ago committed by GitHub
commit c83d66a702
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      AndroidMedia/build.gradle
  2. 2
      app/build.gradle
  3. 2
      app/src/main/java/com/frank/ffmpeg/activity/AudioHandleActivity.kt
  4. 31
      app/src/main/java/com/frank/ffmpeg/activity/VideoHandleActivity.kt
  5. 32
      app/src/main/java/com/frank/ffmpeg/util/FFmpegUtil.java

@ -1,8 +1,8 @@
apply plugin: 'com.android.library'
//apply plugin: 'com.android.application'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
compileSdkVersion rootProject.ext.compileSdkVersion

@ -1,6 +1,6 @@
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
compileSdkVersion rootProject.ext.compileSdkVersion

@ -261,7 +261,7 @@ class AudioHandleActivity : BaseActivity() {
12 -> { // audio waveform
outputPath = PATH + File.separator + "waveform.png"
val resolution = "1280x720"
commandLine = FFmpegUtil.showAudioWaveform(srcFile, resolution, outputPath)
commandLine = FFmpegUtil.showAudioWaveform(srcFile, resolution, 1, outputPath)
}
13 -> { //audio encode
val pcmFile = PATH + File.separator + "raw.pcm"

@ -53,6 +53,9 @@ class VideoHandleActivity : BaseActivity() {
private var list :List<String> ?= 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"

@ -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)
*
@ -844,9 +870,9 @@ public class FFmpegUtil {
return insert(trimCmd.split(" "), 2, inputPath, outputPath);
}
public static String[] showAudioWaveform(String inputPath, String resolution, String outputPath) {
String waveformCmd = "ffmpeg -i -filter_complex showwavespic=s=%s";
waveformCmd = String.format(Locale.getDefault(), waveformCmd, resolution);
public static String[] showAudioWaveform(String inputPath, String resolution, int splitChannels, String outputPath) {
String waveformCmd = "ffmpeg -i -filter_complex showwavespic=s=%s:split_channels=%d";
waveformCmd = String.format(Locale.getDefault(), waveformCmd, resolution, splitChannels);
return insert(waveformCmd.split(" "), 2, inputPath, outputPath);
}

Loading…
Cancel
Save