تعلم JavaFx ..مقال36_ التعامل مع الميديا Media with JavaFX

إرسال مساهمة في موضوع

اذهب الى الأسفل

تعلم JavaFx ..مقال36_ التعامل مع الميديا Media with JavaFX

مُساهمة من طرف زهراء في الثلاثاء نوفمبر 20, 2018 12:01 pm

أهلا بكم

توفر الـــ [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] واجهة برمجة التطبيقات JavaFX Media API التي تمكن المستخدمين من دمج و تشغيل ملفات الصوت والفيديو في التطبيقات ويدعم أيضا تدفق HTTP المباشر لملفات الوسائط الثابتة والخلاصات المباشرة.

يتم دعم عدد من تنسيقات الوسائط ، بما في ذلك AAC و AIFF و WAV و MP3. كما يتم دعم FLV التي تحتوي على VP6 video و MP3 audio و الوسائط المتعددة MPEG-4 مع تنسيقات الفيديو H.264 / AVC.

يعتمد دعم تنسيق وسائط معين على النظام الأساسي للتطبيق فبعض ميزات تشغيل الوسائط وتنسيقاتها لا تتطلب أي عمليات تركيب إضافية ؛ والبعض الاخر تتطلب برنامج طرف ثالث ليتم تثبيتها.

في هذا المقال التعليمي ، سنناقش قدرة [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] على التعامل مع ملفات الوسائط بطريقة تفاعلية. حيث إنها توفر الحزمة javafx.scene.media التي تحتوي على جميع الفئات الضرورية للتعامل مع الميديا وهي على النحو التالى :

javafx.scene.media.AudioClip
javafx.scene.media.Media
javafx.scene.media.MediaPlayer
javafx.scene.media.MediaStatus
javafx.scene.media.MediaView
اولا : التعامل مع الفئة AudioClip 

يتم استخدام الفئة audioClip لتشغيل مقطع صوت قصير مع الحد الأدنى من زمن الوصول. عادةً ما يكون ذلك مفيدًا للتأثيرات الصوتية ، وهي عادةً مقاطع صوتية قصيرة...ويتم تشغيل تلك المفات باستخدام الشفرة التالية :

1_إستيراد الفئة [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] التى تستخدم لتشغيل مقاطع الصوت القصيرة 

الكود:
javafx.scene.media.AudioClip

2_انشاء وتحديد مسار الملف الصوتي 

الكود:
final URL resource = getClass().getResource("resources/beep.wav");

3_بإنشاء فئة جديدة من الفئة [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] ليمثل كائن تشغيل الملف الصوتي ثم تمرير مسار الملف الية :
الكود:
final AudioClip clip = new AudioClip(resource.toString());

كما رايتك فى الشفرة اعلاه توفر فئة AudioClip مُنشئًا واحدًا فقط يأخذ عنوان URL في نموذج السلسلة ، وهو عنوان URL لمصدر الصوت. يتم تحميل مقطع الصوت على الفور في الذاكرة في شكل خام غير مضغوط. هذا هو السبب وراء عدم استخدام هذه الفئة لمقاطع الصوت الطويلة.

يمكن أن يستخدم عنوان URL المصدر بروتوكولات HTTP و file و JAR. هذا يعني أنه يمكنك تشغيل مقطع صوتي من الإنترنت أونظام الملفات المحلي أوملف JAR.

و المثال الكامل على النحو التالى :

الكود:

import java.net.URL;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.scene.media.AudioClip;
import javafx.stage.Stage;

/**
 * @author Dean Iverson
 */
public class Main extends Application {

  public static void main(String[] args) {
    launch(args);
  }

