Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Code
  2. iOS
Code

بناء مشغل MP3 مع مؤسسة AV

by
Difficulty:IntermediateLength:LongLanguages:

Arabic (العربية/عربي) translation by Yanti Baddolo (you can also view the original English article)

Final product image
What You'll Be Creating

تعد AV Foundation إطار عمل للعمل مع الوسائط الصوتية والمرئية على نظامي iOS و OSX. استخدام مركبات مؤسسة، يمكنك اللعب، التقاط، وترميز وسائل الإعلام. وإطار واسع جداً وغرض هذا البرنامج التعليمي سوف نركز على جزء الصوت. على وجه التحديد ، AVAudioPlayer فئة AVAudioPlayerلتشغيل ملفات MP3.

مشروع كاتب

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

1. ربط الإطار مؤسسة AV

قبل أن يمكنك استخدام مركبات مؤسسة، يجب عليك ربط المشروع ضد الإطار. في Project Navigator ، تأكد من تحديد المشروع الخاص بك. ضمن علامة التبويب عام ، انتقل إلى الأطر والمكتبات المرتبطة ، ومن هناك اختر AVFoundation.framework .

Linking the project against the AV Foundation framework

2فئة FileReader

في مشروع البدء ، ستجد ملفًا باسم FileReader.swift . افتح هذا الملف لعرض محتوياته. فتح هذا الملف لعرض محتوياته.

هذا هو كعب روتين بسيط للفئة التي سوف نستخدمها لقراءة الملفات من القرص.  يرث من NSObject . readFiles طريقة ، readFiles ، والتي ستكون طريقة كتابة نوع أساليب تسمح لك باستدعاء أسلوب في الفئة نفسها، النوع، بدلاً من مثيل للفئة.  يوجد أدناه تطبيق الأسلوب readFiles .

الحزمة الرئيسية يحتوي على التعليمات البرمجية والموارد المخصصة للمشروع الخاص بك، ومن هنا أن نجد ملفات mp3. نستخدم مسار الأسلوبpathsForResourcesOfType(_:inDirectory:) method ، الذي يقوم بإرجاع صفيف يحتوي على أسماء المسار لنوع المورد المحدد. في هذه الحالة ، نحن نبحث عن النوع "mp3" . نظرًا لأننا غير مهتمين بدليل محدد ، فإننا نمرر nil .

سيتم استخدام هذه الفئة من قبل فئة MP3Player ، والتي سنعمل عليها في المرة القادمة. 

3. فئة MP3Player 

بعد ذلك ، افتح MP3Player.swift وعرض محتوياته.  

لاحظ أننا AVAudioPlayerDelegate بروتوكول AVAudioPlayerDelegate . يعلن هذا البروتوكول عن عدد من الطرق المفيدة ، واحدة منها هي audioPlayerDidFinishPlaying(_:successfully:). من خلال تطبيق audioPlayerDidFinishPlaying(_:successfully:) ، سيتم إعلامنا عند انتهاء تشغيل الصوت.

الخطوة 1: الخصائص

أضف ما يلي إلى MP3Player.swift . 

ستكون خاصية player عبارة عن مثيل لفئة AVAudioPlayer ، والتي AVAudioPlayer لتشغيل ملفات MP3 وإيقافها مؤقتًا وإيقافها.  يحتفظ المتغير currentTrackIndex MP3 التي يتم تشغيلها حاليًا. وأخيرًا ، سيكون متغير tracks صفيفًا للمسارات إلى قائمة ملفات MP3 المضمنة في حزمة التطبيق.

الخطوة 2: init

أثناء التهيئة ، readFiles أسلوب readFiles FileReader لجلب مسارات ملفات MP3 وتخزين هذه القائمة في صفيف tracks . لأن هذا هو مُهيئ المعين ، يجب علينا استدعاء الأسلوب init العليا. وأخيرًا ، نسمي queueTrack ، الذي queueTrack بعد ذلك.

الخطوة 3: queueTrack

أضف التنفيذ التالي لأسلوب queueTrack إلى فئة queueTrack .

نظرًا لأننا سنقوم بإنشاء مثيل جديد لـ AVAudioPlayer كل مرة يتم فيها استدعاء هذه الطريقة ، فإننا نقومAVAudioPlayer التدبير المنزلي عن طريق تعيين player إلى nil .

