Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. iOS
Code

Bangun MP3 Player Dengan AV Foundation

by
Difficulty:IntermediateLength:LongLanguages:

Indonesian (Bahasa Indonesia) translation by graywest (you can also view the original English article)

Final product image
What You'll Be Creating

AV Foundation adalah kerangka kerja untuk bekerja dengan audio dan visual media di iOS dan OSX. Menggunakan AV Foundation, Anda dapat memainkan, menangkap, dan menyandikan media. Ini merupakan kerangka kerja yang luas dan untuk tujuan tutorial ini kita akan fokus pada porsi audio. Secara khusus, kita akan menggunakan kelas AVAudioPlayer untuk memutar file MP3.

Proyek Starter

Saya telah menyediakan proyek awal yang memiliki semua tindakan dan outlet yang sudah dikonfigurasi, dan dengan metode yang tepat mematikan. Kelas yang digunakan oleh proyek, sudah mati juga sehingga kita bisa langsung masuk ke kode. Anda dapat mengunduh proyek starter dari GitHub.

1. Menghubungkan Kerangka AV Foundation

Sebelum Anda dapat menggunakan AV Foundation, Anda harus menghubungkan proyek tersebut dengan framework. Di Navigator Proyek, pastikan proyek Anda dipilih. Di bawah tab General, pergi ke Linked Frameworks and Libraries dan dari sana Anda memilih AVFoundation.framework.

Linking the project against the AV Foundation framework

2. FileReader Class

Dalam proyek awal, Anda akan menemukan file bernama FileReader.swift. Buka file ini untuk melihat isinya.

Ini adalah tulisan rintisan sederhana dari kelas yang akan kita gunakan untuk membaca file dari disk. Itu mewarisi dari NSObject. Kami akan menerapkan metode, readFiles, yang akan menjadi tipe metode. Tipe metode memungkinkan Anda untuk memanggil metode di kelas itu sendiri, jenis, sebagai lawan dari sebuah instance dari kelas. Di bawah ini adalah implementasi metode readFiles.

Paket utama berisi kode dan sumber daya untuk proyek Anda, dan di sinilah kita akan menemukan MP3. Kami menggunakan metode metode pathSForResourcesOfType (_: inDirectory :), yang mengembalikan larik yang berisi nama path untuk jenis sumber daya yang ditentukan. Dalam hal ini, kami mencari tipe "mp3". Karena kami tidak tertarik dengan direktori tertentu, kami lulus dalam nol.

Kelas ini akan digunakan oleh kelas MP3Player, yang akan kita kerjakan selanjutnya.

3. MP3Player Class

Selanjutnya, buka MP3Player.swift dan lihat isinya.

Perhatikan bahwa kami mengadopsi protokol AVAudioPlayerDelegate. Protokol ini menyatakan sejumlah metode yang berguna, salah satunya adalah audioPlayerDidFinishPlaying (_: berhasil :). Dengan menerapkan metode audioPlayerDidFinishPlaying (_: berhasil :), kami akan diberitahu ketika audio telah selesai diputar.

Langkah 1: Properti

Tambahkan yang berikut ini ke MP3Player.swift.

Properti pemutar akan menjadi instance kelas AVAudioPlayer, yang akan kita gunakan untuk memutar, menjeda, dan menghentikan MP3. Variabel currentTrackIndex melacak MP3 yang sedang diputar. Akhirnya, variabel trek akan menjadi larik jalur ke daftar MP3 yang termasuk dalam bundel aplikasi.

Langkah 2: init

Selama inisialisasi, kami memanggil metode readFiles FileReader untuk mengambil jalur MP3 dan menyimpan daftar ini di lintasan trek. Karena ini adalah penginisialisasi yang ditunjuk, kita harus memanggil metode init dari superclass. Akhirnya, kami memanggil queueTrack, yang akan kami tulis berikutnya.

Langkah 3: queueTrack

Tambahkan implementasi berikut untuk metode queueTrack ke kelas MP3Player.

Karena kami akan melakukan instantiasi instance AVAudioPlayer baru setiap kali metode ini dipanggil, kami melakukan sedikit pembenahan dengan mengatur pemain ke nol.

Kami menyatakan NSError opsional dan url konstan. Kami memanggil fileURLWithPath (_ :) untuk mengambil jalur ke MP3 saat ini dan menyimpan nilai dalam url. Kami melewati lintasan trek sebagai parameter menggunakan currentTrackIndex sebagai subskripnya. Ingat lintasan trek berisi jalur ke MP3, bukan referensi ke file MP3 itu sendiri.

Untuk instantiate pemutar, kami meneruskan variabel konstanta dan kesalahan url ke penginisialisasi AVAudioPlayer. Jika inisialisasi terjadi gagal, variabel kesalahan diisi dengan penjelasan mengenai kesalahan.

