طريقة تسجيل وتشغيل المقاطع الصوتية Swift 4

Ammar AlTahhanمنذ 6 سنوات

السلام عليكم ورحمة الله وبركاته

 

في هذه المقالة سنتعلم طريقة تسجيل وتشغيل المقاطع الصوتية باستخدام 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 قبل التشغيل)

 

النتيجة النهائية

Webp.net-gifmaker.gif.3baa81840e3941eb758ec1818c6cece4.gif

كلمات دليلية:
0
إعجاب
2399
مشاهدات
0
مشاركة
0
متابع
متميز
محتوى رهيب

التعليقات (1)

super_me:

مشكور على العمل 

اتمنى لك التوفيق

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !