我面临当前的问题。我有一个由100个位图组成的数组。这些是我从视图中截取的屏幕截图。我用JCodec制作了一个视频,但速度很慢。我希望通过FFmpeg 获得更好的结果
现在我想使用FFmpeg库。有人问了类似的问题,但我不知道如何使用ffmpeg,也不知道如何在我的特定情况下使用它。我看到的都是奇怪的复杂命令参见:
File dir = your directory where image stores;
String filePrefix = "picture"; //imagename prefix
String fileExtn = ".jpg";//image extention
filePath = dir.getAbsolutePath();
File src = new File(dir, filePrefix + "%03d" + fileExtn);// image name should ne picture001, picture002,picture003 soon ffmpeg takes as input valid
complexCommand=new String[]{"-i",src+","-c:v","libx264","-c:a","aac","-vf","setpts=2*PTS","-pix_fmt","yuv420p","-chrf","10","-r","15","最短","-y","/storage/emulated/0/"+app_name+"/Video/"+app_name+"_Video"+number+".mp4"};
问题是,在这种情况下,他使用的是Path。我需要它来自数组。我不知道该如何处理字符串(ComplexCommand):/我的位图是这样的:
Bitmap[]bitmaps=新位图[100];
这个稍后填写。
如果有人在搜索如何使用JCodec:
try {
out = NIOUtils.writableFileChannel( Environment.getExternalStorageDirectory().getAbsolutePath()+"/***yourpath***/output"+System.currentTimeMillis()+".mp4");
// for Android use: AndroidSequenceEncoder
AndroidSequenceEncoder encoder = new AndroidSequenceEncoder(out, Rational.R(25, 1));
for (int i = 0 ; i < 100 ; i++) {
// Generate the image, for Android use Bitmap
// Encode the image
System.out.println("LOO2P"+i);
encoder.encodeImage(bitmaps[i]);
}
// Finalize the encoding, i.e. clear the buffers, write the header, etc.
encoder.finish();
} catch (FileNotFoundException e) {
System.out.println("fNF");
e.printStackTrace();
} catch (IOException e) {
System.out.println("IOE");
e.printStackTrace();
} finally {
System.out.println("IOSSE");
NIOUtils.closeQuietly(out);
}
根据ffmpeg wiki,您描述的方式正是它的意图。要实现这一点,您应该根据描述的命名约定将数组中的每个图像写入一个文件中。不过,我不知道这是否有助于解决您的性能问题。将图像写入文件可以按照以下答案完成:
for (int i = 0; i<bitmapArray.length(); i++){
// Write to file while incrementing the file name
writeToFile(bitmapArray[i], i);
}
据我所知,ffmpeg不支持直接从数组进行编码。