طريقة تسجيل وتشغيل المقاطع الصوتية Swift 4
السلام عليكم ورحمة الله وبركاته
في هذه المقالة سنتعلم طريقة تسجيل وتشغيل المقاطع الصوتية باستخدام Swift 4
تسجيل وتشغيل المقاطع سهل ولكن يحتاج الى الوقت لكتابة الاكواد، لذا لنبدأ
أولا، قم باستدعاء الفريموورك AVFoundation المختصة بمعالجة كل المقاطع المرئية والصوتية على منصات أبل
import AVFoundation
ثم قم بتبني البروتوكولات AVAudioRecorderDelegate و AVAudioPlayerDelegate لاستخدامهما لاحقا
class ViewController: UIViewController, AVAudioRecorderDelegate, AVAudioPlayerDelegate {
ثم قم باضافة:
زرين لبدء/ايقاف التسجيل/التشغيل
recordingSession ليعالج جلسة تسجيل الصوت
audioRecorder ليتعامل مع التسجيل نفسه ويحفظه
audioPlayer لتشغيل المقاطع الصوتية بعد تسجيلها
وpath لحفظ مسار ملف الصوت المسجل وتشغيله لاحقا
@IBOutlet weak var recordButton: UIButton!
@IBOutlet weak var playButton: UIButton!
var recordingSession: AVAudioSession!
var audioRecorder: AVAudioRecorder!
var audioPlayer: AVAudioPlayer?
var path: URL!
(يتم استخدام الrecordingSession من قبل نظام iOS لتنظيم تسجيل وتشغيل المقاطع الصوتية منعا لتداخل الأصوات من أكثر من تطبيق -مثلا لكي لا يستطيع تطبيق تسجيل او تشغيل صوت عند اجراء مكالمة-)
تسجيل الصوت يتطلب اذن المستخدم ليتم، ان تم اعطاء الاذن في هذا الكود سيتم تغيير نص زر التسجيل، اضف هذا الكود في ()viewDidLoad
playButton.isEnabled = false
recordingSession = AVAudioSession.sharedInstance()
do {
try recordingSession.setCategory(AVAudioSessionCategoryPlayAndRecord)
try recordingSession.setActive(true)
recordingSession.requestRecordPermission() { [unowned self] allowed in
DispatchQueue.main.async {
if allowed {
self.recordButton.setTitle("تسجيل", for: .normal)
} else {
// failed to record!
}
}
}
} catch {
// failed to record!
}
قبل اضافة الIBAction الخاص بزر التسجيل، سنضيف ميثود startRecording التي (1) ستحدد مكان حفظ ملف الصوت، (2) اعدادات مسجل الصوت ثم (3) بدء التسجيل
func startRecording() {
let audioFilename = getDocumentsDirectory().appendingPathComponent("recording.m4a") //1
path = audioFilename
playButton.isEnabled = false
let settings = [ //2
AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
AVSampleRateKey: 12000,
AVNumberOfChannelsKey: 1,
AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue
]
do {
audioRecorder = try AVAudioRecorder(url: audioFilename, settings: settings) //3
audioRecorder.delegate = self
audioRecorder.record() //3
recordButton.setTitle("ايقاف التسجيل", for: .normal)
} catch {
finishRecording(success: false)
}
}
سنحتاج لاضافة الميثود getDocumentsDirectory لتعمل الميثود السابقة
في هذه الميثود سنعيد المسار المتاح من النظام للتطبيق لحفظ الملفات فيه، سنقوم بحفظ الملف الصوتي في المسار الرئيسي للتطبيق
func getDocumentsDirectory() -> URL {
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
let documentsDirectory = paths[0]
return documentsDirectory
}
انتهينا من الفنكشن الخاصة ببدء التسجيل، والآن نحتاج لفنكشن تقوم بانهاء التسجيل عند طلب المستخدم
func finishRecording(success: Bool) {
audioRecorder.stop()
audioRecorder = nil
playButton.isEnabled = true
if success {
recordButton.setTitle("اعادة التسجيل", for: .normal)
} else {
recordButton.setTitle("تسجيل", for: .normal)
// recording failed :(
}
}
بانهاء الفنكشنين السابقة، نستطيع اخيرا كتابة الIBAction الخاص بزر التسجيل
@IBAction func recordTapped(_ sender: Any) {
if audioRecorder == nil {
startRecording()
} else {
finishRecording(success: true)
}
}
وهكذا نكون قد انتهينا من تسجيل الصوت
لتشغيل الصوت سنضيف الIBAction التالي الخاص بزر التشغيل
@IBAction func playTapped(_ sender: Any) {
do {
audioPlayer = try AVAudioPlayer(contentsOf: path)
audioPlayer?.delegate = self
audioPlayer?.play()
recordButton.isEnabled = false
} catch {
// couldn't load file :(
}
}
نهاية سنضيف الفنكشين التالية من البروتوكولات التي قمنا بتبنيها في بداية المقالة
الأولى audioRecorderDidFinishRecording يتم استدعاؤها عن توقف التسجيل
في بعض الاحيان، قد يقوم النظام بايقاف التسجيل عنوة (عندما ترد مكالمة على سبيل المثال)، في هذه الفنكشن سنتأكد عند عدم نجاح التسجيل لنضبط نص زر التسجيل
func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool) {
if !flag {
finishRecording(success: false)
}
}
والفنكشن الثانية audioPlayerDidFinishPlaying يتم استدعاؤها عند انتهاء تشغيل المقطع الصوتي
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
recordButton.isEnabled = true
}
(بالامكان استخدام ()audioPlayer.stop لايقاف التشغيل)
(تأكد من ربط الOutlets والActions قبل التشغيل)
النتيجة النهائية
عرض المزيد.. جديد مقالاتي
لايوجد لديك حساب في عالم البرمجة؟
تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !