برمجة - شبكات - كمبيوتر - منتديات الفريق العربي للبرمجة: Qt And Phonon - برمجة - شبكات - كمبيوتر - منتديات الفريق العربي للبرمجة

اذهب للمحتوى

صفحة 1 من 1
  • لا يمكنك بدء موضوع جديد
  • لا يمكنك الرد على هذا الموضوع

Qt And Phonon Play Multimedia files اضف تقييما للموضوع ***** 1 التصويت

#1     غير متواجد   SudaNix Icon

  • مشرف قسم Cross platforms
  • مجموعة المشرفون
  • مشاركات 193
  • التقييم 27
  • النقاط المتوفرة 9.00
  • 3.00
    النقاط المحصلة
++

ارسل ايقونة  تم الارسال 31/03/2009 - 02:36 AM

مقدمة:

Posted Image

فونون phonon هي عبارة عن Multimedia API لتشغيل ملفات الصوت والفيديو .
هذا المشروع طور في الاساس لسطح المكتب 4 KDE بهدف عمل واجهة بسيطة Simple Interface لتطوير تطبيقات الـ Multimedia بدلا من الحلول المعقدة قبلها .ومن مميزاتها الرئيسية هي انها مفصولة تماما عن أي محرك صوتيات Multimedia Framework/Server مثل GStreamer,Xine,VLC...etc وتستطيع استخدامها مع اي محرك في حالة توفر plugin له.

بداية مشروع phonon كانت بالاعتماد على محرك xine في تشغيل ملفات الصوت و الفيديو ، الى أن تدخلت TT "حاليا qtsoftware" وقامت باضافة عدة plugin بحيث أصبحت phonon أيضا تدعم GStreamer على اللينوكس " ، و DirectShow في ويندوز و QT" QuikTime" في OS X .

اذا ياختصار phonon هي دوال فقط او front-end، ولا تعمل بدون محركات الصوت back-end ، فوظيفتها فقط هي توفير واجهة موحدة لتشغيل الملتميديا .

وفي +Qt 4.4 قامت qtsoftware باستخدام phonon كموديل ،وبهكذا أصبح بالامكان تطوير تطبيقات لتشغيل ملفات الصوت والفيديو بشكل متعدد المنصات Cross Platform ،بدلا من اللجوء الى اي مكتبات خارجية External Libs ، لكن لن تستطيع سوى استخدام المحركات التي قامت qtsoftware بدعمها في Qt ، لذلك يجب توفر المحركات/البرامج الاتية لكي تعمل معك phonon بشكل صحيح :
في اللينوكس يجب توفر GStreamer
اما في الويندوز يجب توفر DirectShow
وفي ماك OS X يجب توفر QuikTime



تنصيب phonon على ويندوز
يجب تحميل Dx و DirectShow 9 بالاضافة الى SDK لويندوز.
وأيضا يجب توفر فيجوال سي++.

وهذه روابط تشرح كيفية التنصيب :
http://www.matthiaspospiech.de/blog/2008/0...der-windows-xp/
http://wiki.qtcentre.org/index.php?title=B...ows_using_MinGW


التنصيب على لينوكس :
قم بفتح مدير الحزم وحمل gstreamer اولا ثم قم بتحميل الباكج التالية :

phonon
libphonon4
phonon-devel
phonon-backend-gstreamer

فقط من دون الحاجة الى اعادة ترجمة كيوت !

الشكل العام ل phonon :
تتكون phonon من ثلاث مفاهيم أساسية وهي media objects, sinks, and paths .
ال media object هي الفئة التي تتعامل مع ملفات الصوت والفيديو وتقوم بالتحكم فيها starting, stopping, and pausing
اما ال sinks فهي الفئات المتخصة باخراج الصوت او الفيديو الى كرت الصوت او الشاشة.
اخيرا ال path يمثل الفئة التي تربط بين ال media objects و ال sinks ، بحيث يقوم ال media object بارسال ال media stream الى اي sink مرتبط به عبر path معين وبعدها يقوم ال sink بارسال هذا ال stream الى كرت الصوت او الشاشة.


ملاحظات:
+فئات ودوال phonon معرفة في مساحة الاسماء Phonon لذلك ستجد قبل كل فئة او دالة اسم مساحة الاسماء Phonon::XXX.
+في ملف المشروع يجب إضافة : QT += phonon.

كيفية استخدام phonon :
يوجد طريقتين تستطيع بها تشغيل ملفات الصوت والفيديو في phonon ، الطريقة الاولى وهي بسيطة جدا ولا تتطلب انشاء العناصر الثلاثة السابقة ، فقط عليك ان تقوم باستدعاء الدالة Phonon::createPlayer مع تمرير الملف المراد تشغيله ومن ثم استدعاء الدالة play .
مثال لتشغيل ملف صوت:

