إضافة تسجيل الصوت في كوردوفا

من موسوعة حسوب

 تمكن هذه الإضافة من تسجيل وتشغيل الملفات الصوتية على الجهاز.

NOTE: لا يلتزم التقديم الحالي لهذه الإضافة بمواصفات W3C فيما يخص التقاط الوسائط، ويتم توفيره لأجل الملاءمة وحسب. سوف يلتزم التقديم المستقبلي لهذه الإضافة بأحدث مواصفات W3C، وذلك قد يؤدي إلى إهمال الواجهات البرمجية الحالية.

تعرّف هذه الإضافة مُنشئًا عاما Media.

على الرغم من أن هذا الكائن موجود في النطاق العام (global scope)، إلا أنه لن يكون متوفرًا إلا بعد إطلاق الحدث deviceready.

document.addEventListener("deviceready", onDeviceReady, false);
function onDeviceReady() {
    console.log(Media);
}

الإبلاغ عن مشكلات في هذا الإضافة على Apache Cordova issue tracker

التثبيت

cordova plugin add cordova-plugin-media

المنصات المدعومة

  • أندرويد
  • iOS
  • ويندوز
  • Browser

Media

var media = new Media(src, mediaSuccess, [mediaError], [mediaStatus]);

المعاملات

  • src: عنوان URI يتضمن المحتوى الصوتي. (DOMString)
  • mediaSuccess: (اختياري) رد النداء (callback) الذي سيُنفذ بعد انتهاء الكائن Media الحالي من عملية التشغيل أو التسجيل أو الإيقاف. (دالة)
  • mediaError: (اختياري) رد النداء التي سبُنفذ عند حدوث خطأ. (دالة)
  • mediaStatus: (اختياري) رد النداء الذي سينفذ للإشارة إلى تغييرات الحالة. (دالة)

NOTE: المسار cdvfile مدعوم كمعامل src:

var my_media = new Media('cdvfile://localhost/temporary/recording.mp3', ...);

ثوابت

الثوابت التالية هي المعاملات الوحيدة لرد النداء mediaStatus:

  • Media.MEDIA_NONE = 0;
  • Media.MEDIA_STARTING = 1;
  • Media.MEDIA_RUNNING = 2;
  • Media.MEDIA_PAUSED = 3;
  • Media.MEDIA_STOPPED = 4;

التوابع

  • media.getCurrentAmplitude: يُعيد هذا التابع السعة (amplitude) الحالية داخل الملف الصوتي.
  • media.getCurrentPosition: يُعيد هذا التابع الموضع الحالي داخل الملف الصوتي.
  • media.getDurationيُعيد هذا التابع مدة الملف الصوتي.
  • media.play: يبدأ أو يستأنف تشغيل الملف الصوتي.
  • media.pause: إيقاف مؤقت (Pause) لتشغيل لالملف الصوتي.
  • media.pauseRecord: إيقاف مؤقت لتسجيل الملف الصوتي.
  • media.release: يعيد نظام التشغيل الأساسي للملفات الصوتية.
  • media.resumeRecord: يستئنف تسجيل الملف الصوتي.
  • media.seekTo: ينقل موضع التشغيل داخل الملف الصوتي.
  • media.setVolume: يضبط مستوى الصوت لتشغيل الصوت.
  • media.startRecord: يبدأ تسجيل الملف الصوتي.
  • media.stopRecord: يوقف تسجيل الملف الصوتي.
  • media.stop: يوقف تشغيل الملف الصوتي.

معاملات إضافية للقراءة فقط

  • position: الموضع داخل مقطوعة الصوت، بالثواني.
  • لا يتم تحديثه تلقائيا أثناء تشغيل الصوت؛ إن أردت التحديث فاستدع التابع getCurrentPosition.
  • duration: مدة الوسيط، بالثواني.

media.getCurrentAmplitude

يُعيد هذا التابع السعة الحالية (amplitude) داخل الملف الصوتي.

media.getCurrentAmplitude(mediaSuccess, [mediaError]);

المنصات المدعومة

  • أندرويد
  • iOS

المعاملات

  • mediaSuccess: رد النداء (callback) الذي ستُمرّر إليه السعة الحالية (0.0 - 1.0).
  • mediaError: (اختياري) رد الاتصال الذي سيُنفّذ في حالة حدوث خطأ.

مثال سريع

// Audio player
//
var my_media = new Media(src, onSuccess, onError);
// Record audio
my_media.startRecord();
mediaTimer = setInterval(function () {
    // get media amplitude
    my_media.getCurrentAmplitude(
        // success callback
        function (amp) {
            console.log(amp + "%");
        },
        // error callback
        function (e) {
            console.log("Error getting amp=" + e);
        }
    );
}, 1000);

