android 6.0以上及以下小视频拍摄

程序是基于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的方式集成的,很简洁,如果不需要断点拍摄等功能的话可以直接用。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值