JavaCV
JavaCpp
如果下载不了,可以下载此处
1. 使用
注意:存储8张源图的路径是"/sdcard/ScreenRecord/temp/", 存储输出的视频文件路径为"/sdcard/ScreenRecord/",事先应现在"/sdcard/ScreenRecord/temp/"放置8张图片,当然本例中是8张,可以根据自己的需求变化
public class MainActivity extends AppCompatActivity {
public static final String IMAGE_TYPE = ".png";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void start(View view) {
imageToMp4();
}
/**
* 图片转视频
*/
private void imageToMp4() {
// 生成的新文件名
String newFileName = "test_" + System.currentTimeMillis() + ".mp4";
// 保存的路径
String temp = null;
final double frameRate = 5;
try {
temp = new FileUtils().getSDCardRoot() + "ScreenRecord"
+ File.separator + newFileName;
} catch (FileUtils.NoSdcardException e1) {
e1.printStackTrace();
}
final String savePath = temp;
new Thread() {
@Override
public void run() {
Log.d("test", "开始将图片转成视频啦...frameRate=" + frameRate);
try {
// 临时文件路径即存储源图片的路径
String tempFilePath = new FileUtils().getSDCardRoot()
+ "ScreenRecord/temp" + File.separator;
Log.i("test", "tempFilePath=" + tempFilePath);
Bitmap testBitmap = BitmapFactory.decodeFile(tempFilePath
+ "head1" + MainActivity.IMAGE_TYPE);
//创建一个记录者
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(
savePath, testBitmap.getWidth(),
testBitmap.getHeight());
// 设置视频格式
recorder.setFormat("mp4");
// 录像帧率
recorder.setFrameRate(frameRate);
// 记录开始
recorder.start();
int index = 0;
while (index < 8) {
// 获取图片--图片格式为head1.png,head2.png...head8.png
opencv_core.IplImage image = cvLoadImage(tempFilePath
+ "head" + index
+ MainActivity.IMAGE_TYPE);
recorder.record(image);
index++;
}
Log.d("test", "录制完成....");
// 录制结束
recorder.stop();
} catch (FileUtils.NoSdcardException | FrameRecorder.Exception e) {
e.printStackTrace();
}
}
}.start();
}
}
FileUtils.java
public class FileUtils {
private String SDCardRoot;
private static boolean isCardExist;
public FileUtils() throws NoSdcardException {
getSDCardRoot();
}
public String getSDCardRoot() throws NoSdcardException{
if(isCardExist()){
SDCardRoot = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator;
}else{
throw new NoSdcardException();
}
return SDCardRoot;
}
public static boolean isCardExist(){
isCardExist = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)?true:false;
return isCardExist;
}
public File createFileInSDCard(String fileName, String dir)
throws IOException {
File file = new File(SDCardRoot + dir + File.separator + fileName);
if(!file.exists()){
file.getParentFile().mkdirs();
file.createNewFile();
}
return file;
}
public File creatSDDir(String dir) {
File dirFile = new File(SDCardRoot + dir + File.separator);
if(!dirFile.exists()){
dirFile.mkdirs();
}
return dirFile;
}
public boolean filterFileExist(String path, String filter) {
File file = new File(SDCardRoot + path + File.separator);
if (file.exists() && file.isDirectory()) {
String[] fileNames = file.list(new FilenameFilter() {
public boolean accept(File dir, String filename) {
return filename.endsWith(".png");
}
});
if (fileNames.length > 0) {
return true;
} else {
return false;
}
} else {
return false;
}
}
/**
*
*/
public boolean isFileExist(String fileName, String path) {
File file = new File(SDCardRoot + path + File.separator + fileName);
return file.exists();
}
public File getFile(String fileName,String path){
File file = new File(SDCardRoot + path + File.separator + fileName);
return file;
}
public void deleteFile(String fileName, String path) {
File file = new File(SDCardRoot + path + File.separator + fileName);
boolean result = file.delete();
}
public void closeInputStream(InputStream inputStream){
if(inputStream!=null){
try {
inputStream.close();
} catch (IOException e) {
Log.e("error", "close failed");
e.printStackTrace();
}
}
}
public class NoSdcardException extends Exception{
}
/**
* 删除文件夹中的内容,不删除文件夹本身
* @param path
*/
public static void deleteDirectoryContent(String path){
Log.w("test","deleteDirectory.."+path);
File file=new File(path);
if(!file.exists()){
return;
}
String fPath=file.getAbsolutePath();
if(file.isDirectory()){
String[] files=getDirectoryFiles(path);
if(files==null){
deleteFile(path);
return;
}
for(String str:files){
str=fPath+"/"+str;
file=new File(str);
if(file.isDirectory()){
deleteDirectory(str);
}else if(file.isFile()){
deleteFile(str);
}
}
// deleteFile(path);
}else if(file.isFile()){
deleteFile(path);
}
}
/**
* 删除文件夹中的内容
* @param path
*/
public static void deleteDirectory(String path){
Log.w("test","deleteDirectory.."+path);
File file=new File(path);
if(!file.exists()){
return;
}
String fPath=file.getAbsolutePath();
if(file.isDirectory()){
String[] files=getDirectoryFiles(path);
if(files==null){
deleteFile(path);
return;
}
for(String str:files){
str=fPath+"/"+str;
file=new File(str);
if(file.isDirectory()){
deleteDirectory(str);
}else if(file.isFile()){
deleteFile(str);
}
}
deleteFile(path);
}else if(file.isFile()){
deleteFile(path);
}
}
/**
* 删除指定路径的文件
* @param filePath
* 文件路径
*/
public static void deleteFile(String filePath){
Log.w("test","deleteFile:filePath="+filePath);
if(filePath==null){
return;
}
File file=new File(filePath);
if(file.exists()){
file.delete();
}
}
/**
* 获取文件夹下面的所有文件
* @param path
* @return
*/
public static String[] getDirectoryFiles(String path){
if(path==null){
return null;
}
File file=new File(path);
if(!file.exists()){
return null;
}
String[] files=file.list();
if(files==null || files.length<=0){
return null;
}
return files;
}
}