يمكنك استخدام VolumeShaper
في أحد التطبيقات الصوتية لإجراء
اختفاء الصوت تدريجيًا واختفاء الصوت بعد ذلك وتجنب التداخل مع أصوات أخرى وإجراء إحالات ناجحة تلقائية قصيرة
لمستوى الصوت. تتوفّر الفئة VolumeShaper
في الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات)
والإصدارات الأحدث.
يمكنك إنشاء VolumeShaper
من خلال استدعاء createVolumeShaper()
على مثيل AudioTrack
أو MediaPlayer
. يعمل VolumeShaper
فقط على المحتوى الصوتي الذي تم إنشاؤه من خلال AudioTrack أو MediaPlayer
الذي تم إنشاؤه.
إعدادات VolumeShaper.
يتم تحديد سلوك VolumeShaper
من خلال
VolumeShaper.Configuration
. وتحدّد الإعدادات
*منحنى الحجم ونوع أداة الاستيفاء والمدة.*
منحنى الحجم
يمثل منحنى الحجم التغيّر في السعة بمرور الوقت. يتم تعريفه من خلال زوج من الصفائف العائمة،
x[] وy[] التي تحدد سلسلة من نقاط التحكم. يمثل كل زوج (س، ص)
الوقت والحجم على التوالي. يجب أن تكون الصفائف متساوية الطول وأن تحتوي
على قيمتين على الأقل ولا تزيد عن 16 قيمة. (يتم تحديد الحدّ الأقصى لطول المنحنى
في getMaximumCurvePoints()
.)
يتم حساب إحداثيات الوقت خلال الفاصل [0.0، 1.0]. يجب أن تكون أول نقطة زمنية 0.0، وأن تكون الأخيرة 1.0، ويجب أن تزيد الأوقات بشكل رتيب.
ويتم تحديد إحداثيات الحجم بمقياس خطي خلال الفاصل [0.0، 1.0].
نوع أداة الاعتراض
ويمر منحنى مستوى الصوت دائمًا خلال نقاط التحكم المحددة. يتم اشتقاق القيم بين نقاط التحكم من خلال شريحة استنادًا إلى نوع أداة إعادة الضبط في الإعدادات. هناك أربعة ثوابت لأنواع الإعلانات الداخلية VolumeShaper
المتوفّرة:
- VolumeShaper.Configuration.INTERPOLATOR_TYPE_STEP
- VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR
- VolumeShaper.Configuration.INTERPOLATOR_TYPE_CUBIC
- VolumeShaper.Configuration.INTERPOLATOR_TYPE_CUBIC_MONOTONIC
المدة
يتم تغيير إحداثيات الوقت المحددة في الفاصل الزمني [0.0، 1.0] إلى مدة تحددها بالملي ثانية. يحدد ذلك الطول الفعلي لمنحنى مستوى الصوت عندما تكون أداة الشكل قيد التشغيل وتطبّق المنحنى على إخراج الصوت.
استخدام أداة VolumeShaper
إنشاء إعداد
قبل إنشاء VolumeShaper
، عليك إنشاء مثيل VolumeShaper.Configuration
. ويمكنك إجراء ذلك باستخدام VolumeShaper.Configuration.Builder()
:
Kotlin
val config: VolumeShaper.Configuration = VolumeShaper.Configuration.Builder() .setDuration(3000) .setCurve(floatArrayOf(0f, 1f), floatArrayOf(0f, 1f)) .setInterpolatorType(VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR) .build()
Java
VolumeShaper.Configuration config = new VolumeShaper.Configuration.Builder() .setDuration(3000) .setCurve(new float[] {0.f, 1.f}, new float[] {0.f, 1.f}) .setInterpolatorType(VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR) .build();
With no arguments the VolumeShaper.Configuration.Builder
constructor returns a
builder that creates a configuration with default settings:
INTERPOLATOR_TYPE_CUBIC, a one second duration, and no curve. You must add a
curve to the builder before calling build()
.
The framework provides constants for configurations with pre-built curves, each with one second duration:
VolumeShaper.Configuration.LINEAR_RAMP
VolumeShaper.Configuration.CUBIC_RAMP
VolumeShaper.Configuration.SINE_RAMP
VolumeShaper.Configuration.SCURVE_RAMP
Creating a VolumeShaper
To create a VolumeShaper
, call createVolumeShaper()
on an instance of the
appropriate class, passing in a VolumeShaper.Configuration
:
Kotlin
volumeShaper = myMediaPlayer.createVolumeShaper(config) volumeShaper = myAudioTrack.createVolumeShaper(config)
Java
volumeShaper = myMediaPlayer.createVolumeShaper(config); volumeShaper = myAudioTrack.createVolumeShaper(config);
A single track or media player can have many shapers attached to it, and you can
control each shaper separately. The outputs of all the shapers on a track or
player are multiplied together. A VolumeShaper
cannot be shared between
AudioTracks
or MediaPlayers
, but you can use the same configuration in calls
to createVolumeShaper
to build identical shapers on multiple AudioTracks
or
MediaPlayers
.
When you create the shaper, its first control point (at t = 0) is applied to the
audio stream. If the initial volume is not 1.0 and your app is playing material
at create time, your audio might have an abrupt change in volume. Best practice
is to start playing audio from silence and use a VolumeShaper
to implement a
fade-in when playback starts. Create a VolumeShaper
that starts at 0 volume
and fades up. For example:
setCurve(new float[] {0.f, 1.f}, new float[] {0.f, 1.f})
ابدأ التشغيل مع أداة تشكيل العناصر في الوقت نفسه. ويضمن ذلك بدء التشغيل من كتم الصوت ورفع مستوى الصوت إلى مستوى الصوت الكامل. يتم شرح ذلك في القسم التالي.
تشغيل أداة VolumeShaper
على الرغم من أنه يتم تطبيق مستوى الصوت لنقطة التحكم الأولى على مسار الصوت
فور إنشاء أداة التشكيل، لا تتقدّم أداة الشكل على طول المنحنى
إلى أن يتم استدعاء طريقة apply()
باستخدام VolumeShaper.Operation.PLAY
. بعد
إنشاء أداة التشكيل، يجب أن يحدّد أول استدعاء لـ apply()
عملية PLAY
لبدء شكل أداة التشكيل. يقوم هذا بتشغيل المنحنى من نقاط
التحكم الأولى إلى الأخيرة:
Kotlin
Shar.apply(VolumeShaper.Operation.PLAY)
Java
Shar.apply(VolumeShaper.Operation.PLAY);
أثناء تشغيل أداة التشكيل، يمكنك إصدار استدعاءات apply()
متبادلة مع تحديد عمليات
الانعكاس وPLAY. يغير هذا اتجاه قراءة نقاط
التحكم في كل مرة.
تضبط أداة التشكيل مستوى الصوت باستمرار وتمرر عبر جميع نقاط التحكم إلى أن تنتهي صلاحيتها. ويحدث ذلك عندما يصل شكل الشكل إلى آخر نقطة تحكم (لتشغيل PLAY) أو أول نقطة (لتشغيل العكس) في المنحنى.
عند انتهاء صلاحية أداة التشكيل، يظل مستوى الصوت عند الإعداد الأخير، والذي قد يكون نقطة التحكم الأولى أو الأخيرة. يمكنك الاتصال بالرقم VolumeShaper.getVolume()
لمعرفة
مستوى الصوت الحالي في أي وقت.
بعد انتهاء صلاحية الشكل، يمكنك إجراء طلب apply()
آخر لتشغيل المنحنى
في الاتجاه المعاكس. على سبيل المثال، إذا انتهت صلاحية أداة التشكيل أثناء تشغيل
PLAY
، يجب أن تكون قيمة apply()
التالية هي REVERSE
. الاتصال بـ PLAY
بعد انتهاء صلاحية PLAY
أو REVERSE
بعد انتهاء صلاحية REVERSE
ليس له أي تأثير.
يجب التبديل بين عمليتَي PLAY
وREVERSE
. ما مِن طريقة لتشغيل المنحنى بدءًا من نقاط التحكّم الأولى إلى الأخيرة،
ثم إعادة تشغيله مرّة أخرى من
نقطة التحكّم الأولى. يمكنك استخدام طريقة replace()
الموضّحة في القسم
التالي لاستبدال المنحنى بنسخة من نفسه. يؤدي ذلك إلى إعادة ضبط أداة التشكيل،
يتطلب ذلك بدء عملية PLAY
من جديد.
تغيير المنحنى
استخدِم الطريقة replace()
لتغيير منحنى VolumeShaper
. تأخذ هذه الطريقة
تكوينًا وعملية ومعلمة join. يمكنك استدعاء الطريقة
replace()
في أي وقت أثناء تشغيل أداة التشكيل أو بعد انتهاء صلاحيتها:
Kotlin
val newConfig = VolumeShaper.Configuration.Builder() .setDuration(1000) .setCurve(floatArrayOf(0f, 0.5f), floatArrayOf(0f, 1f)) .setIntervolatorType(Volume(Volume.Configuration.INTERPOLATOR_TYPE_buildAR) TRUE .PLAY_buildAR من.setCurve(floatArrayOf(0f, 0.5f), floatArrayOf(0f, 1f))).
Java
VolumeShaper.Configuration newConfig = new VolumeShaper.Configuration.Builder() .setDuration(1000) .setCurve(new float[] {0.f, 0.5f}, new float[] {0.f, 1.f}) .setInter أنّ مَعلمة join على نطاق (VolumeShaper.PLAY_build.INTERPO)
عند استدعاء replace()
أثناء تشغيل أداة التشكيل، تتوقف عن تغيير الحجم وتظل على قيمتها الحالية. ثم يحاول المشكل بدء المنحنى
الجديد من نقطة التحكم الأولى. هذا يعني أن وسيطة العملية تتحكم في
ما إذا كان يتم تشغيل المشكل بعد الاستدعاء أم لا. حدِّد PLAY
لبدء المنحنى الجديد فورًا، واختَر REVERSE
لترك أداة الشكل متوقفة مؤقتًا عند
مستوى صوت نقطة التحكم الأولى في المنحنى الجديد. يمكنك بدء أداة التشكيل لاحقًا
باستخدام apply(VolumeShaper.Operation.PLAY)
.
عند استدعاء replace()
باستخدام join = false
، تبدأ المشكّلة منحنى الشكل عند المستوى الذي تحدّده نقطة التحكم الأولى. يمكن أن يؤدي ذلك إلى انقطاع
في الصوت. يمكنك تجنُّب ذلك من خلال الاتصال برقم replace()
على الرقم join = true
.
يؤدي ذلك إلى ضبط نقطة التحكم الأولى للمنحنى الجديد على المستوى الحالي للمشكل وتغيير حجم جميع نقاط التحكم بين الأول والأخير للحفاظ على الشكل النسبي للمنحنى الجديد (نقطة التحكم الأخيرة
بدون تغيير). تؤدي عملية التحجيم إلى تغيير نقاط التحكم بشكل دائم في منحنى أداة التشكيل الجديد.
إزالة أداة تغيير الحجم
يتم إغلاق النظام وتجمع البيانات المهملة VolumeShaper
عند إزالة AudioTrack
أو MediaPlayer
أو عند عدم استخدام الجهاز. يمكنك استدعاء الإجراء close()
على أداة التشكيل
لإتلافه على الفور. يزيل النظام المشكل من مسار الصوت في غضون 20 ملي ثانية تقريبًا. يُرجى توخّي الحذر عند إغلاق VolumeShaper
أثناء تشغيل الصوت. إذا كان مستوى صوت أداة الشكل أقل من 1.0 عند استدعاء
close()
، سيتغير مقياس مستوى صوت أداة الشكل إلى 1.0. وقد يؤدي هذا إلى
زيادة مفاجئة في الحجم.