نعلن NSError اختياري NSError url ثابت. fileURLWithPath(_:) لجلب المسار إلى MP3 الحالي وتخزين القيمة في url . نحن currentTrackIndex صفيف tracks كمعلمة باستخدامcurrentTrackIndex . تذكر المسارات الصفيف يحتوي على المسارات إلى ملفات mp3 وليس مرجع لملفات MP3 أنفسهم.

AVAudioPlayer player ، فإننا نمرر متغير url ومتغير error إلى AVAudioPlayer . في حالة فشل التهيئة ، يتم ملء متغير error مع وصف الخطأ. 

إذا لم نواجه خطأ ، فإننا prepareToPlay مفوض اللاعب على self prepareToPlay طريقةprepareToPlay على المشغل.  prepareToPlay طريقة prepareToPlay على تحميل المخازن المؤقتة والحصول على جهاز الصوت ، مما يقلل من أي تباطؤ عند استدعاء طريقة play . 

الخطوة 4: play

تتحقق طريقة play أولاً لمعرفة ما إذا كان الصوت مشغلاً بالفعل أم لا عن طريق التحقق من خاصية التشغيل المسماة بشكل صحيح. إذا لم يتم تشغيل الصوت ، فإنه يستدعي طريقة play الخاصة بخاصية player . 

الخطوة 5: stop

تتحقق طريقة stop أولاً من تشغيل مشغل الصوت بالفعل. إذا كان الأمر كذلك ، فإنه يستدعي أسلوب stopويقوم بتعيين الخاصية currentTime إلى 0 . عندما تستدعي أسلوب stop ، يتوقف الأمر فقط عن الصوت. فإنه لا إعادة تعيين الصوت إلى البداية، هذا السبب في أننا بحاجة إلى القيام بذلك يدوياً.

الخطوة 6: pause

تمامًا مثل طريقة stop ، نتحقق أولاً لمعرفة ما إذا كان مشغل الصوت مشغلاً أم لا. إذا كان الأمر كذلك ، فإننا نستدعي أسلوب pause .

الخطوة 7: nextSong

nextSong(_:Bool) للأغنية التالية ، وفي حالة تشغيل المشغل ، يتم تشغيل هذه الأغنية.  نحن لا نريد الأغنية التالية اللعب إذا كان اللاعب متوقفة مؤقتاً. ومع ذلك، يتم استدعاء هذا الأسلوب عند انتهاء أغنية اللعب. في هذه الحالة ، نرغب في تشغيل الأغنية التالية ، وهو ما تعنيه المعلمة songFinishedPlaying 

يتم استخدام المتغير playerWasPlaying لمعرفة ما إذا كان المشغل يلعب أم لا عندما يتم استدعاء هذه الطريقة. إذا كان يتم تشغيل الأغنية ، فإننا playerWasPlaying أسلوب stop على player وضبطplayerWasPlaying إلى true  

بعد ذلك ، نقوم بزيادة " currentTrackIndex وتحقق لمعرفة ما إذا كان أكبر من أو يساويtracks.count . تمنحك خاصية count صفيف العدد الإجمالي للعناصر في الصفيف. نحتاج إلى التأكد من أننا لا نحاول الوصول إلى عنصر غير موجود في مجموعة tracks . لمنع هذا ، قمنا بتعيينcurrentTrackIndex مرة أخرى إلى العنصر الأول من المصفوفة إذا كانت هذه هي الحالة.

وأخيرًا ، queueTrack للحصول على الأغنية التالية جاهزة ولعب تلك الأغنية إذا كان أيًا منplayerWasPlaying أو songFinishedPlaying true .

الخطوة 8: previousSong

طريقة nextSong تشبه الى حد بعيد nextSong . والفرق الوحيد هو أننا نقوم currentTrackIndexمؤشر currentTrackIndex والتحقق مما إذا كان يساوي 0 .

من خلال الاستفادة من كل من nextSong و previousSong ، فنحن قادرون على التنقل عبر كل ملفات MP3 ونبدأ من جديد عندما نصل إلى بداية القائمة أو نهايتها. 

الخطوة 9: getCurrentTrackName