Jika kami tidak menemukan kesalahan, kami menetapkan delegasi pemain ke diri sendiri dan meminta metode prepareToPlay pada pemain. Metode prepareToPlay melakukan pramuat buffer dan memperoleh perangkat keras audio, yang meminimalkan lag apa pun saat memanggil metode putar.

Langkah 4: mainkan

Metode bermain pertama memeriksa untuk melihat apakah audio sudah bermain dengan memeriksa properti bermain aptly bernama. Jika audio tidak diputar, maka akan mengaktifkan metode putar dari properti pemutar.

Langkah 5: berhenti

Metode berhenti pertama memeriksa apakah pemutar audio sudah bermain. Jika ya, itu akan memanggil metode berhenti dan mengatur properti currentTime ke 0. Ketika Anda memanggil metode berhenti, itu hanya menghentikan audio. Itu tidak mengatur ulang audio kembali ke awal, itulah sebabnya mengapa kita perlu melakukannya secara manual.

Langkah 6: menjeda

Sama seperti metode berhenti, pertama-tama kita periksa untuk melihat apakah pemutar audio sedang diputar. Jika ya, kami meminta metode jeda.

Langkah 7: nextSong

Metode nextSong (_: Bool) akan memasukkan lagu berikutnya dan, jika pemain sedang bermain, memainkan lagu itu. Kami tidak ingin lagu berikutnya diputar jika pemain dijeda. Namun, metode ini juga disebut ketika sebuah lagu selesai diputar. Dalam hal ini, kami ingin memainkan lagu berikutnya, yang menjadi tujuan dari lagu parameterFinishedPlaying.

Variabel playerWasPlaying digunakan untuk memberi tahu apakah pemain sedang bermain saat metode ini dipanggil atau tidak. Jika lagu itu diputar, kami meminta metode berhenti pada pemutar dan mengatur pemutarWasPlaying menjadi true.

Selanjutnya, kami menaikkan currentTrackIndex dan memeriksa untuk melihat apakah itu lebih besar dari atau sama dengan tracks.count. Hitung milik larik memberi kita jumlah total item dalam larik. Kita harus yakin bahwa kita tidak mencoba mengakses elemen yang tidak ada di lintasan trek. Untuk mencegah ini, kami mengatur currentTrackIndex kembali ke elemen pertama dari array jika itu adalah kasusnya.

Akhirnya, kita memanggil queueTrack untuk mendapatkan lagu berikutnya siap dan memainkan lagu itu jika salah satu pemainWasPlaying atau songFinishedPlaying adalah benar.

Langkah 8: previousSong

Metode previousSong bekerja sangat mirip dengan nextSong. Satu-satunya perbedaan adalah kita menurunkan currentTrackIndex dan memeriksa apakah itu sama dengan 0. Jika ya, kita atur ke indeks elemen terakhir dalam array.

Dengan memanfaatkan metode nextSong dan previousSong, kita dapat menggilir semua MP3 dan memulai kembali ketika kita mencapai awal atau akhir daftar.

Langkah 9: getCurrentTrackName

Metode getCurrentTrackName mendapatkan nama MP3 tanpa ekstensi.

Kami mendapatkan referensi untuk apa pun MP3 saat ini dengan menggunakan trek [currentTrackIndex]. Ingat, bagaimanapun, bahwa ini adalah jalur ke MP3 dan bukan file sebenarnya itu sendiri. Jalurnya agak panjang, karena itu adalah path lengkap ke file MP3.

Di komputer saya, misalnya, elemen pertama dari lintasan trek sama dengan "/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". Jalur ini akan berbeda pada perangkat yang sebenarnya tentu saja.

Kami punya string besar yang berisi jalur ke MP3, tetapi kami hanya ingin nama MP3 itu sendiri. Kelas NSString mendefinisikan dua properti yang dapat membantu kita. Seperti namanya, properti lastPathComponent mengembalikan komponen terakhir dari sebuah path. Seperti yang Anda duga, properti stringByDeletingPathExtension menghapus ekstensi.

Langkah 10: getCurrentTimeAsString

Metode getCurrentTimeAsString menggunakan properti currentTime dari instance pemain dan mengembalikannya sebagai string yang dapat dibaca manusia (misalnya, 1:02).

Properti currentTime adalah tipe NSTimeInterval, yang hanya merupakan typealias untuk Double. Kami menggunakan beberapa matematika untuk mendapatkan detik dan menit, memastikan kami mengonversi waktu ke Int karena kami perlu bekerja dengan bilangan bulat. Jika Anda tidak akrab dengan operator sisanya (%), ia menemukan sisanya setelah pembagian satu nomor dengan yang lain. Jika variabel waktu sama dengan 65, maka detik akan sama dengan 5 karena kita menggunakan 60.

