أنا أكتب وحدة التقاط الشاشة في جافا، لكنني أواجه مشكلات أداء خطيرة كتابة لقطات الشاشة على القرص. ماذا يمكنني أن أفعل؟
-
23-08-2019 - |
سؤال
أنا أكتب وحدة التقاط الشاشة باستخدام فئة الروبوت. أنا آخذ لقطات من التطبيق كل x milliseconds وكتابةها إلى القرص. بعد انتهاء التقاط الشاشة، أنا أروي لقطات الشاشة على الفيديو مع FFMPEG.
ومع ذلك، فإن كتابة الصور على القرص بطيئة للغاية وتذبمل طلبي إلى توقف. ماذا ينقصني؟ هل هناك طريقة أفضل لكتابة وحدة التقاط شاشة بسيطة؟
تحرير: لقد جربت عدة طرق لكتابة الصور إلى القرص، وكلها بطيئة للغاية. لقد كنت تلتصق بما يلي، نظرا لسهولة الاستخدام:
ImageIO.write(bufferedImage ,"jpg", file);
المحلول
أو ترميز الصورة إلى تنسيق الفيديو مباشرة عند التقاط الصورة، وتجنب كتابة الملف المؤقت الكبير على الإطلاق. يمكن العثور على رمز كامل باستخدام Xuggler هنا:
نصائح أخرى
حاول وضع الكتابة الخاصة بك في مؤشر ترابط جديد حتى لا تضطر إلى الانتظار لبطء القرص IO.
ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(10);
executor.schedule(new Runnable(){
@Override
public void run() {
writeImageHere(bufferedImage, file);
}
}
مجرد مشاهدة لقضايا التزامن.
الحل الثاني (الذاكرة المكثف) هو مخزن JPGS الخاص بك والحفاظ عليها جميعا في الذاكرة والكتابة فقط عند مرور وقت معين أو مخارج البرنامج.
الصورة المخزنة الافتراضية كبيرة كبيرة جدا. حاول أن يكون ذلك بتنسيق أصغر ثم اكتبه.
لقد استخدمت .png قبل وهي صغيرة بما فيه الكفاية.
نشر رمز أكثر قليلا وسوف نرى ما قد يكون هناك شيء آخر خطأ في لك.
تعديل
انا استعمل هذا:
BufferedImage bufferedImage = new BufferedImage(
widthFromRobot,
heightFromRobot,
BufferedImage. TYPE_3BYTE_BGR );
bufferedImage.getGraphics().drawImage( fromRobotScreenCapture, 0,0, null );
// get a file name
ImageIO.write( bufferedImage, "png", someFile );
إنشاء صورة جديدة مع نفسه العرض و ارتفاع ولكن مختلف أنواع الصور.
اكتب الصورة بهذه الصورة الجديدة، وحفظ تلك الصورة الجديدة على القرص.
استكشف قيم نوع الصورة المختلفة ومعرفة أيهما أفضل لك. بالطبع يمكن أن يكون هناك مفاضلة بين الجودة والسرعة. (أعتقد أن مشكلتك في مكان آخر ولكن حاول ذلك أولا)
تحقق من الرد 6 من هذا نشر. وبعد إنه يعني أن استخدام JAI ستحسن أداء الكتابة.