يحصل أسلوب getCurrentTrackName على اسم MP3 بدون الامتداد.

نحصل على إشارة إلى ما هو MP3 الحالي باستخدام tracks[currentTrackIndex] . تذكر ، مع ذلك ، أن هذه هي المسارات إلى ملفات MP3 وليس الملفات الفعلية نفسها. المسارات طويلة بدلاً من ذلك ، لأنها المسار الكامل لملفات MP3. المسارات طويلة نوعا ما، لأن ذلك هو المسار الكامل إلى ملفات MP3.

على الجهاز الخاص بي ، على سبيل المثال ، العنصر الأول من صفيف tracks يساوي " / Users / jamestyner / Library / Developer / CoreSimulator / Devices / 80C8CD34-22AE-4F00-862E-FD41E2D8D6BA / data / Containers / Bundle / Application / 3BCF8543 -BA1B-4997-9777-7EC56B1C4348 / MP3Player.app / Lonesome Road Blues.mp3 ". سيكون هذا المسار مختلفًا على جهاز فعلي بالطبع.  سيكون هذا المسار مختلفة على جهاز الفعلية بالطبع.

لقد حصلنا على سلسلة كبيرة تحتوي على المسار إلى MP3، ولكن نريد فقط اسم MP3 نفسها. تحدد فئة NSStringخاصيتين يمكن أن تساعدنا. كما يشير الاسم ، ترجع الخاصية lastPathComponent المكون الأخير من مسار. كما قد خمنت ، يزيل الخاصية stringByDeletingPathExtension الملحق.

الخطوة 10: getCurrentTimeAsString

يستخدم أسلوب currentTime خاصية currentTime الخاصة بمثيل player currentTimeكسلسلة يمكن قراءتها بواسطة الإنسان (على سبيل المثال ، 1:02) .

الخاصية currentTime من النوع NSTimeInterval ، وهو مجرد typealias لـ Double . نحن نستخدم بعض الرياضيات للحصول على seconds minutes ، مع التأكد من تحويل time إلى Intحيث أننا نحتاج إلى العمل بأرقام كاملة. إذا لم تكن مألوفة مع المشغل الباقي (%)، يجدها المتبقية بعد تقسيم رقم واحد بآخر. إذا كان متغير time يساوي 65 ، فإن seconds تساوي 5 لأننا نستخدم 60 . 

الخطوة 11: getProgress

يتم استخدام الأسلوب getProgress بواسطة مثيل UIProgressView لإعطاء إشارة إلى مقدار تشغيل MP3. MP3. يتم تمثيل هذا التقدم بقيمة من 0.0 إلى 1.0 كـ Float .

للحصول على هذه القيمة ، نقوم بتقسيم خاصية currentTime player خاصية duration ، نقوم بتخزين هذه القيم في المتغيرات theCurrentTime و theCurrentDuration . مثل currentTime، تكون خاصية duration من النوع NSTimeInterval وتمثل مدة الأغنية بالثواني.

الخطوة 12: setVolume

setVolume(_:Float) طريقة setVolume لمثيل player .

الخطوة 13: audioPlayerDidFinishPlaying(_:successfully:)

تعد audioPlayerDidFinishPlaying(_:successfully:) طريقة طريقة بروتوكولAVAudioPlayerDelegate . تأخذ هذه الطريقة كمعلمات لمثيل AVAudioPlayer و boolean. يتم تعيين القيمة المنطقية إلى true إذا انتهى مشغل الصوت من تشغيل الأغنية الحالية.

إذا انتهيت الأغنية من اللعب بنجاح ، فإننا نطلق على طريقة nextSong ، nextSong true منذ انتهاء الأغنية من تلقاء نفسها.

هذا يكمل فئة MP3Player . سنقوم بإعادة النظر فيها بعد قليل ، بعد تنفيذ إجراءات فئة ViewController

4. فئة ViewController

افتح ViewController.swift وعرض محتوياته.

متغير mp3Player هو مثال لفئة MP3Player قمنا بتنفيذها سابقًا. سيتم استخدام متغير timer لتحديثtrackTime progressBar كل مرة.