  @Override
  public void start(Stage primaryStage) {
    final URL resource = getClass().getResource("resources/beep.wav");
    final AudioClip clip = new AudioClip(resource.toString());

    final Button button = new Button("Bing Zzzzt!");
    button.setOnAction(new EventHandler<ActionEvent>() {

      @Override
      public void handle(ActionEvent event) {
        clip.play(1.0);
      }
    });

    final StackPane stackPane = new StackPane();
    stackPane.setPadding(new Insets(10));
    stackPane.getChildren().add(button);

    final Scene scene = new Scene(stackPane, 200, 200);
    final URL stylesheet = getClass().getResource("media.css");
    scene.getStylesheets().add(stylesheet.toString());

    primaryStage.setTitle("Basic AudioClip Example");
    primaryStage.setScene(scene);
    primaryStage.show();
  }
}

مثال اخر تشغيل مقطع صوتي من خلال الشبكة على النحو التالى :

الكود:

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.media.AudioClip;
import javafx.stage.Stage;

public class Main extends Application {
    public static void main(String[] args) {
        Application.launch(args);
    }
    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Text Fonts");

        Group g = new Group();
        Scene scene = new Scene(g, 550, 250);

        AudioClip plonkSound = new AudioClip("http://somehost/p.aiff");
        plonkSound.play();
        
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

التعامل مع الطريقة play()


الطريقة play هى المسؤلة عن تشغيل الملف الصوتي ولها ثلاث مشيدات على النحو التالى :

الكود:
void play()
يستخدم المشيد اعلاه بتشغيل AudioClip باستخدام جميع المعلمات الافتراضية.

الكود:
void play(double volume)
قم بتشغيل AudioClip باستخدام جميع المعلمات الافتراضية باستثناء حجم الصوت الذى سيتم تحديدة من خلال هذا المعلمة volume

الكود:
void play(double volume, double balance, double rate, double pan,int priority)
قم بتشغيل AudioClip باستخدام المعلمات المحددة. يتم تثبيت القيم خارج النطاقات كما هو محدد بواسطة الخصائص المرتبطة بها.

المعلمات:

  • volume - مستوى الصوت للمقطع التى يعمل حاليا. نطاق الحجم الصالح هو 0.0 إلى 1.0 ، بمعني انه ليتم كتم الصوت نستخدم القيمة 0.0 أو نستخدم القيمة 1.0 الحجم الكامل...وهكذا يتم التحكم بحجم الصوت



  • balance - توازن يسار / يمين أو أحجام قنوات نسبية لتأثيرات الستيريو...النطاق الصالح هو -1.0 إلى 1.0. تعيّن القيمة -1.0 التشغيل في القناة اليمنى عند مستوى الصوت العادي وتقوم بكتم القناة اليمنى. تعيّن القيمة 1.0 التشغيل في القناة اليمنى عند مستوى الصوت العادي ويتم تجاهل القناة اليسرى. القيمة الافتراضية هي 0.0 ، والتي تحدد التشغيل في كلتا القناتين في وحدة التخزين العادية.



  • rate - تحدد السرعة السرعة النسبية التي يتم تشغيل الصوت بها. النطاق الصالح هو 0.125 إلى 8.0. تعني القيمة 0.125 أن المقطع يتم تشغيله أبطأ ثماني مرات ، وقيمة 8.0 تعني أن المطقع يتم تشغيلة أسرع ثماني مرات.  المعدل الافتراضي هو 1.0 ، والذي يلعب المقطع بالمعدل الطبيعي



  • pan - تحدد توزيع المقطع بين القناتين اليمنى واليسرى. النطاق الصالح هو -1.0 إلى 1.0. تقوم قيمة -1.0 بنقل المقطع كليًا إلى القناة اليسرى. تقوم قيمة 1.0 بنقل المقطع كليًا إلى القناة اليمنى. القيمة الافتراضية هي 0.0 ، والتي تقوم بتشغيل المقطع بشكل طبيعي. إن ضبط قيمة pan لمقطع أحادي له نفس تأثير إعداد القيمة balance لمقاطع الصوت باستخدام صوت ستيريو.