media.getCurrentPosition

يُعيد هذا التابع الموضع الحالي داخل الملف الصوتي. كما يُحدِّث المعامل Media الخاص بالكائن position.

media.getCurrentPosition(mediaSuccess, [mediaError]);

المعاملات

  • mediaSuccess: رد النداء الذي سيُمرّر إليه الموضع الحالي بالثواني.
  • mediaError: (اختياري) رد النداء الذي سيُنفّذ في حالة حدوث خطأ.

مثال سريع

// Audio player
//
var my_media = new Media(src, onSuccess, onError);
// Update media position every second
var mediaTimer = setInterval(function () {
    // get media position
    my_media.getCurrentPosition(
        // success callback
        function (position) {
            if (position > -1) {
                console.log((position) + " sec");
            }
        },
        // error callback
        function (e) {
            console.log("Error getting pos=" + e);
        }
    );
}, 1000);

media.getDuration

يُعيد هذا التابع مدة الملف الصوتي بالثواني. إذا كانت المدة غير معروفة، فسيُعيد القيمة ‎-1.

media.getDuration();

مثال سريع

// Audio player
//
var my_media = new Media(src, onSuccess, onError);
// Get duration
var counter = 0;
var timerDur = setInterval(function() {
    counter = counter + 100;
    if (counter > 2000) {
        clearInterval(timerDur);
    }
    var dur = my_media.getDuration();
    if (dur > 0) {
        clearInterval(timerDur);
        document.getElementById('audio_duration').innerHTML = (dur) + " sec";
    }
}, 100);

media.pause

يوقف هذا التابع تشغيل الملف الصوتي مؤقتًا.

media.pause();

مثال سريع

// Play audio
//
function playAudio(url) {
    // Play the audio file at url
    var my_media = new Media(url,
        // success callback
        function () { console.log("playAudio():Audio Success"); },
        // error callback
        function (err) { console.log("playAudio():Audio Error: " + err); }
    );
    // Play audio
    my_media.play();
    // Pause after 10 seconds
    setTimeout(function () {
        my_media.pause();
    }, 10000);
}

media.pauseRecord

يوقف هذا التابع مؤقتًا تسجيل (recording) الملف الصوتي.

media.pauseRecord();

المنصات المدعومة

  • iOS

مثال سريع

// Record audio
//
function recordAudio() {
    var src = "myrecording.mp3";
    var mediaRec = new Media(src,
        // success callback
        function() {
            console.log("recordAudio():Audio Success");
        },
        // error callback
        function(err) {
            console.log("recordAudio():Audio Error: "+ err.code);
        });
    // Record audio
    mediaRec.startRecord();
    // Pause Recording after 5 seconds
    setTimeout(function() {
        mediaRec.pauseRecord();
    }, 5000);
}

media.play

يبدأ هذا التابع أو يستأنف تشغيل الملف الصوتي.

media.play();

مثال سريع

// Play audio
//
function playAudio(url) {
    // Play the audio file at url
    var my_media = new Media(url,
        // success callback
        function () {
            console.log("playAudio():Audio Success");
        },
        // error callback
        function (err) {
            console.log("playAudio():Audio Error: " + err);
        }
    );
    // Play audio
    my_media.play();
}

ملاحظات خاصة بمنصة iOS

  • numberOfLoops: مرّر هذا الخيار إلى التابع play لتحديد كم مرة تريد تشغيل ملف الوسائط، على سبيل المثال:
var myMedia = new Media("http://audio.ibeat.org/content/p1rj1s/p1rj1s_-_rockGuitar.mp3")
myMedia.play({ numberOfLoops: 2 })
  • playAudioWhenScreenIsLocked: مرِّر هذا الخيار إلى التابع play لتحديد ما إذا كنت تريد السماح بتشغيل الوسيط عند قفل الشاشة. إذا عُيِّن هذا الخيار إلى true (القيمة الافتراضية)، يتم تجاهل حالة زر كتم الصوت، على سبيل المثال:
var myMedia = new Media("http://audio.ibeat.org/content/p1rj1s/p1rj1s_-_rockGuitar.mp3");
myMedia.play({ playAudioWhenScreenIsLocked : true });
myMedia.setVolume('1.0');

