处理图片合成视频

处理图片合成视频
pull/107/head
xufulong 5 years ago
parent 5dd3f0eb8a
commit 50e8d72e98
  1. 31
      app/src/main/java/com/frank/ffmpeg/activity/VideoHandleActivity.java
  2. 33
      app/src/main/java/com/frank/ffmpeg/util/FFmpegUtil.java

@ -91,6 +91,10 @@ public class VideoHandleActivity extends BaseActivity {
@Override
public void onViewClick(View view) {
viewId = view.getId();
if (viewId == R.id.btn_combine_video) {
handlePhoto();
return;
}
selectFile();
}
@ -182,15 +186,6 @@ public class VideoHandleActivity extends BaseActivity {
// int recordTime = 10;
// commandLine = FFmpegUtil.screenRecord(screenSize, recordTime, screenRecord);
break;
case R.id.btn_combine_video://图片合成视频
//图片所在路径,图片命名格式img+number.jpg
String picturePath = PATH + File.separator + "img/";
if (!FileUtil.checkFileExist(picturePath)) {
return;
}
String combineVideo = PATH + File.separator + "combineVideo.mp4";
commandLine = FFmpegUtil.pictureToVideo(picturePath, combineVideo);
break;
case R.id.btn_multi_video://视频画面拼接:分辨率、时长、封装格式不一致时,先把视频源转为一致
String input1 = PATH + File.separator + "input1.mp4";
String input2 = PATH + File.separator + "input2.mp4";
@ -263,6 +258,24 @@ public class VideoHandleActivity extends BaseActivity {
}
}
/**
* 图片合成视频
*/
private void handlePhoto() {
// 图片所在路径,图片命名格式img+number.jpg
// 这里指定目录为根目录下img文件夹
String picturePath = PATH + "/frame/";
if (!FileUtil.checkFileExist(picturePath)) {
return;
}
String combineVideo = PATH + File.separator + "combineVideo.mp4";
int frameRate = 2;// 合成视频帧率建议:1-10 普通视频帧率一般为25
String[] commandLine = FFmpegUtil.pictureToVideo(picturePath, frameRate, combineVideo);
if (ffmpegHandler != null) {
ffmpegHandler.executeFFmpegCmd(commandLine);
}
}
@Override
protected void onDestroy() {
super.onDestroy();

@ -16,6 +16,7 @@ public class FFmpegUtil {
/**
* 使用ffmpeg命令行进行音频转码
*
* @param srcFile 源文件
* @param targetFile 目标文件后缀指定转码格式
* @return 转码后的文件
@ -28,6 +29,7 @@ public class FFmpegUtil {
/**
* 使用ffmpeg命令行进行音频剪切
*
* @param srcFile 源文件
* @param startTime 剪切的开始时间(单位为秒)
* @param duration 剪切时长(单位为秒)
@ -43,6 +45,7 @@ public class FFmpegUtil {
/**
* 使用ffmpeg命令行进行音频合并
*
* @param srcFile 源文件
* @param appendFile 待追加的文件
* @param targetFile 目标文件
@ -56,6 +59,7 @@ public class FFmpegUtil {
/**
* 使用ffmpeg命令行进行音频混合
*
* @param srcFile 源文件
* @param mixFile 待混合文件
* @param targetFile 目标文件
@ -71,6 +75,7 @@ public class FFmpegUtil {
/**
* 使用ffmpeg命令行进行音视频合成
*
* @param videoFile 视频文件
* @param audioFile 音频文件
* @param duration 视频时长
@ -87,6 +92,7 @@ public class FFmpegUtil {
/**
* 使用ffmpeg命令行进行抽取音频
*
* @param srcFile 原文件
* @param targetFile 目标文件
* @return 抽取后的音频文件
@ -100,6 +106,7 @@ public class FFmpegUtil {
/**
* 使用ffmpeg命令行进行抽取视频
*
* @param srcFile 原文件
* @param targetFile 目标文件
* @return 抽取后的视频文件
@ -114,6 +121,7 @@ public class FFmpegUtil {
/**
* 使用ffmpeg命令行进行视频转码
*
* @param srcFile 源文件
* @param targetFile 目标文件后缀指定转码格式
* @return 转码后的文件
@ -128,6 +136,7 @@ public class FFmpegUtil {
/**
* 使用ffmpeg命令行进行视频剪切
*
* @param srcFile 源文件
* @param startTime 剪切的开始时间(单位为秒)
* @param duration 剪切时长(单位为秒)
@ -143,6 +152,7 @@ public class FFmpegUtil {
/**
* 使用ffmpeg命令行进行视频截图
*
* @param srcFile 源文件
* @param time 截图开始时间
* @param size 图片尺寸大小
@ -157,6 +167,7 @@ public class FFmpegUtil {
/**
* 使用ffmpeg命令行给视频添加水印
*
* @param srcFile 源文件
* @param waterMark 水印文件路径
* @param targetFile 目标文件
@ -171,6 +182,7 @@ public class FFmpegUtil {
/**
* 使用ffmpeg命令行进行视频转成Gif动图
*
* @param srcFile 源文件
* @param startTime 开始时间
* @param duration 截取时长
@ -190,6 +202,7 @@ public class FFmpegUtil {
/**
* 使用ffmpeg命令行进行屏幕录制
*
* @param size 视频尺寸大小
* @param recordTime 录屏时间
* @param targetFile 目标文件
@ -207,15 +220,17 @@ public class FFmpegUtil {
/**
* 使用ffmpeg命令行进行图片合成视频
*
* @param srcFile 源文件
* @param frameRate 合成视频帧率
* @param targetFile 目标文件(mpg格式)
* @return 合成的视频文件
*/
@SuppressLint("DefaultLocale")
public static String[] pictureToVideo(String srcFile, String targetFile){
public static String[] pictureToVideo(String srcFile, int frameRate, String targetFile) {
//-f image2:代表使用image2格式,需要放在输入文件前面
String combineVideo = "ffmpeg -f image2 -r 1 -i %simg#d.jpg -vcodec mpeg4 %s";
combineVideo = String.format(combineVideo, srcFile, targetFile);
String combineVideo = "ffmpeg -f image2 -r %d -i %simg#d.jpg -vcodec mpeg4 %s";
combineVideo = String.format(combineVideo, frameRate, srcFile, targetFile);
combineVideo = combineVideo.replace("#", "%");
Log.i("VideoHandleActivity", "combineVideo=" + combineVideo);
return combineVideo.split(" ");//以空格分割为字符串数组
@ -223,6 +238,7 @@ public class FFmpegUtil {
/**
* 音频编码
*
* @param srcFile 源文件pcm裸流
* @param targetFile 编码后目标文件
* @param sampleRate 采样率
@ -238,11 +254,11 @@ public class FFmpegUtil {
/**
* 多画面拼接视频
*
* @param input1 输入文件1
* @param input2 输入文件2
* @param videoLayout 视频布局
* @param targetFile 画面拼接文件
*
* @return 画面拼接的命令行
*/
public static String[] multiVideo(String input1, String input2, String targetFile, int videoLayout) {
@ -258,9 +274,9 @@ public class FFmpegUtil {
/**
* 视频反序倒播
*
* @param inputFile 输入文件
* @param targetFile 反序文件
*
* @return 视频反序的命令行
*/
public static String[] reverseVideo(String inputFile, String targetFile) {
@ -273,9 +289,9 @@ public class FFmpegUtil {
/**
* 视频降噪
*
* @param inputFile 输入文件
* @param targetFile 输出文件
*
* @return 视频降噪的命令行
*/
public static String[] denoiseVideo(String inputFile, String targetFile) {
@ -286,12 +302,12 @@ public class FFmpegUtil {
/**
* 视频抽帧转成图片
*
* @param inputFile 输入文件
* @param startTime 开始时间
* @param duration 持续时间
* @param frameRate 帧率
* @param targetFile 输出文件
*
* @return 视频抽帧的命令行
*/
public static String[] videoToImage(String inputFile, int startTime, int duration, int frameRate, String targetFile) {
@ -306,12 +322,12 @@ public class FFmpegUtil {
/**
* 视频叠加成画中画
*
* @param inputFile1 输入文件
* @param inputFile2 输入文件
* @param targetFile 输出文件
* @param x 小视频起点x坐标
* @param y 小视频起点y坐标
*
* @return 视频画中画的命令行
*/
@SuppressLint("DefaultLocale")
@ -323,6 +339,7 @@ public class FFmpegUtil {
/**
* mp4视频的moov往mdat前面移动
*
* @param inputFile inputFile
* @param outputFile outputFile
* @return 移动moov命令行

Loading…
Cancel
Save