程序是基于ffmpeg的视频拍摄及合成。
由于网上找不到支持23的so文件,该方法仅限6.0以下使用,6.0以上的使用方法可直接看文末的链接
首先导入lib库和ffmpeg的录制java文件, 使用的是第三方VCamera封装的ffmpeg, 没有jar包, 所以需要将com.yixia包下的所有文件都copy过来
(注:在创建项目时,该项目的包名必须和这个.so文件的方法里的目录一致才可以保证调通,所以yixia只能放在com.yixia这个位置)
在gradle里加入下面代码用来生成jnilibs文件夹,也可手动创建
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
在application里面初始化VCamera:
public classMyApplicationextendsApplication {
/**
* 存储路径
*/
private staticStringpath="/sdcard/WeiXinVideo/";
@Override
public voidonCreate() {
path+= String.valueOf(System.currentTimeMillis());
File file =newFile(path);
if(!file.exists()) {
file.mkdirs();
}
//设置视频缓存路径
VCamera.setVideoCachePath(path);
//开启log输出,ffmpeg输出到logcat
VCamera.setDebugMode(true);
//初始化拍摄SDK,必须
VCamera.initialize(this);
}
}
在拍摄activity中初始化
/**
* 初始化录制对象
*/
private voidinitMediaRecorder() {
mMediaRecorder=newMediaRecorderNative();
String key = String.valueOf(System.currentTimeMillis());
//设置缓存文件夹
mMediaObject=mMediaRecorder.setOutputDirectory(key, VCamera.getVideoCachePath());
//设置视频预览源
mMediaRecorder.setSurfaceHolder(svffmpeg.getHolder());
//准备
mMediaRecorder.prepare();
//滤波器相关
UtilityAdapter.freeFilterParser();
UtilityAdapter.initFilterParser();
}
这样就可以在SurfaceView上看见拍摄预览界面了,
然后mMediaRecorder.startRecord()拍摄视频,
调用mMediaRecorder.stopRecord()停止录制视频,
因为拍摄出来的文件是ts视频流, 所以还要调用mMediaRecorder.startEncoding()开始合成MP4视频文件.
引用的com.yixia包中的MediaRecorderBase类还可以设置视频各个参数。
代码保存了多段录制的功能只需到VideoActivity中的手势监听器中通过OnLift()调用就可以实现
@Override
public voidonLift() {
// 抬起结束
isRecordedOver=true;
rbstart.closeButton();
mMediaRecorder.stopRecord();
videoFinish();
// 抬起暂停,多段录制
// isRecordedOver = true;
// mMediaRecorder.stopRecord();
// changeButton(mMediaObject.getMediaParts().size() > 0);
}
注:UtilityAdapter类用到libutility.so库
static{
System.loadLibrary("utility");
}
需要对将要调用的方法做本地声明,关键字为native。并且只需要声明,而不需要具体实现,例如
/**
* 初始化底层库
*/
public static native voidFFmpegInit(Object context, String settings);
/**
* 获取当前转码时间
*@returnint
*/
public static native intFFmpegVideoGetTransTime(intflag);
因此方法名的改动会出现java.lang.UnsatisfiedLinkError这样的错误。
主界面扫描文件存在轻微bug,不影响视频功能
http://download.csdn.net/detail/ls15256928597/9881117 源码下载链接
最近在github上找到一篇不错的代码
支持6.0以上使用,没有用so文件
https://github.com/lizhifeng-sky/RecordVideo
是以module的方式集成的,很简洁,如果不需要断点拍摄等功能的话可以直接用。