ملاحظة: للسماح بتشغيل الوسيط أو الصوت الخلفي أثناء قفل الشاشة، عليك إضافة audio إلى UIBackgroundModes في الملف info.plist. راجع Apple documentation. لاحظ أيضًا أنه يجب بدء تشغيل الصوت قبل الانتقال إلى الخلفية.

  • order of file search: عند تقديم اسم ملف أو مسار بسيط فقط، فستبحث منصة iOS في المجلد www عن الملف، ثم في مجلد التطبيق documents/tmp:
var myMedia = new Media("audio/beer.mp3")
myMedia.play()  // first looks for file in www/audio/beer.mp3 then in <application>/documents/tmp/audio/beer.mp3‎

media.release

يُطلق (Releases) هذا التابع الموارد الصوتية لنظام التشغيل الأساسي. هذا الأمر مهم بشكل خاص لنظام أندرويد، نظرًا لوجود عدد محدود من نُسخ OpenCore لتشغيل الوسائط. يجب أن تستدعي التطبيقاتُ الدالة release لكل موردٍ Media لم تعد تحتاجه.

media.release();

مثال سريع

// Audio player
//
var my_media = new Media(src, onSuccess, onError);
my_media.play();
my_media.stop();
my_media.release();

media.resumeRecord

يستأنف هذا التابع تسجيل الملف الصوتي.

media.resumeRecord();

المنصات المدعومة

  • iOS

مثال سريع

// Record audio
//
function recordAudio() {
    var src = "myrecording.mp3";
    var mediaRec = new Media(src,
        // success callback
        function() {
            console.log("recordAudio():Audio Success");
        },
        // error callback
        function(err) {
            console.log("recordAudio():Audio Error: "+ err.code);
        });
    // Record audio
    mediaRec.startRecord();
    // Pause Recording after 5 seconds
    setTimeout(function() {
        mediaRec.pauseRecord();
    }, 5000);
    // Resume Recording after 10 seconds
    setTimeout(function() {
        mediaRec.resumeRecord();
    }, 10000);
}

media.seekTo

يُعيّن هذا التابع موضع التشغيل الحالي داخل الملف الصوتي.

media.seekTo(milliseconds);

المعاملات

  • milliseconds: يحدد هذا المعاملا موضع التشغيل داخل الملف الصوت، يُحسب بالميليثانية.

مثال سريع

// Audio player
//
var my_media = new Media(src, onSuccess, onError);
    my_media.play();
// SeekTo to 10 seconds after 5 seconds
setTimeout(function() {
    my_media.seekTo(10000);
}, 5000);

media.setVolume

يضبط هذا التابع مستوى الصوت للملف الصوتي.

media.setVolume(volume);

المعاملات

  • volume: يمثا هذا المعامل مستوى الصوت. يجب أن تكون القيمة ضمن النطاق من 0.0 إلى 1.0.

المنصات المدعومة

  • أندرويد
  • iOS

مثال سريع

// Play audio
//
function playAudio(url) {
    // Play the audio file at url
    var my_media = new Media(url,
        // success callback
        function() {
            console.log("playAudio():Audio Success");
        },
        // error callback
        function(err) {
            console.log("playAudio():Audio Error: "+err);
    });
    // Play audio
    my_media.play();
    // Mute volume after 2 seconds
    setTimeout(function() {
        my_media.setVolume('0.0');
    }, 2000);
    // Set volume to 1.0 after 5 seconds
    setTimeout(function() {
        my_media.setVolume('1.0');
    }, 5000);
}

media.startRecord

يبدأ هذا التابع تسجيل الملف الصوتي.

media.startRecord();

المنصات المدعومة

  • أندرويد
  • iOS
  • ويندوز

مثال سريع

// Record audio
//
function recordAudio() {
    var src = "myrecording.mp3";
    var mediaRec = new Media(src,
        // success callback
        function() {
            console.log("recordAudio():Audio Success");
        },
        // error callback
        function(err) {
            console.log("recordAudio():Audio Error: "+ err.code);
        });
    // Record audio
    mediaRec.startRecord();
}

ملاحظات خاصة بمنصة أندرويد

  • تُسجل أجهزة أندرويد الصوت في ملف بتنسيق AAC ADTS. يجب أن ينتهي الملف المحدد بالامتداد aac..
  • يتم وصل عناصر التحكم في مستوى الصوت في الجهاز بمستوى الصوت في الوسائط قيد التشغيل. وبمجرد استدعاء الدالة release() على آخر كائن وسيط (Media object) مُنشأ، تعود عناصر التحكم بالصوت إلى سلوكها الافتراضي. يحدث هذا أيضًا عند التنقل في الصفحات، حيث يؤدي ذلك إلى تحرير جميع كائنات الوسائط.