Langkah 11: getProgress

Metode getProgress digunakan oleh instance UIProgressView untuk memberikan indikasi seberapa banyak MP3 telah diputar. Kemajuan ini diwakili oleh nilai dari 0,0 hingga 1,0 sebagai Float.

Untuk mendapatkan nilai ini, kami membagi properti currentTime pemain berdasarkan properti durasi pemain, kami menyimpan nilai-nilai ini dalam variabel theCurrentTime dan theCurrentDuration. Seperti currentTime, properti durasi adalah tipe NSTimeInterval dan ini mewakili durasi lagu dalam hitungan detik.

Langkah 12: setVolume

Metode setVolume (_: Float) memanggil metode setVolume dari instance pemain.

Langkah 13: audioPlayerDidFinishPlaying(_:successfully:)

Metode audioPlayerDidFinishPlaying (_: berhasil :) adalah metode dari protokol AVAudioPlayerDelegate. Metode ini mengambil parameter sebagai instance AVAudioPlayer dan boolean. Boolean diatur ke true jika pemutar audio telah selesai memutar lagu saat ini.

Jika lagu berhasil selesai diputar, kita memanggil metode nextSong, menyampaikannya dengan benar sejak lagu selesai diputar sendiri.

Ini melengkapi kelas MP3Player. Kami akan mengunjunginya kembali beberapa saat kemudian, setelah menerapkan tindakan kelas ViewController.

4. Kelas ViewController

Buka ViewController.swift dan lihat isinya.

Variabel mp3Player adalah contoh dari kelas MP3Player yang kami terapkan sebelumnya. Variabel timer akan digunakan untuk memperbarui trackTime dan progressBar views setiap detik.

Dalam beberapa langkah selanjutnya, kami akan menerapkan tindakan kelas ViewController. Tapi pertama-tama, kita harus memberi contoh Instance MP3Player. Perbarui penerapan metode viewDidLoad seperti yang ditunjukkan di bawah ini.

Langkah 1: playSong(_: AnyObject)

Masukkan yang berikut di metode playSong (_: AnyObject).

Dalam metode ini, kita memanggil metode bermain pada objek mp3Player. Kami berada di titik di mana kami dapat mulai menguji aplikasi sekarang. Jalankan aplikasi dan tekan tombol putar. Lagu itu harus mulai diputar.

Langkah 2: stopSong (_: AnyObject)

Metode stopSong (_: AnyObject) memanggil metode berhenti pada objek mp3Player.

Jalankan aplikasi lagi dan ketuk tombol putar. Anda sekarang harus dapat menghentikan lagu dengan mengetuk tombol stop.

Langkah 3: pauseSong (_: AnyObject)

Seperti yang Anda duga, metode pauseSong (_: AnyObject) memanggil metode jeda pada objek mp3Player.

Langkah 4: playNextSong (_: AnyObject)

Di playNextSong (_: AnyObject), kita memanggil metode nextSong pada objek mp3player. Perhatikan bahwa kita melewatkan false sebagai parameter, karena lagunya tidak selesai diputar sendiri. Kami secara manual memulai lagu berikutnya dengan menekan tombol berikutnya.

Langkah 5: previousSong (_: AnyObject)

Seperti yang Anda lihat, penerapan metode previousSong (_: AnyObject) sangat mirip dengan nextSong (_: AnyObject). Semua tombol pemutar MP3 harus berfungsi sekarang. Jika Anda belum menguji aplikasi, sekarang adalah saat yang tepat untuk memastikan semuanya berjalan sesuai harapan.

Langkah 6: setVolume(_: UISlider)

Metode setVolume (_: UISlider) memanggil metode setVolume pada objek mp3Player. Properti volume adalah tipe Float. Nilai berkisar dari 0,0 hingga 1,0. Objek UISlider diatur dengan 0,0 sebagai nilai minimumnya dan 1,0 sebagai nilai maksimumnya.

Jalankan aplikasi sekali lagi dan mainkan dengan penggeser volume untuk menguji bahwa semuanya bekerja dengan benar.

Langkah 7: startTimer

Metode startTimer instantiates contoh NSTimer baru.

The scheduledTimerWithTimeInterval (_: target: selector: userInfo: repeats :) initializer mengambil parameter jumlah detik antara pengaktifan timer, objek yang memanggil metode pada ditentukan oleh pemilih, metode yang dipanggil saat timer menyala , kamus userInfo opsional, dan apakah timer mengulang sampai tidak valid.

Kami menggunakan metode bernama updateViewsWithTimer (_: NSTimer) sebagai pemilih, jadi kami akan membuat itu selanjutnya.

Langkah 8: updateViewsWithTimer(_: NSTimer)

