أنا أكتب وحدة التقاط الشاشة في جافا، لكنني أواجه مشكلات أداء خطيرة كتابة لقطات الشاشة على القرص. ماذا يمكنني أن أفعل؟

StackOverflow https://stackoverflow.com/questions/1087891

سؤال

أنا أكتب وحدة التقاط الشاشة باستخدام فئة الروبوت. أنا آخذ لقطات من التطبيق كل x milliseconds وكتابةها إلى القرص. بعد انتهاء التقاط الشاشة، أنا أروي لقطات الشاشة على الفيديو مع FFMPEG.

ومع ذلك، فإن كتابة الصور على القرص بطيئة للغاية وتذبمل طلبي إلى توقف. ماذا ينقصني؟ هل هناك طريقة أفضل لكتابة وحدة التقاط شاشة بسيطة؟

تحرير: لقد جربت عدة طرق لكتابة الصور إلى القرص، وكلها بطيئة للغاية. لقد كنت تلتصق بما يلي، نظرا لسهولة الاستخدام:

ImageIO.write(bufferedImage ,"jpg", file);
هل كانت مفيدة؟

المحلول

أو ترميز الصورة إلى تنسيق الفيديو مباشرة عند التقاط الصورة، وتجنب كتابة الملف المؤقت الكبير على الإطلاق. يمكن العثور على رمز كامل باستخدام Xuggler هنا:

شاشة 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 ستحسن أداء الكتابة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top