ملاحظات خاصة بمنصة iOS

  • لا يسجل نظام iOS إلا الملفات من النوع ‎.wav و ‎،.m4a وسيعيد خطأً إذا كان امتداد اسم الملف غير صحيح.
  • إذا لم يتم توفير المسار الكامل، سيُوضع التسجيل في مجلد التطبيق documents/tmp. يمكن الوصول إلى ذلك التسجيل عبر الواجهة البرمجية File باستخدام LocalFileSystem.TEMPORARY. يجب أن تكون المجلدات الفرعية المحددة في وقت التسجيل موجودًا بالفعل.
  • يمكن تسجيل الملفات وتشغيلها باستخدام مستندات URI:
var myMedia = new Media("documents://beer.mp3")

منذ الإصدار 10 من iOS ، صار من الإلزامي تقديم وصف للاستخدام في الملف info.plist إن كنت تريد الوصول إلى بيانات حساسة. عندما يستأذن النظام المستخدم للوصول إلى تلك المعلومات، سيُعرض وصف الاستخدام ذاك كجزء من مربع حوار الاستئذان، ولكن إذا لم توفر وصف الاستخدام، فسيتعطل التطبيق قبل عرض مربع الحوار. وأيضًا، سترفض Apple التطبيقات التي تصل إلى البيانات الخاصة دون أن تقدم وصفًا للاستخدام.

تتطلب هذه الإضافة أوصاف الاستخدام التالية:

  • NSMicrophoneUsageDescription يحدد سبب وصول التطبيق إلى ميكروفون المستخدم.

لإضافة هذه المُدخلة إلى info.plist، يمكنك استخدام الوسم edit-config في الملف config.xml على النحو التالي:

<edit-config target="NSMicrophoneUsageDescription" file="*-Info.plist" mode="merge">
    <string>need microphone access to record sounds</string>
</edit-config>‎

ملاحظات خاصة بمنصة ويندوز

  • يمكن لأجهزة ويندوز استخدام التنسيقات MP3 و M4A و WMA للصوت المسجل. ولكن في معظم الحالات، لا يمكن استخدام MP3 لتسجيل الصوت على أجهزة Windows Phone 8.1، لأن مُشفر (encoder) ‏MP3 غير not shipped with Windows Phone.
  • إذا لم يتم توفير المسار الكامل، سيُوضع التسجيل في المجلد AppData/temp. يمكن الوصول إلى ذلك التسجيل عبر الواجهة البرمجية File باستخدام LocalFileSystem.TEMPORARY أو ms-appdata:///temp/<filename> URI.
  • يجب أن تكون كل المجلد الفرعية المحددة في وقت التسجيل موجودًا بالفعل.

media.stop

يوقف هذا التابع تشغيل الملف الصوتي.

media.stop();

مثال سريع

// Play audio
//
function playAudio(url) {
    // Play the audio file at url
    var my_media = new Media(url,
        // success callback
        function() {
            console.log("playAudio():Audio Success");
        },
        // error callback
        function(err) {
            console.log("playAudio():Audio Error: "+err);
        }
    );
    // Play audio
    my_media.play();
    // Pause after 10 seconds
    setTimeout(function() {
        my_media.stop();
    }, 10000);
}

media.stopRecord

يوقف هذا التابع تسجيل الملف الصوتي.

media.stopRecord();

المنصات المدعومة

  • أندرويد
  • iOS
  • ويندوز

مثال سريع

// Record audio
//
function recordAudio() {
    var src = "myrecording.mp3";
    var mediaRec = new Media(src,
        // success callback
        function() {
            console.log("recordAudio():Audio Success");
        },
        // error callback
        function(err) {
            console.log("recordAudio():Audio Error: "+ err.code);
        }
    );
    // Record audio
    mediaRec.startRecord();
    // Stop recording after 10 seconds
    setTimeout(function() {
        mediaRec.stopRecord();
    }, 10000);
}

MediaError

يُعاد كائنٌ MediaError إلى دالة رد النداء mediaError عند حدوث خطأ.

خاصيات

  • code: أحد رموز الخطأ المحددة مسبقًا المدرجة أدناه.
  • message: رسالة خطأ تحدد تفاصيل الخطأ.

ثوابت

  • MediaError.MEDIA_ERR_ABORTED = 1
  • MediaError.MEDIA_ERR_NETWORK = 2
  • MediaError.MEDIA_ERR_DECODE = 3
  • MediaError.MEDIA_ERR_NONE_SUPPORTED = 4

مصادر