التسميات

الجمعة، 17 فبراير 2012

صنع Media Player مبني على MPlayer بلغة ال Java ~.!



بسم الله الرحمن الرحيم


اليوم عندي شرح عن طرق صنع مشغل وسائط متعددة بلغة الجافا.
اول نقطة مكتبات الجافا ليست قوية في هذا المجال.
ومن اهم المزايا التي تعلمتها من اللينكس هو البناء على برنامج او مكتبة.
الجميع اعتقد يعرف برنامج Mplayer وهو غني عن التعريف بشكل اكيد وبنيت علية برامج مثل SMPlayer , UMplayer , GPlayer , KMPlayer.

اتمنى ان تكون لديك اخي الفاضل معرفة بسيطة بلغة الجافا.

اولا البرنامج يشغل ملفات الوسائط بتمرير اسمها اليه مثال

\

mplayer /home/sq9/Downloads/1.mp3

/

الان نريد ان نعرف كيف نعمل ايقاف مؤقت او توقف كامل
انتقل للطرفية واكتب الامر التالي/

\
mplayer --help

/

سيكون الناتج هو


\
Usage:   mplayer [options] [url|path/]filename

Basic options: (complete list in the man page)
 -vo <drv>        select video output driver ('-vo help' for a list)
 -ao <drv>        select audio output driver ('-ao help' for a list)
 vcd://<trackno>  play (S)VCD (Super Video CD) track (raw device, no mount)
 dvd://<titleno>  play DVD title from device instead of plain file
 -alang/-slang    select DVD audio/subtitle language (by 2-char country code)
 -ss <position>   seek to given (seconds or hh:mm:ss) position
 -nosound         do not play sound
 -fs              fullscreen playback (or -vm, -zoom, details in the man page)
 -x <x> -y <y>    set display resolution (for use with -vm or -zoom)
 -sub <file>      specify subtitle file to use (also see -subfps, -subdelay)
 -playlist <file> specify playlist file
 -vid x -aid y    select video (x) and audio (y) stream to play
 -fps x -srate y  change video (x fps) and audio (y Hz) rate
 -pp <quality>    enable postprocessing filter (details in the man page)
 -framedrop       enable frame dropping (for slow machines)


Basic keys: (complete list in the man page, also check input.conf)
 <-  or  ->       seek backward/forward 10 seconds
 down or up       seek backward/forward  1 minute
 pgdown or pgup   seek backward/forward 10 minutes
 < or >           step backward/forward in playlist
 p or SPACE       pause movie (press any key to continue)
 q or ESC         stop playing and quit program
 + or -           adjust audio delay by +/- 0.1 second
 o                cycle OSD mode:  none / seekbar / seekbar + timer
 * or /           increase or decrease PCM volume
 x or z           adjust subtitle delay by +/- 0.1 second
 r or t           adjust subtitle position up/down, also see -vf expand


 * * * SEE THE MAN PAGE FOR DETAILS, FURTHER (ADVANCED) OPTIONS AND KEYS * * *


MPlayer 1.0rc4-4.5.2 (C) 2000-2010 MPlayer Team

/

لاحظ ال Basic keys
عندما تشغل اي ملف وسائط ولتكن اغنية ونريد ايقافها مؤقتا نضغط على الحرف p وتتوقف (حسب السابق).
اقرا السابق لتعرف باقي الخيارات.

برنامجنا سوف يحتوي على ثلاث خيارات تشغيل , ايقاف مؤقت , ايقاف كامل.

نبدا نرسم الواجهة الرسومية بشكل عادي بالشكل التالي



(الشرح ليس لصنع برنامج احترافي نكتفي بابسط واجهة ممكنه لنفهم المغزى من الموضوع وهو الاكواد).

ممتاز الان ننتقل لاكواد البرنامج

اول حاجة نعرف متغيرين من نوع
Process و PrintStream
في راس البرنامج تحت بداية الدالة Main بالشكل التالي

\

