版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jian11058/article/details/83657887
1、权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
2、main
package com.fpt.imagetovideomaster;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import com.googlecode.javacv.FFmpegFrameRecorder;
import com.googlecode.javacv.FrameRecorder;
import com.googlecode.javacv.cpp.opencv_core;
import java.io.File;
import java.io.IOException;
import static com.googlecode.javacv.cpp.opencv_highgui.cvLoadImage;
public class TwoMain extends Activity {
public static final String IMAGE_TYPE = ".jpg";
private Button btn;
FFmpegFrameRecorder recorder;
File file;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn=findViewById(R.id.main_btn_start);
requestAllPower();//方法在第4步
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
imageToMp4();
}
});
}
private void imageToMp4() {
// 生成的新文件名
final String newFileName = "/sdcard/1/test_" + System.currentTimeMillis() + ".mp4";
final double frameRate = 1;//1表示1秒1个照片,
//
new Thread() {
@Override
public void run() {
Log.d("test", "开始将图片转成视频啦...frameRate=" + frameRate);
try {
file=new File(newFileName);
if (!file.exists()){
try {
file.createNewFile();
Log.d("main", "创建");
} catch (IOException e) {
}
}
// for (int i=0;i<100;i++) {
// file = new File("/sdcard/1/ok" + i + ".mp4");//houq、、后期优化
// if (!file.exists()) {
// try {
// file.createNewFile();
// Log.d("main", "创建");
// break;
// } catch (IOException e) {
//
// }
// }
// Log.e("main", "continiu");
// continue;//终结本次循环,
// }
try{
Log.e("main", "luzhi"+file.getPath());
Bitmap bitmap=BitmapFactory.decodeFile("/sdcard/1/1.jpg");
recorder=new FFmpegFrameRecorder(file,bitmap.getWidth(),bitmap.getHeight(),0);
//设置视频的宽高,这里设置的是以第一张照片为宽高为基准的。
} catch (Exception e){
// Toast.makeText(getApplicationContext(), "recorder", Toast.LENGTH_LONG).show();
}
recorder.setFormat("mp4");
// 录像帧率
recorder.setFrameRate(frameRate);
// recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P);
// 记录开始
recorder.start();
int index = 0;
while (index < 21) {
// 获取图片--图片格式为head1.png,head2.png...head8.png
opencv_core.IplImage image = cvLoadImage("/sdcard/1/"
+ index
+ TwoMain.IMAGE_TYPE);//这里的:TwoMain.IMAGE_TYPE是当前类中的变量,他的值为:jpg
recorder.record(image);
index++;
}
Log.d("test", "录制完成....");
// 录制结束
recorder.stop();
} catch (FrameRecorder.Exception e) {
e.printStackTrace();
}
}
}.start();
}
}
3、需要.so文件;javacpp、javacv,不然会报错
4、加入上述包之后,如果调试版本在6.0以上,需要进行动态申请权限
public void requestAllPower() {
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
} else {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
}
}
}