Phonon::MediaObject* audioPlayer = Phonon::createPlayer(Phonon::MusicCategory,Phonon::MediaSource("sound.mp3"));
audioPlayer->play();


بنفس الطريقة أيضا يمكن تشغيل ملف فيديو ، حيث يجب انشاء كائن من الفئة Phonon::VideoPlayer ومن ثم استدعاء الدالة play وتمرير اسم ملف الفيديو .
مثال:

Phonon::VideoPlayer* videoPlayer = new Phonon::VideoPlayer(Phonon::VideoCategory,this);
videoPlayer->play(Phonon::MediaSource("sound.mp3"));



انشاء العناصر الاساسية ل phonon :

ال MediaObject :
كما ذكرنا سابقا هذه الفئة تحمل الملف المراد تشغيله ، وكذلك تتحكم في ال playback مثل play,pause,seek and stop

ال MediaSource :
تمثل الملف المراد تشغيله ، والذي يمكن ان يكون على جهازك او في موقع url او في جهاز اخر على الشبكة.

ال Sinks :
وتاتي على شكلين ، الاول هو AudioOutput وهي الفئة التي تنقل الصوت الى كرت الصوت، وايضا تتحكم في درجة الصوت وال Mute.
والشكل الثاني هو VideoWidget وهي تختص بعرض ملفات الفيديو وتتحكم في ال brightness, hue, and scaling للفيديو.

مثال لتشغيل ملف صوت عن طريق بناء العناصر:

Phonon::MediaObject* player=new Phonon::MediaObject(parent);
player->setCurrentSource(Phonon::MediaSource("/home/audio.mp3"));
Phonon::AudioOutput* audioOutput=new Phonon::AudioOutput(parent);
Phonon::createPath(player,audioOutput);
player->play();


صورة توضيحية :
Posted Image

وهذا مثال اخر لتشغيل ملف فيديو "من دون صوت "

Phonon::MediaObject* player=new Phonon::MediaObject(parent);
player->setCurrentSource(Phonon::MediaSource("/home/video.mpg"));
Phonon::VideoWidget* videoWidget=new Phonon::VideoWidget(parent);
Phonon::createPath(player,videoWidget);
player->play();


ولتشغيل ملف يحوي فيديو مع الصوت يجب انشاء AudioOutput و VideoWidget كالاتي:

Phonon::MediaObject* player=new Phonon::MediaObject(parent);
player->setCurrentSource(Phonon::MediaSource("/home/video.mpg"));
Phonon::AudioOutput* audioOutput=new Phonon::AudioOutput(parent);
Phonon::createPath(player,audioOutput);

Phonon::VideoWidget* videoWidget=new Phonon::VideoWidget(parent);
Phonon::createPath(player,videoWidget);
player->play();


صورة توضيحية:
Posted Image


عناصر اخرى في phonon:

ال SeekSlider:
تقوم هذه الفئة الرسومية بعمل slider لملف ال media وتتحكم في ال seek postion.
مثال:

Phonon::MediaObject* player=new Phonon::MediaObject(parent);
player->setCurrentSource(Phonon::MediaSource("/home/audio.mp3"));
Phonon::AudioOutput* audioOutput=new Phonon::AudioOutput(parent);
Phonon::createPath(player,audioOutput);
Phonon::SeekSlider *slider = new Phonon::SeekSlider;
slider->setMediaObject(player);
slider->show();
player->play();


ال VolumeSlider:
ايضا تقوم هذه الفئة الرسومية بعمل slider لكن للتحكم في الصوت.
وبنفس المثال السابق ، فقط أضف:

Phonon::VolumeSlider *volumeSlider = new Phonon::VolumeSlider;
volumeSlider->setAudioOutput(audioOutput);
//...etc
volumeSlider->show();


ال Effect:
وهي الفئة المختصة بعمل تاثيرات على الصوت حيث يتم انشاء كائن منها ومن ثم ادخاله على ال Path الذي يمر فيه ال media stream.

مثال:
Phonon::Effect *effect =new Phonon::Effect(Phonon::BackendCapabilities::availableAudioEffects()[0], this);
path.insertEffect(effect);


وفيه تم تطبيق اول تأثير مدعوم من ال backend .
حيث ان الدالة availableAudioEffects تعيد لنا التأثيرات المدعومة من طرف محرك الصوت لديك backend ، ومن ثم تم ادخال التأثير على ال path الذي يمر فيه الصوت ، وتستطيع حذف التأثير المدخل عن طريق الدالة removeEffect

ال EffectWidget:
فئة رسومية للتحكم في معطيات التأثير.
مثال:
Phonon::EffectWidget *effectWidget = new Phonon::EffectWidget(effect);
effectWidget->show();


كتابة برنامج Media Player :
سنقوم بكتابة مشغل صوتيات بسيط ، ولن نضيف الكثير من الخيارات فقط تشغيل وايقاف الصوت حتى يكون الدرس بسيط.