في الخطوات القليلة التالية ، ViewController إجراءات فئة ViewController . ولكن أولاً ، يجب علينا إنشاء مثيل MP3Player . قم بتحديث تنفيذ طريقة viewDidLoad كما هو موضح أدناه.

الخطوة 1: playSong(_: AnyObject)

أدخل ما يلي في طريقة playSong(_: AnyObject) .

في هذه الطريقة ، mp3Player طريقة play على كائن mp3Player . نحن في نقطة حيث يمكننا أن نبدأ اختبار التطبيق الآن. قم بتشغيل التطبيق واضغط على زر التشغيل. وينبغي بدء الأغنية اللعب.

الخطوة 2: stopSong(_: AnyObject)

استدعاء أسلوب stopSong(_: AnyObject) أسلوب التوقف على كائن mp3Player . 

تشغيل التطبيق مرة أخرى واضغط على زر التشغيل. الآن يجب أن تكون قادراً على وقف الأغنية بالنقر فوق الزر إيقاف.

الخطوة 3: pauseSong(_: AnyObject)

كما قد خمنت ، تستدعي طريقة pauseSong(_: AnyObject) طريقة pause على كائن mp3Player.

الخطوة 4: playNextSong(_: AnyObject)

في playNextSong(_: AnyObject) ، nextSong أسلوب nextSong على كائن mp3player . ملاحظة أننا تمرير false كمعلمة، لأن الأغنية لم تنتهي اللعب الخاصة به. ونحن نبدأ الأغنية التالية يدوياً بالضغط على زر التالي.

الخطوة 5: previousSong(_: AnyObject)

كما ترون، التنفيذ previousSong(_: AnyObject) الأسلوب مشابهة جداً لتلك التي nextSong(_: AnyObject). ينبغي أن تكون كافة الأزرار الخاصة بمشغل MP3 الفنية الآن. إذا كنت لا اختبار التطبيق بعد، الآن سيكون وقتاً طيبا للتأكد من أن كل شيء يعمل كما هو متوقع.

الخطوة 6: setVolume(_: UISlider)

setVolume(_: UISlider) أسلوب استدعاء الأسلوب setVolume على كائن mp3Player . الخاصية وحدة التخزين من نوع Float . تتراوح القيمة من 0.0 إلى 1.0 .  تم UISlider كائنUISlider بـ 0.0 كقيمة دنيا و 1.0 كقيمة قصوى لها.

تشغيل التطبيق مرة أخرى واللعب مع مربع تمرير حجم الصوت اختبار أن كل شيء يعمل بشكل صحيح.

الخطوة السابعة: startTimer

أسلوب NSTimer instantiates مثيل NSTimer جديد.

scheduledTimerWithTimeInterval(_:target:selector:userInfo:repeats:) كمعلمات عدد الثواني بين إطلاق الموقت ، الكائن الذي تريد استدعاء أسلوب على المحدد بواسطة selector ، الطريقة التي يتم استدعائها عند تشغيل المؤقت ، وهو قاموس userInfo اختياري ، وما إذا كان جهاز ضبط الوقت يكرر حتى يتم إبطاله.

نحن نستخدم طريقة باسم updateViewsWithTimer(_: NSTimer) كمحدد ، لذلكupdateViewsWithTimer(_: NSTimer) ذلك التالي.

الخطوة 8: updateViewsWithTimer(_: NSTimer)

updateViewsWithTimer(_: NSTimer) updateViewsWithTimer(_: NSTimer) طريقة updateViews ، والتي updateViews في الخطوة التالية.

الخطوة التاسعة: updateViews

تقوم طريقة updateViews بتحديث trackTime و progressBar views.

يتم تحديث خاصية text من trackTime مع الخاصية currentTime ، المنسقة كسلسلة عن طريق استدعاء الأسلوب getCurrentTimeAsString  نعلن عن progress مستمر باستخدام طريقةgetProgress ، وتعيين progressBar.progress باستخدام هذا الثابت.

الخطوة 10: الأسلاك يصل جهاز ضبط الوقت

الآن نحن بحاجة إلى استدعاء طريقة startTimer في الأماكن المناسبة. نحتاج إلى تشغيل جهاز ضبط الوقت في طريقة playSong(_: AnyObject)، أسلوب playNextSong(_ :AnyObject) ، والأسلوبplayPreviousSong(_ :AnyObject) .