  • priority - أولوية تأثير الصوت. سيتم إسقاط التأثيرات ذات الأولوية الأقل أولاً في حالة محاولة العديد من التأثيرات في وقت واحد.


خصائص التشغيل :

تدعم فئة AudioClip ضبط بعض خصائص الصوت عند تشغيل المقطع الصوتي وهي على النحو التالى :

الخاصية cycleCount : تلك الخاصية تحدد عدد مرات تشغيل الملف عندما يتم استدعاء طريقة play() ..القيمة الافتراضية هي 1 معني ذلك ان يتم تشغيل الملف لمرة واحدة فقط ...ويتم استخدام تلك الخاصية على النحو التالى :

الكود:


        AudioClip egyplay = new AudioClip("http://somehost/p.aiff");
        egyplay.play();
         egyplay.setCycleCount(int count)
        

حيث count عدد مرات التشغيل التى تريد تنفيذها
avatar
زهراء
........
........

تاريخ التسجيل : 18/02/2011
المساهمات : 349
النقاط : 573
التقيم : 38
الدولة : مصر
الجنس : انثى

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: تعلم JavaFx ..مقال36_ التعامل مع الميديا Media with JavaFX

مُساهمة من طرف زهراء في الثلاثاء نوفمبر 20, 2018 3:18 pm

ثانيا : التعامل مع الفئات Media و MediaPlayer و MediaView 

كما رأينا فى الجزء الاول من المقال أن الفئة audioClip تستخدم لتشغيل مقطع صوت قصير عادةً ما يكون ذلك مفيدًا للتأثيرات الصوتية ...لذلك وفرت الـــ [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] الفئات التالية للتعامل مع ملفات الميديا كبيرة الحجم سواء كانت صوت أو فيديوا وهى :
Media
MediaPlayer
MediaView

ويعتبر تشغيل ملفات الميديا بهذه الفئات في JavaFX أمرًا بسيطًا للغاية  ،فمثلا نحن بحاجة إلى إنشاء فئة javafx.scene.media.Media بتمرير مسار الملف الصوتي في منشئه لتشغيل الملفات الصوتية... كما فى الخطوات البسيطة التالية :

1_إنشاء كائن جديد من الفئة Media ثم تمرير موقع أو عنوان الملف الصوتي في منشئه على النحو التالى :
الكود:
Media media = new Media("http://path/file_name.mp3");  

2_إنشاء كائن جديد من الفئة Mediaplayer ثم تمرير كائن Media في منشئه على النحو التالى :
الكود:
Mediaplayer Player = new MediaPlayer(media);  

3_استدعاء الأسلوب play () للكائن MediaPlayer لتشغيل الملف الصوتي :
الكود:
Player.setAutoPlay(true);

وهكذا ابسط مثال لتشغيل ملف صوتي فى الـــ [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط]....تعالوا الان نتطرق لتلك الكائنات بشيء من التفصيل :


1_كائن Media 


كما فى المثال اعلاه فان الفئة Media تمثل مصدر الوسائط ، الذى قد يكون صوتًا أو فيديو. وتوفر ايضا المعلومات المتعلقة بالوسائط ، على سبيل المثال ، المدة والبيانات الوصفية وما إلى ذلك.

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

الكود:
URL mediaUrl = getClass().getResource("Test.mp4");
String mediaStringUrl = mediaUrl.toExternalForm();

// Create a Media
Media media = new Media(mediaStringUrl);

تحتوي فئة الوسائط على الخصائص التالية ، وهي للقراءة فقط:


  • duration :تحدد مدة الوسائط بالثواني. إنه كائن المدة. إذا كانت المدة غير معروفة ، فسيكون Duration.UNKNOWN.

