增加两个视频合成为画中画

增加两个视频合成为画中画
pull/107/head
xufulong 7 years ago
parent 224ccd6179
commit 126d846080
  1. 2
      README.md
  2. 19
      app/src/main/java/com/frank/ffmpeg/activity/VideoHandleActivity.java
  3. 17
      app/src/main/java/com/frank/ffmpeg/util/FFmpegUtil.java
  4. 34
      app/src/main/res/layout/activity_video_handle.xml
  5. 1
      app/src/main/res/values/strings.xml

@ -15,6 +15,8 @@ android端基于FFmpeg库的使用。<br>
- #### 视频剪切 - #### 视频剪切
- #### 视频转码 - #### 视频转码
- #### 视频截图 - #### 视频截图
- #### 视频降噪
- #### 视频抽帧
- #### 视频转GIF动图 - #### 视频转GIF动图
- #### 视频添加水印 - #### 视频添加水印
- #### 视频画面拼接 - #### 视频画面拼接

@ -76,6 +76,7 @@ public class VideoHandleActivity extends AppCompatActivity implements View.OnCli
findViewById(R.id.btn_reverse_video).setOnClickListener(this); findViewById(R.id.btn_reverse_video).setOnClickListener(this);
findViewById(R.id.btn_denoise_video).setOnClickListener(this); findViewById(R.id.btn_denoise_video).setOnClickListener(this);
findViewById(R.id.btn_to_image).setOnClickListener(this); findViewById(R.id.btn_to_image).setOnClickListener(this);
findViewById(R.id.btn_pip).setOnClickListener(this);
} }
private void setVisible() { 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_reverse_video).setVisibility(View.VISIBLE);
findViewById(R.id.btn_denoise_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_to_image).setVisibility(View.VISIBLE);
findViewById(R.id.btn_pip).setVisibility(View.VISIBLE);
} }
private void setGone() { 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_reverse_video).setVisibility(View.GONE);
findViewById(R.id.btn_denoise_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_to_image).setVisibility(View.GONE);
findViewById(R.id.btn_pip).setVisibility(View.GONE);
} }
@Override @Override
@ -153,6 +156,9 @@ public class VideoHandleActivity extends AppCompatActivity implements View.OnCli
case R.id.btn_to_image: case R.id.btn_to_image:
handleType = 12; handleType = 12;
break; break;
case R.id.btn_pip:
handleType = 13;
break;
default: default:
handleType = 0; handleType = 0;
break; break;
@ -291,6 +297,19 @@ public class VideoHandleActivity extends AppCompatActivity implements View.OnCli
int mFrameRate = 10;//帧率(从视频中每秒抽多少帧) int mFrameRate = 10;//帧率(从视频中每秒抽多少帧)
commandLine = FFmpegUtil.videoToImage(srcFile, mStartTime, mDuration, mFrameRate, imagePath); commandLine = FFmpegUtil.videoToImage(srcFile, mStartTime, mDuration, mFrameRate, imagePath);
break; 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: default:
break; break;
} }

@ -299,4 +299,21 @@ public class FFmpegUtil {
return toImage.split(" "); 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(" ");
}
} }

@ -24,21 +24,21 @@
android:id="@+id/btn_video_transform" android:id="@+id/btn_video_transform"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="10dp" android:layout_marginTop="4dp"
android:text="@string/video_transform"/> android:text="@string/video_transform"/>
<Button <Button
android:id="@+id/btn_video_cut" android:id="@+id/btn_video_cut"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="10dp" android:layout_marginTop="4dp"
android:text="@string/video_cut"/> android:text="@string/video_cut"/>
<Button <Button
android:id="@+id/btn_video_concat" android:id="@+id/btn_video_concat"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="10dp" android:layout_marginTop="4dp"
android:text="@string/video_concat" android:text="@string/video_concat"
android:visibility="gone"/> android:visibility="gone"/>
@ -46,28 +46,28 @@
android:id="@+id/btn_screen_shot" android:id="@+id/btn_screen_shot"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="10dp" android:layout_marginTop="4dp"
android:text="@string/video_screen_shot"/> android:text="@string/video_screen_shot"/>
<Button <Button
android:id="@+id/btn_water_mark" android:id="@+id/btn_water_mark"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="10dp" android:layout_marginTop="4dp"
android:text="@string/video_water_mark"/> android:text="@string/video_water_mark"/>
<Button <Button
android:id="@+id/btn_generate_gif" android:id="@+id/btn_generate_gif"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="10dp" android:layout_marginTop="4dp"
android:text="@string/video_to_gif"/> android:text="@string/video_to_gif"/>
<Button <Button
android:id="@+id/btn_screen_record" android:id="@+id/btn_screen_record"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="10dp" android:layout_marginTop="4dp"
android:text="@string/video_screen_record" android:text="@string/video_screen_record"
android:visibility="gone"/> android:visibility="gone"/>
@ -75,43 +75,51 @@
android:id="@+id/btn_combine_video" android:id="@+id/btn_combine_video"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="10dp" android:layout_marginTop="4dp"
android:text="@string/video_from_photo"/> android:text="@string/video_from_photo"/>
<Button <Button
android:id="@+id/btn_play_video" android:id="@+id/btn_play_video"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="10dp" android:layout_marginTop="4dp"
android:text="@string/video_play"/> android:text="@string/video_play"/>
<Button <Button
android:id="@+id/btn_multi_video" android:id="@+id/btn_multi_video"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="10dp" android:layout_marginTop="4dp"
android:text="@string/video_multi"/> android:text="@string/video_multi"/>
<Button <Button
android:id="@+id/btn_reverse_video" android:id="@+id/btn_reverse_video"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="10dp" android:layout_marginTop="4dp"
android:text="@string/video_reverse"/> android:text="@string/video_reverse"/>
<Button <Button
android:id="@+id/btn_denoise_video" android:id="@+id/btn_denoise_video"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="10dp" android:layout_marginTop="4dp"
android:text="@string/video_denoise"/> android:text="@string/video_denoise"/>
<Button <Button
android:id="@+id/btn_to_image" android:id="@+id/btn_to_image"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="10dp" android:layout_marginTop="4dp"
android:text="@string/video_image"/> android:text="@string/video_image"/>
<Button
android:id="@+id/btn_pip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:text="@string/video_pip"/>
</LinearLayout> </LinearLayout>
</ScrollView> </ScrollView>

@ -38,6 +38,7 @@
<string name="video_reverse">视频倒播</string> <string name="video_reverse">视频倒播</string>
<string name="video_denoise">视频降噪</string> <string name="video_denoise">视频降噪</string>
<string name="video_image">视频转图片</string> <string name="video_image">视频转图片</string>
<string name="video_pip">视频画中画</string>
<string name="swap">切换</string> <string name="swap">切换</string>
<string name="start">开始</string> <string name="start">开始</string>

Loading…
Cancel
Save