الخطوة 11: إيقاف جهاز ضبط الوقت

نحتاج أيضًا إلى إيقاف timer عندما يتم الضغط على أزرار الإيقاف والتوقف. يمكنك إيقاف كائن timerضبط timer عن طريق استدعاء أسلوب invalidate على مثيل NSTimer . 

الخطوة 12: setTrackName

setTrackName الأسلوب setTrackName الخاصية text لـ trackNamegetCurrentTrackName على كائن mp3Player .

الخطوة 13: setupNotificationCenter

عند انتهاء أغنية اللعب، ينبغي أن تظهر اسم الأغنية التالية تلقائياً وبدء تشغيل الأغنية. أيضاً ، عندما يقوم المستخدم بالضغط على الزر "تشغيل" أو التالي أو الأزرار السابقة ، يجب استدعاء أسلوب setTrackName . المكان المثالي للقيام بذلك هو طريقة queueTrack .

نحتاج إلى طريقة ViewController فئة ViewController بفئة ViewController لاستدعاء طريقة setTrackName .   للقيام بذلك ، سوف نستخدم فئة NSNotificationCenter . مركز إعلام يوفر طريقة بث المعلومات في جميع أنحاء برنامج. بالتسجيل كمراقب مع مركز إعلام، كائن يمكن أن تلقي هذه البرامج الإذاعية والقيام بعملية. كائن تلقي هذه البث وتنفيذ عملية. والطريقة الأخرى لإنجاز هذه المهمة هي استخدام نمط التفويض . 

أضف الأسلوب التالي إلى فئة ViewController .

نحن أولاً الحصول على مرجع إلى مركز الإعلام الافتراضي. ثمaddObserver(_:selector:name:object:) أسلوبaddObserver(_:selector:name:object:) في مركز الإعلام.  هذا الأسلوب يقبل المعلمات الأربعة:

  • الكائن تسجيل كمراقب ، self في هذه الحالة
  • الرسالة التي سيتم إرسالها إلى المراقب عندما يتم نشر الإشعار
  • اسم الإخطار التي يتم تسجيل المراقب
  • الكائن الإخطارات التي يريد المراقب لتلقي

بالمرور nil كوسيطة أخيرة ، فإننا نستمع إلى كل إشعار يحتوي على اسم SetTrackNameText .

الآن نحن بحاجة إلى استدعاء هذا الأسلوب في طريقة viewDidLoad التحكم في viewDidLoad .

الخطوة 14: نشر الإشعار

لنشر الإشعار ، نطلب postNotificationName(_:object:) في مركز الإشعارات الافتراضي. كما ذكرت سابقًا ، سنفعل ذلك في طريقة queueTrack . افتح MP3Player.swift وقم بتحديث طريقةqueueTrack كما هو موضح أدناه.

إذا قمت باختبار التطبيق الآن واسمحوا أغنية على طول الطريق من خلال اللعب، فإنه ينبغي بدء تشغيل الأغنية التالية تلقائياً. ولكن يمكن أن يتساءل لماذا اسم الأغنية لا تظهر أثناء الأغنية الأولى. تستدعي طريقة init لفئة queueTrackطريقة queueTrack ، ولكن نظرًا لعدم انتهائها من التهيئة ، فإنها لا تؤثر.

كل ما نحتاج إليه هو استدعاء طريقة setTrackName يدويًا بعد تهيئة كائن mp3Player . قم بإضافة التعليمة البرمجية التالية إلى طريقة viewDidLoad في ViewController.swift . 

ستلاحظ أنني اتصلت أيضًا بطريقة updateViews . بهذه الطريقة ، يعرض اللاعب وقتًا 0:00 في البداية. إذا قمت باختبار التطبيق الآن، يجب أن يكون مشغل MP3 تعمل بكامل طاقتها.

الاستنتاج

وكان هذا البرنامج تعليمي طويلة نوعا، ولكن الآن لديك مشغل MP3 فنية على بناء وتوسيع.  اقتراح واحد هو السماح للمستخدم باختيار أغنية للعب من خلال تطبيق UITableView أسفل المشغل. شكرا للقراءة، وآمل أن كنت قد تعلمت شيئا مفيداً.



Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.