diff --git a/README.md b/README.md index 9e6a7fe..8f92a8f 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,8 @@ android端基于FFmpeg库的使用。
- #### 视频剪切 - #### 视频转码 - #### 视频截图 +- #### 视频降噪 +- #### 视频抽帧 - #### 视频转GIF动图 - #### 视频添加水印 - #### 视频画面拼接 diff --git a/app/src/main/java/com/frank/ffmpeg/activity/VideoHandleActivity.java b/app/src/main/java/com/frank/ffmpeg/activity/VideoHandleActivity.java index f2d0630..cf50e19 100644 --- a/app/src/main/java/com/frank/ffmpeg/activity/VideoHandleActivity.java +++ b/app/src/main/java/com/frank/ffmpeg/activity/VideoHandleActivity.java @@ -76,6 +76,7 @@ public class VideoHandleActivity extends AppCompatActivity implements View.OnCli findViewById(R.id.btn_reverse_video).setOnClickListener(this); findViewById(R.id.btn_denoise_video).setOnClickListener(this); findViewById(R.id.btn_to_image).setOnClickListener(this); + findViewById(R.id.btn_pip).setOnClickListener(this); } private void setVisible() { @@ -92,6 +93,7 @@ public class VideoHandleActivity extends AppCompatActivity implements View.OnCli findViewById(R.id.btn_reverse_video).setVisibility(View.VISIBLE); findViewById(R.id.btn_denoise_video).setVisibility(View.VISIBLE); findViewById(R.id.btn_to_image).setVisibility(View.VISIBLE); + findViewById(R.id.btn_pip).setVisibility(View.VISIBLE); } private void setGone() { @@ -108,6 +110,7 @@ public class VideoHandleActivity extends AppCompatActivity implements View.OnCli findViewById(R.id.btn_reverse_video).setVisibility(View.GONE); findViewById(R.id.btn_denoise_video).setVisibility(View.GONE); findViewById(R.id.btn_to_image).setVisibility(View.GONE); + findViewById(R.id.btn_pip).setVisibility(View.GONE); } @Override @@ -153,6 +156,9 @@ public class VideoHandleActivity extends AppCompatActivity implements View.OnCli case R.id.btn_to_image: handleType = 12; break; + case R.id.btn_pip: + handleType = 13; + break; default: handleType = 0; break; @@ -291,6 +297,19 @@ public class VideoHandleActivity extends AppCompatActivity implements View.OnCli int mFrameRate = 10;//帧率(从视频中每秒抽多少帧) commandLine = FFmpegUtil.videoToImage(srcFile, mStartTime, mDuration, mFrameRate, imagePath); break; + case 13://两个视频合成画中画 + String inputFile1 = PATH + File.separator + "beyond.mp4"; + String inputFile2 = PATH + File.separator + "small_girl.mp4"; + if (!FileUtil.checkFileExist(inputFile1) && !FileUtil.checkFileExist(inputFile2)){ + return; + } + //x、y坐标点需要根据全屏视频与小视频大小,进行计算 + //比如:全屏视频为320x240,小视频为120x90,那么x=200 y=150 + int x = 200; + int y = 150; + String picInPic = PATH + File.separator + "PicInPic.mp4"; + commandLine = FFmpegUtil.picInPicVideo(inputFile1, inputFile2, x, y, picInPic); + break; default: break; } 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 fa07f50..d6baf90 100644 --- a/app/src/main/java/com/frank/ffmpeg/util/FFmpegUtil.java +++ b/app/src/main/java/com/frank/ffmpeg/util/FFmpegUtil.java @@ -299,4 +299,21 @@ public class FFmpegUtil { return toImage.split(" "); } + /** + * 视频叠加成画中画 + * @param inputFile1 输入文件 + * @param inputFile2 输入文件 + * @param targetFile 输出文件 + * @param x 小视频起点x坐标 + * @param y 小视频起点y坐标 + * + * @return 视频画中画的命令行 + */ + @SuppressLint("DefaultLocale") + public static String[] picInPicVideo(String inputFile1, String inputFile2, int x, int y, String targetFile){ + String reverseVideo = "ffmpeg -i %s -i %s -filter_complex overlay=%d:%d %s"; + reverseVideo = String.format(reverseVideo, inputFile1, inputFile2, x, y, targetFile); + return reverseVideo.split(" "); + } + } diff --git a/app/src/main/res/layout/activity_video_handle.xml b/app/src/main/res/layout/activity_video_handle.xml index 8ea597c..73a5c85 100644 --- a/app/src/main/res/layout/activity_video_handle.xml +++ b/app/src/main/res/layout/activity_video_handle.xml @@ -24,21 +24,21 @@ android:id="@+id/btn_video_transform" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="10dp" + android:layout_marginTop="4dp" android:text="@string/video_transform"/>