  • width & height :يعطي العرض والطول للمصدر بالبكسل ، على التوالي. إذا لم يكن للوسائط العرض والارتفاع ، يتم تعيينها على أنها صفر.


2_كائن MediaPlayer 


يوفر MediaPlayer عناصر التحكم ، على سبيل المثال ، تشغيل ، إيقاف مؤقت ، إيقاف ، طلب ، سرعة التشغيل ، ضبط مستوى الصوت ، و لتشغيل الوسائط. يوفر MediaPlayer مُنشئًا واحدًا فقط يأخذ كائن Media كوسيطة كما راينا فى المثال السابق أو على النحو التالى :

الكود:
final MediaPlayer player = new MediaPlayer(media);


3_ الكائن MediaView 



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

توفر فئة MediaView منشأتين:

المنشىء الاول أن يتم انشاء كائن جديد من الفئة MediaView ثم تمرير الكائن  MediaPlayer باستخدام طريقة تعين الخصائص على النحو التالى :
الكود:
// Create a 400X300 MediaView
MediaView mediaView = new MediaView();
mediaView.setMediaPlayer(player);
mediaView.setFitWidth(400);
mediaView.setFitHeight(300);


المنشىء الثاني أن يتم انشاء كائن جديد من الفئة MediaView ثم تمرير الكائن  MediaPlayer مباشرة كوسيطة على النحو التالى :

الكود:
// Create a 400X300 MediaView
MediaView mediaView = new MediaView(player);
mediaView.setFitWidth(400);
mediaView.setFitHeight(300);


كما تلاحظ فى المثال اعلاه تحدد خصائص fitWidth و fitHeight العرض والارتفاع المحددين للفيديو ، على التوالي. بشكل افتراضي ، فهي صفر ، مما يعني أنه سيتم استخدام العرض والارتفاع الأصلي للوسائط.

وهناك خواص اخرى مثل :

الخاصية preserveRatio التى ما إذا كان سيتم الحفاظ على نسبة العرض إلى الارتفاع للوسائط أثناء تغيير الحجم أم لا ...بشكل افتراضي تاخذ القيمة false.

الخاصية smooth التى تحدد جودة خوارزمية التصفية لاستخدامها في تغيير حجم الفيديو. القيمة الافتراضية هي النظام الأساسي المعتمد. إذا تم تعيينه على "true" ، يتم استخدام خوارزمية تصفية أفضل جودة.

الخاصية viewport التى تحدد إطار العرض وهو عبارة عن منطقة مستطيلة لعرض جزء من الرسم. تسمح لك خصائص إطار العرض x و y معا بتحديد المنطقة المستطيلة في الفيديو التي سيتم عرضها في MediaView.

تحديد الحالة لعمليات MediaPlayer


