这里主要实现一下多视频合成,主要困难是手机前置摄像头和后置摄像头录制的视频合成问题,我这里主要实现了功能,但是效率不优,暂时记录一下,如果有更好的方式再更新。
1.新建SelectRecordActivity类,并且打开AndroidManifest.xml修改为启动类(之前的启动类是MainActivity,现在只是作为一个单独的功能类),引用activity_select_record.xml布局文件,两个选择按钮。
点击单段视频录制实现第二按钮的功能,点击多段视频录制合成跳转到MultiRecordActivity。
2.新建MultiRecordActivity,直接引用MainActivity的布局activity_main.xml。因为布局都一样,主要区别在于修改切换摄像头的按钮逻辑以及停止录制的逻辑。
需要用到变量
/**
* 相机预览
*/
private SurfaceView mSurfaceView;
/**
* 开始录制按钮
*/
private ImageView mStartVideo;
/**
* 正在录制按钮,再次点击,停止录制
*/
private ImageView mStartVideoIng;
/**
* 录制时间
*/
private TextView mTime;
/**
* 录制进度条
*/
private ProgressBar mProgress;
/**
* 等待视频合成完成提示
*/
private ProgressBar mWait;
/**
* 录制主要工具类
*/
private MediaHelper mMediaHelper;
/**
* 录制进度值
*/
private int mProgressNumber=0;
/**
* 视频段文件编号
*/
private int mVideoNumber=1;
private FileUtils mFileUtils;
/**
* 临时记录每段视频的参数内容
*/
private List<Mp4TsVideo> mTsVideo = new ArrayList<>();
/**
* mp4转ts流后的地址,主要合成的文件
*/
private List<String> mTsPath = new ArrayList<>();
/**
* 是否已经取消下一步,比如关闭了页面,就不再做线程处理,结束任务
*/
private boolean isCancel;
/**
* 权限相关
*/
private PermissionHelper mPermissionHelper;
初始化录制工具类以及文件类
mMediaHelper = new MediaHelper(this);
mMediaHelper.setTargetDir(new File(mFileUtils.getMediaVideoPath()));
//视频段从编号1开始
mMediaHelper.setTargetName(mVideoNumber + ".mp4");
mPermissionHelper = new PermissionHelper(this);
//录制之前删除所有的多余文件
mFileUtils = new FileUtils(this);
mFileUtils.deleteFile(mFileUtils.getMediaVideoPath(),null);
mFileUtils.deleteFile(mFileUtils.getStorageDirectory(),null);
其中用来记录视频段的Mp4TsVideo类
/**
* 记录下每段视频
*/
private class Mp4TsVideo{
/**
* 视频段的地址
*/
private String mp4Path;
/**
* ts地址
*/
private String tsPath;
/**
* 是否需要翻转
*/
private boolean flip;
public String getMp4Path() {
return mp4Path;
}
public void setMp4Path(String mp4Path) {
this.mp4Path = mp4Path;
}
public String getTsPath() {
return tsPath;
}
public void setTsPath(String tsPath) {
this.tsPath = tsPath;
}
public boolean isFlip() {
return flip;
}
public void setFlip(boolean flip) {
this.flip = flip;
}
}
1.新建SelectRecordActivity类,并且打开AndroidManifest.xml修改为启动类(之前的启动类是MainActivity,现在只是作为一个单独的功能类),引用activity_select_record.xml布局文件,两个选择按钮。
点击单段视频录制实现第二按钮的功能,点击多段视频录制合成跳转到MultiRecordActivity。
2.新建MultiRecordActivity,直接引用MainActivity的布局activity_main.xml。因为布局都一样,主要区别在于修改切换摄像头的按钮逻辑以及停止录制的逻辑。
需要用到变量
/**
* 相机预览
*/
private SurfaceView mSurfaceView;
/**
* 开始录制按钮
*/
private ImageView mStartVideo;
/**
* 正在录制按钮,再次点击,停止录制
*/
private ImageView mStartVideoIng;
/**
* 录制时间
*/
private TextView mTime;
/**
* 录制进度条
*/
private ProgressBar mProgress;
/**
* 等待视频合成完成提示
*/
private ProgressBar mWait;
/**
* 录制主要工具类
*/
private MediaHelper mMediaHelper;
/**
* 录制进度值
*/
private int mProgressNumber=0;
/**
* 视频段文件编号
*/
private int mVideoNumber=1;
private FileUtils mFileUtils;
/**
* 临时记录每段视频的参数内容
*/
private List<Mp4TsVideo> mTsVideo = new ArrayList<>();
/**
* mp4转ts流后的地址,主要合成的文件
*/
private List<String> mTsPath = new ArrayList<>();
/**
* 是否已经取消下一步,比如关闭了页面,就不再做线程处理,结束任务
*/
private boolean isCancel;
/**
* 权限相关
*/
private PermissionHelper mPermissionHelper;
初始化录制工具类以及文件类
mMediaHelper = new MediaHelper(this);
mMediaHelper.setTargetDir(new File(mFileUtils.getMediaVideoPath()));
//视频段从编号1开始
mMediaHelper.setTargetName(mVideoNumber + ".mp4");
mPermissionHelper = new PermissionHelper(this);
//录制之前删除所有的多余文件
mFileUtils = new FileUtils(this);
mFileUtils.deleteFile(mFileUtils.getMediaVideoPath(),null);
mFileUtils.deleteFile(mFileUtils.getStorageDirectory(),null);
其中用来记录视频段的Mp4TsVideo类
/**
* 记录下每段视频
*/
private class Mp4TsVideo{
/**
* 视频段的地址
*/
private String mp4Path;
/**
* ts地址
*/
private String tsPath;
/**
* 是否需要翻转
*/
private boolean flip;
public String getMp4Path() {
return mp4Path;
}
public void setMp4Path(String mp4Path) {
this.mp4Path = mp4Path;
}
public String getTsPath() {
return tsPath;
}
public void setTsPath(String tsPath) {
this.tsPath = tsPath;
}
public boolean isFlip() {
return flip;
}
public void setFlip(boolean flip) {
this.flip = flip;
}
}