ملف main.cpp واضح وهو فقط لاستدعاء الدالة show لكائن الفئة QPlayer
ملف qplayer.h ويحتوي على ال class defintion وتطبيقه واضح.
ملف qplayer.cpp :

دالة بناء الفئة:
QPlayer::QPlayer(QWidget* parent):
QWidget(parent)
{
	player = new Phonon::MediaObject(this);
	audioOutput = new Phonon::AudioOutput(Phonon::MusicCategory,this);
	videoWidget = new Phonon::VideoWidget(this);
	createPath(player,audioOutput);
	createPath(player,videoWidget);
	
	player->setTickInterval(1000);
	
	connect(player,SIGNAL(tick(qint64)),this,SLOT(tick(qint64)));
	
	setupUi();

	setWindowTitle(tr("QPlayer v0.1"));
	setWindowIcon(QIcon(":/images/qplayer.png"));
}


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

الدالة setupUi تقوم بانشاء الواجهة للبرنامج .
وبقية الدوال slot تطبيقها مباشر.


void QPlayer::setupUi()
{
	seekSlider = new Phonon::SeekSlider(player,this);
	volumeSlider = new Phonon::VolumeSlider(audioOutput,this);
	
	QLabel* fileLable=new QLabel(tr("&File Name:"));
	
	fileEdit=new QLineEdit;
	
	fileLable->setBuddy(fileEdit);
	
	lcdTimer = new QLCDNumber;
	lcdTimer->display("00:00");
	
	QPushButton* browseButton=new QPushButton(tr("&Browse"));
	playButton=new QPushButton(tr("&Play"));
	QPushButton* pauseButton=new QPushButton(tr("P&ause"));
	QPushButton* stopButton=new QPushButton(tr("&Stop"));
	
	playButton->setIcon(QIcon(":/images/play.png"));
	pauseButton->setIcon(QIcon(":/images/pause.png"));
	stopButton->setIcon(QIcon(":/images/stop.png"));
	browseButton->setIcon(QIcon(":/images/folder-music.png"));
	
	playButton->setEnabled(false);
	
	connect(browseButton,SIGNAL(clicked()),this,SLOT(browseClicked()));
	connect(playButton,SIGNAL(clicked()),this,SLOT(playClicked()));
	connect(pauseButton,SIGNAL(clicked()),this,SLOT(pauseClicked()));
	connect(stopButton,SIGNAL(clicked()),this,SLOT(stopClicked()));
	
	connect(fileEdit,SIGNAL(textChanged(const QString&)),this,SLOT(checkFileName(const QString&)));
	
	
	QHBoxLayout* upperLayout=new QHBoxLayout;
	upperLayout->addWidget(fileLable);
	upperLayout->addWidget(fileEdit);
	upperLayout->addWidget(browseButton);
	
	QHBoxLayout* midLayout=new QHBoxLayout;
	midLayout->addWidget(seekSlider);
	midLayout->addWidget(lcdTimer);
	
	QHBoxLayout* lowerLayout=new QHBoxLayout;
	lowerLayout->addWidget(playButton);
	lowerLayout->addWidget(pauseButton);
	lowerLayout->addWidget(stopButton);
	lowerLayout->addWidget(volumeSlider);
	
	QVBoxLayout* layout=new QVBoxLayout(this);
	layout->addLayout(upperLayout);
	layout->addWidget(videoWidget);
	layout->addLayout(midLayout);
	layout->addLayout(lowerLayout);
	
	lcdTimer->setSizePolicy(QSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed));
	seekSlider->setSizePolicy(QSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed));
	volumeSlider->setSizePolicy(QSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed));
}

void QPlayer::tick(qint64 time)
{
	QTime displayTime(0,(time/60000)%60,(time/1000)%60);
	lcdTimer->display(displayTime.toString("mm:ss"));
}

void QPlayer::playClicked()
{
	player->setCurrentSource(fileEdit->text());
	player->play();
}


void QPlayer::pauseClicked()
{
	player->pause();
}

void QPlayer::stopClicked()
{
	player->stop();
	lcdTimer->display("00:00");
}

void QPlayer::browseClicked()
{
	QString fileName = QFileDialog::getOpenFileName(this);
	
	if ( !fileName.isEmpty() )
		fileEdit->setText(fileName);
}


void QPlayer::checkFileName(const QString& str)
{
	if( !str.isEmpty() )
		playButton->setEnabled(true);
	 else
playButton->setEnabled(false);
}



حمل الملفات من المرفقات .

النتيجة :
Posted Image