Metode updateViewsWithTimer (_: NSTimer) memanggil metode updateViews, yang akan kita terapkan pada langkah berikutnya.

Langkah 9: updateViews

Metode updateViews memperbarui tampilan trackTime dan progressBar.

Properti teks dari trackTime diperbarui dengan properti currentTime, diformat sebagai string dengan menerapkan metode getCurrentTimeAsString. Kami menyatakan kemajuan konstan menggunakan metode getProgress mp3Player, dan mengatur progressBar.progress menggunakan konstanta itu.

Langkah 10: Wiring Up the Timer

Sekarang kita perlu memanggil metode startTimer di tempat yang sesuai. Kita perlu memulai pengatur waktu dalam metode playSong (_: AnyObject), metode playNextSong (_: AnyObject), dan metode playPreviousSong (_: AnyObject).

Langkah 11: Menghentikan Timer

Kita juga perlu menghentikan penghitung waktu ketika tombol jeda dan berhenti ditekan. Anda dapat menghentikan objek pewaktu dengan menerapkan metode tidak valid pada instance NSTimer.

Langkah 12: setTrackName

Metode setTrackName mengatur properti teks dari trackName dengan menerapkan getCurrentTrackName pada objek mp3Player.

Langkah 13: setupNotificationCenter

Ketika sebuah lagu selesai diputar, seharusnya secara otomatis menunjukkan nama lagu berikutnya dan mulai memainkan lagu itu. Juga, ketika pengguna menekan tombol putar, berikutnya, atau sebelumnya, metode setTrackName harus dipanggil. Tempat yang ideal untuk melakukan ini adalah metode queueTrack dari kelas MP3Player.

Kami membutuhkan cara agar kelas MP3Player memberi tahu kelas ViewController untuk menjalankan metode setTrackName. Untuk melakukan itu, kita akan menggunakan kelas NSNotificationCenter. Pusat notifikasi menyediakan cara untuk menyiarkan informasi di seluruh program. Dengan mendaftar sebagai pengamat dengan pusat pemberitahuan, objek dapat menerima siaran ini dan melakukan operasi. Cara lain untuk menyelesaikan tugas ini adalah menggunakan pola delegasi.

Tambahkan metode berikut ke kelas ViewController.

Kami terlebih dahulu mendapatkan referensi ke pusat pemberitahuan default. Kami kemudian memanggil metode addObserver (_: selector: name: object :) di pusat notifikasi. Metode ini menerima empat parameter:

  • objek yang mendaftar sebagai pengamat, diri dalam kasus ini
  • pesan yang akan dikirim ke pengamat saat notifikasi diposting
  • nama pemberitahuan untuk mendaftarkan pengamat
  • objek yang pemberitahuannya ingin diterima oleh pengamat

Dengan meneruskan nil sebagai argumen terakhir, kami mendengarkan setiap notifikasi yang memiliki nama SetTrackNameText.

Sekarang kita perlu memanggil metode ini dalam metode viewDidLoad pengontrol tampilan.

Langkah 14: Posting Pemberitahuan

Untuk memposting pemberitahuan, kami memanggil metode postNotificationName (_: object :) pada pusat pemberitahuan default. Seperti yang saya sebutkan sebelumnya, kita akan melakukan ini dalam metode queueTrack dari kelas MP3Player. Buka MP3Player.swift dan perbarui metode queueTrack seperti yang ditunjukkan di bawah ini.

Jika Anda menguji aplikasi sekarang dan membiarkan lagu diputar sepanjang jalan, itu akan mulai memainkan lagu berikutnya secara otomatis. Tapi Anda mungkin bertanya-tanya mengapa nama lagu itu tidak muncul selama lagu pertama. Metode init dari kelas MP3Player memanggil metode queueTrack, tetapi karena belum selesai menginisialisasi, itu tidak berpengaruh.

Yang perlu kita lakukan adalah memanggil metode setTrackName secara manual setelah kita menginisialisasi objek mp3Player. Tambahkan kode berikut ke metode viewDidLoad di ViewController.swift.

Anda akan melihat bahwa saya juga menyebut metode updateViews. Dengan cara ini, pemain menunjukkan waktu 0:00 di awal. Jika Anda menguji aplikasi sekarang, Anda harus memiliki pemutar MP3 yang berfungsi penuh.

Kesimpulan

Ini adalah tutorial yang agak panjang, tetapi Anda sekarang memiliki pemutar MP3 fungsional untuk membangun dan memperluas. Satu saran adalah untuk memungkinkan pengguna memilih lagu untuk dimainkan dengan menerapkan UITableView di bawah pemain. Terima kasih telah membaca dan saya harap Anda telah belajar sesuatu yang bermanfaat.



Advertisement
Advertisement
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.