AMR0T

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

 

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

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

1

شارك هذه المشاركة


رابط المشاركه
شارك

انشئ حساب جديد او قم بتسجيل دخولك لتتمكن من اضافه تعليق جديد

يجب ان تكون عضوا لدينا لتتمكن من التعليق

انشئ حساب جديد

سجل حسابك الجديد لدينا في الموقع بمنتهي السهولة .


سجل حساب جديد

تسجيل الدخول

هل تمتلك حساب بالفعل ؟ سجل دخولك من هنا.


سجل دخولك الان

Ads Belongs To This website


عالم البرمجة

عالم البرمجة مقالات برمجة و دورات مجانية لإحتراف البرمجة هدفنا تبسيط البرمجة ونشرها بيد الكل بشكل ممتع ومتطور ومحدث بإستمرار لمواكبة جديد تطورات البرمجة الحديثة و المتقدمة بدون مقابل