اخيرا:
مشروع phonon ما زال تحت التطوير ويعمل فيه المساهمون "ومن ضمنهم شركة qtsoftware" على تطويره وأضافة العديد من الخصائص الغير متوفرة حاليا ، لذلك اذا أردت كتابة تطبيقات متقدمة للصوت والفيديو فان phonon لن تفيدك في الوضع الحالي ويجب عليك ان تستخدم اي مكتبة خارجية مثل FMod.
ايضا النسخة الحالية من كيوت 4.5 لا تستخدم كل خصائص phonon المتوفرة الان ، نظرا لان المشروع في تطور مستمر ، ونسخة كيوت تم بنائها على نسخة مستقرة .


الى هنا ننتهي درسنا اليوم.
أي سؤال يرحب به.

الى اللقاء.

ملف مرفق(ملفات)

  • ملف مرفق  qplayer.tar.gz (13.92كيلو )
    عدد مرات التحميل : 125

0

شارك هذا الموضوع

      

#2     غير متواجد   eramax Icon

  • عضو شرف
  • مجموعة أعضاء الشرف
  • مشاركات 871
  • التقييم 28
  • النقاط المتوفرة 12.00
  • 5.00
    النقاط المحصلة
++

تم الارسال 31/03/2009 - 03:38 AM

درس رائع جدا ساقوم بالقراءة والتطبيق فى اسرع وقت
جزاك الله خيرا
0

#3     غير متواجد   ahmed_youssef Icon

  • خبير بايثون
  • مجموعة الخبراء المعتمدون
  • مشاركات 829
  • التقييم 62
  • النقاط المتوفرة 60.66
  • 56.36
    النقاط المحصلة
++

تم الارسال 01/04/2009 - 02:10 PM

بجد اكتر من ممتاز ان شاء الله هعمل تطبيق ببايثون مبنى على الدرس دا
0

#4     غير متواجد   asm-soft Icon

  • عضو شرف
  • مجموعة أعضاء الشرف
  • مشاركات 771
  • التقييم 77
  • النقاط المتوفرة 20.80
  • 14.80
    النقاط المحصلة
++

تم الارسال 01/04/2009 - 03:31 PM

:015:
0

#5     غير متواجد   ahmed_youssef Icon

  • خبير بايثون
  • مجموعة الخبراء المعتمدون
  • مشاركات 829
  • التقييم 62
  • النقاط المتوفرة 60.66
  • 56.36
    النقاط المحصلة
++

تم الارسال 05/04/2009 - 07:51 AM

نفس التطبيق ببايثون
Posted Image

ملف مرفق(ملفات)

  • ملف مرفق  pyqplayer.zip (60.82كيلو )
    عدد مرات التحميل : 120

تم تعديل هذه المشاركة بواسطةahmed_youssef: 05/04/2009 - 01:12 PM

0

#6     غير متواجد   محمد سمير Icon

  • عضو فعال
  • مجموعة اعضاء
  • مشاركات 461
  • التقييم 9
  • النقاط المتوفرة 6.00
  • 0.00
    النقاط المحصلة
++

تم الارسال 06/04/2009 - 03:23 PM

تسلم SudaNix على الموضوع اجميل , و تسلم يا أحمد على نسخة بايثون.
0

#7     غير متواجد   ibr_exn Icon

  • مشرف قسم الرياضيات والخوارزميات
  • مجموعة المشرفون
  • مشاركات 1062
  • التقييم 58
  • النقاط المتوفرة 25.00
  • 5.00
    النقاط المحصلة
++

تم الارسال 09/04/2009 - 09:29 PM

ماشاء الله بصراحة تستاهل الاشراف <_<
0

#8     غير متواجد   حازم مفيد Icon

  • عضو
  • مجموعة اعضاء
  • مشاركات 78
  • التقييم 3
  • النقاط المتوفرة 6.00
  • 0.00
    النقاط المحصلة
++

تم الارسال 10/04/2009 - 07:06 PM

فعلا درس جميل و المشروع جميل جدا

جزاك الله خير اخي ووفقك :)

في اامان الله
0

#9     غير متواجد   yajay Icon

  • عضو جديد
  • مجموعة اعضاء جدد
  • مشاركات 20
  • التقييم 0
  • النقاط المتوفرة 6.00
  • 0.00
    النقاط المحصلة
++

تم الارسال 11/05/2009 - 08:59 AM

جزاك الله خيرا على الشرح الطيب

في حمى الرحمن
0

شارك هذا الموضوع


صفحة 1 من 1
  • لا يمكنك بدء موضوع جديد
  • لا يمكنك الرد على هذا الموضوع

( 1 ) عضو يشاهد هذا الموضوع
( 0 ) الأعضاء, ( 1 ) الزوار, ( 0 ) عضو بدخول مخفي




لإفضل مشاهدة للمنتدى إستخدم مستعرض فايرفوكس
Free PageRank Checker

 الآن ... إستايل خاص لمن يملك هاتف iPhone  ... لتنزيل البرنامج  اضغط هنا