public class Main extends javax.swing.JFrame {

private Process p;
    private PrintStream s ;
    public Main(){
        initComponents();
    }
@SuppressWarnings("unchecked")

/

ممتاز الان نشرح فائتهما ال Process هي لاستدعاء برنامج ال Mplayer وتشغيله. < يمكن استعمالها لتشغيل برامج اخرى.
PrintStream هي لتمرير الاحرف داخل العملية.

(عندما شرحنا كيف يعمل ال Mplayer قلنا انة يشغل البرنامج وينتظر ضغطات من الكيبورد كي يوقف او يكمل التشغيل لذلك عرفنا هذا المتغير).

الان ننتقل لكود الزر الاول المسؤول عن فتح الملف
ونكتب الاتي

\

try {

JFileChooser file = new JFileChooser();
            file.showOpenDialog(file);
            p = Runtime.getRuntime().exec("mplayer -title Spider_Player " + file.getSelectedFile().getPath());
            s = new PrintStream(p.getOutputStream());
        } catch (IOException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}

/

في البداية عرفنا JFileChooser لتجديد الملف المراد تشغيلة.
في السطر الثاني نقول باظهار النافذة الي رح نستخدمها لتحديد الملف.
السطر الثالث هذا مهم جدا
نقول باعطاء قيمة لل process p الي عرفناه في اول البرنامج.
رح نستخدمه لتشغيل برنامج Mplayer لذلك نديه القيمة التالية


\

p = Runtime.getRuntime().exec("mplayer " + file.getSelectedFile().getPath());
file.getSelectedFile().getPath() هي لوضع مسار الملف المحدد من قبل ال JFileChooser .


s = new PrintStream(p.getOutputStream());

/


اعطاء قيمة للبرينت سترسم المعرف اعلى الربرنامج كيف يمرر الاحرف للمخرجات من البروسيس p.

(متاسف اذا لم يكن شرحي واضح لابعد درجة)

الان ننتقل لكود الزر الثاني المسؤول عن الايقاف المؤقت للبرنامج (لن يعمل الزر الى بتشغيل ملف اولا ).
نكتب الاكواد التالية

\

s.print("p");
        s.flush();

/

فقط لاغير!
في اول الموضع اتفقنا ان ال Mplayer يشغل ملف وسائط وينتظر ضغطات من الكيبورد الان نحن نمرر له هذه الاحرف عبر هذا الكود.

الزر الثالث المسؤول عن ايقاف مقطع الوسائط واغلاق البرنامج.
الاكواد

\

s.print("q");

s.flush();
System.exit(0);

/


السطرين الاوال اعتقد وضحوا السطر الاخير لايقاف البرنامج

انتهينا كذا اتمنى يكون شرحي واضح واعتذر ان كان خلاف ذلك الان هذا مثال بسيط انا صانعة ارفقة لكم ككود.

Main.java

\


package player;

import java.io.*;
import java.util.logging.*;
import javax.swing.*;
public class Main extends javax.swing.JFrame {
    private Process p;
    private PrintStream s ;
    public Main(){
        initComponents();
    }
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {


        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();
        jButton3 = new javax.swing.JButton();


        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Spider_Player");


        jButton1.setText("Open");
        jButton1.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jButton1MouseClicked(evt);
            }
        });


        jButton2.setText("Pause");
        jButton2.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jButton2MouseClicked(evt);
            }
        });


        jButton3.setText("Stop & Exit");
        jButton3.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jButton3MouseClicked(evt);
            }
        });


        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jButton3)
                .addGap(57, 57, 57)
                .addComponent(jButton2, javax.swing.GroupLayout.PREFERRED_SIZE, 70, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(69, 69, 69)
                .addComponent(jButton1, javax.swing.GroupLayout.DEFAULT_SIZE, 98, Short.MAX_VALUE)
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButton1)
                    .addComponent(jButton2)
                    .addComponent(jButton3))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );


        pack();
    }// </editor-fold>
    private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {                                    
        try {
            JFileChooser file = new JFileChooser();
            file.showOpenDialog(file);
            p = Runtime.getRuntime().exec("mplayer -title Spider_Player " + file.getSelectedFile().getPath());
            s = new PrintStream(p.getOutputStream());
        } catch (IOException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }                                  
    private void jButton2MouseClicked(java.awt.event.MouseEvent evt) {                                    
        s.print("p");
        s.flush();
    }                                  
    private void jButton3MouseClicked(java.awt.event.MouseEvent evt) {                                    
        s.print("q");
        s.flush();
        System.exit(0);
    }                                  
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {


            public void run() {
                try {
                    UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel");
                } catch (ClassNotFoundException ex) {
                    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                } catch (InstantiationException ex) {
                    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                } catch (IllegalAccessException ex) {
                    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                } catch (UnsupportedLookAndFeelException ex) {
                    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                }
                new Main().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton3;
    // End of variables declaration
}

/

مكتوب ببيئة NetBeans .


اي سؤال حاضر وموجود هنا.

والسلام خير ختام


الثلاثاء، 15 نوفمبر 2011

Record AC! اولى مشاريعي البرمجية ~.!

بسم الله الرحمن الرحيم

والصلاة والسلام على أشرف الانبياء والمرسلين نبينا محمد علية وعلى اله افضل الصلاة والتسليم.

Record AC : هو برنامج لتصوير فيديو من سطح المكتب مبرمج بلغة الجافا تم بنائة بالاعتماد على ffmpeg لتصوير سطح المكتب بشكل فيديو .
هذا بشكل مختصر
الطموح الوصول لبرنامج احترافي في تصوير سطح المكتب فيديو !
اعتمادة على ffmpeg ولغة الجافا من الممكن يكسبنى ميزة تعدد المنصات في حال نجح المشروع اعرض عليكم الان صورة للبرنامج + الكود كامل.
طبعا تاكد من توفر ffmpeg لديك في الجهاز :)

السورس كود + البرنامج :


اتمنى رؤية ارائكم + مشاركاتكم في المشروع < للمعلومية المشروع الان تحت التطوير ليست اول ولا اخر نسخة.
نراكم في تدوينة قادمة.