我目前正在使用行车记录仪应用程序,并且尝试存储特定时间范围内的图像,或者在图像过旧时将其删除或从中创建视频。
但是,我经常遇到存储问题。我的计划是将位图缓存在设备内存中,因为最坏的情况是每秒60张图像,并且压缩位图需要花费一些时间,因此我只想在必须的时候这样做。就像从单个图像生成视频时一样。
我想保留NAND闪存存储的寿命。所以我的计划是在系统内存中保存一张位图列表,并且只在我想生成视频时才收集,压缩并将它们保存到存储器中。
所以 tl; dr:是否有办法在Android上保存〜1GB的临时数据,除了将其写入存储中或从存储中删除?
所以我已经尝试了一些不同的方法:
将其保存到存储中(首先只是用于调试,但是在找不到解决问题的方法后,我仍然使用此部分)
我也做了一些有关在Android中保存到RAM的研究。看来您无法存储超过1MB的内存,而尝试使用它甚至远远不够。 https://developer.android.com/guide/topics/data/data-storage.html?hl=de
我还考虑过使用位图回收。 https://developer.android.com/topic/performance/graphics/manage-memory#java 但是,我对这段代码的理解不够好,甚至无法猜测这是否对我有用。
//This is what I'm using at the moment
private void storeImage(Bitmap bitmap){
String root = Environment.getExternalStorageDirectory().toString();
File myDir = new File(root + "/savedImages");
directory = myDir;
image_save_path_test = root + "savedImages";
Log.d("Directory",image_save_path_test);
if(!myDir.exists())
{
myDir.mkdirs();
}
Random rng = new Random();
int n = 10000;
n = rng.nextInt(n);
String fname = "Image-" + n + ".jpg";
File file = new File(myDir, fname);
if(file.exists())
{
file.delete();
}
try
{
FileOutputStream out = new FileOutputStream(file);
image.compress(Bitmap.CompressFormat.JPEG, 90, out);
out.flush();
out.close();
}
catch (Exception e)
{
e.printStackTrace();
}}
好吧,我希望Android删除临时文件,因为那是文档中写的。但这也是为什么我要寻求帮助的原因,所以除了事先感谢外,我不确定在这里说些什么。
答案 0 :(得分:1)
我想保留NAND闪存存储的寿命。所以我的计划是在系统内存中保存一张位图列表,并且只在我想生成视频时才收集,压缩并将它们保存到存储中。
这就是您问题的核心:您根本不需要这样做。现代闪存具有大量的擦除周期(100,000+),最重要的是,如果您通过操作系统添加损耗均衡和主动缓存,则意味着您正在考虑一个非问题:将大文件保存到文件系统中,而不必不必重新设计这个古老而又功能完备的轮子。
当我想生成视频时,收集,压缩并将它们保存到存储中
我认为,直接使用来自摄像机的压缩视频源而不是自己压缩原始BMP,您的效率将会大大提高。严格来说,MPEG压缩比您将要想到的任何东西都要好,而且成本也为零,因为如今嵌入式相机具有内置的流编码器,该编码器在打开相机后即可开始工作。
我将更多地关注我要针对市场上的电话生成和分析/分发(分辨率,GOP大小...)的BMP和视频,而不是如何压缩BMP的细节。或如何保护NAND。