 كائن الـــ [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] لديه عدة حالات يتم تحديدها بواسطة الخاصية status وهي خاصية للقراءة فقط. تتغير الحالة عند تنفيذ إجراء على MediaPlayer. و تاخذ أحد الثوابت الثمانية الموجودة في MediaPlayer.Status وهي على النحو التالى:

UNKNOWN
READY
PLAYING
PAUSED
STALLED
STOPPED
HALTED
DISPOSE

عندما يتم إنشاء MediaPlayer ، تكون حالته UNKNOWN وعندما يتم تحديد المصدر ينتقل حالتة MediaPlayer من READY إلى READY...و ينتقل MediaPlayer إلى حالة PLAYING عندما يتم استدعاء طريقة play و عندما يتم تشغيل MediaPlayer ، قد يدخل إلى الحالة STALLED إذا لم يكن لديه بيانات كافية في المخزن المؤقت الخاص به للتشغيل. حيث تشير هذه الحالة إلى أن MediaPlayer يقوم بتخزين البيانات مؤقتًا. عند تخزين البيانات الكافية ، يتم الرجوع إلى حالة PLAYING....الى غير ذلك من الحالات

ويمكنك تحديد تلك الحالات بطريقتان :

عن طريق إضافة ChangeListener إلى خاصية Status
عن طريق تحديد معالجات تغيير الحالة

الطريقة الأولى يمكنك استخدامها باستخدام الشفرة التالية :
الكود:
// Add a ChangeListener to the player
player.statusProperty().addListener(new ChangeListener<MediaPlayer.Status>()
{
   // Log the Message
    public void changed(ObservableValue<? extends MediaPlayer.Status> ov,
       final MediaPlayer.Status oldStatus, final MediaPlayer.Status newStatus)
    {
   messageArea.appendText("\nStatus changed from " + oldStatus + " to " + newStatus);
    }
});

الطريقة الثانية مناسبة إذا كنت مهتمًا بالتعامل مع نوع محدد من تغيير الحالة. حيث تحتوي فئة MediaPlayer على الخصائص التالية التي يمكن ضبطها على كائنات Runnable:

onReady
onPlaying
onRepeat
onStalled
onPaused
onStopped
onHalted


على سبيل المثال ، يتم استدعاء الأسلوب run () الخاص بـ onPlaying handler عندما يكون MediaPlayer في حالة PLAYING.

توضح الشفرة التالية كيفية تعيين معالجات لنوع محدد من تغيير الحالة:

الكود:
// Add a Handler for PLAYING status
player.setOnPlaying(new Runnable()
{
   public void run()
   {
      messageArea.appendText("\nPlaying now");
   }
});

// Add a Handler for STOPPED status
player.setOnStopped(new Runnable()
{
   public void run()
   {
   messageArea.appendText("\nStopped now");
   }
});


عدل سابقا من قبل زهراء في الأربعاء نوفمبر 21, 2018 10:27 am عدل 1 مرات
avatar
زهراء
........
........

تاريخ التسجيل : 18/02/2011
المساهمات : 349
النقاط : 573
التقيم : 38
الدولة : مصر
الجنس : انثى

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: تعلم JavaFx ..مقال36_ التعامل مع الميديا Media with JavaFX

مُساهمة من طرف أحمد مناع في الثلاثاء نوفمبر 20, 2018 7:35 pm


اشكرك على مجهودك الاستاذة [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] ....جارى تجهيز الشيك ...شيد حيلك cheers cheers

ـــــــــــــــــــ التوقيع ــــــــــــــــــــ
سبحان الله وبحمدة .....سبحان الله العظيم
avatar
أحمد مناع
.
.

تاريخ التسجيل : 15/02/2011
المساهمات : 860
النقاط : 201563
التقيم : 83
الدولة : مصر
الجنس : ذكر

http://egy-tech.forumegypt.net

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: تعلم JavaFx ..مقال36_ التعامل مع الميديا Media with JavaFX

مُساهمة من طرف زهراء في الأربعاء نوفمبر 21, 2018 9:29 am

[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] كتب:
اشكرك على مجهودك الاستاذة [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] ....جارى تجهيز الشيك ...شيد حيلك cheers cheers

Very Happy Very Happy
avatar
زهراء
........
........

تاريخ التسجيل : 18/02/2011
المساهمات : 349
النقاط : 573
التقيم : 38
الدولة : مصر
الجنس : انثى

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: تعلم JavaFx ..مقال36_ التعامل مع الميديا Media with JavaFX

مُساهمة من طرف NEXT في الجمعة نوفمبر 23, 2018 9:43 pm

جزاكم الله خيرا [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط]

ـــــــــــــــــــ التوقيع ــــــــــــــــــــ
avatar
NEXT
الادارة
الادارة

تاريخ التسجيل : 18/02/2011
المساهمات : 336
النقاط : 200492
التقيم : 10
الدولة : مصر
الجنس : ذكر

الرجوع الى أعلى الصفحة اذهب الى الأسفل

الرجوع الى أعلى الصفحة

ََ

مواضيع ذات صلة


 
صلاحيات هذا المنتدى:
تستطيع الرد على المواضيع في هذا المنتدى