คุณใช้ VolumeShaper
ในแอปเสียงเพื่อดำเนินการได้
เฟดอิน เฟดเอาต์ ครอสเฟด ลดเสียง และเวอร์ชันอัตโนมัติสั้นๆ อื่นๆ
การเปลี่ยนแปลง คลาส VolumeShaper
พร้อมใช้งานใน Android 8.0 (API ระดับ 26)
และหลังจากนั้น
คุณสร้าง VolumeShaper
โดยการเรียกใช้ createVolumeShaper()
ในอินสแตนซ์
AudioTrack
หรือ MediaPlayer
VolumeShaper
จะทำงานร่วมกับเสียงที่ AudioTrack หรือ MediaPlayer สร้างขึ้นเท่านั้น
ที่สร้างมันขึ้นมา
VolumeShaper.Configuration
ลักษณะการทำงานของ VolumeShaper
จะกำหนดโดย
VolumeShaper.Configuration
การกำหนดค่าจะระบุ
*เส้นโค้งปริมาณ ประเภทตัวกำหนดช่วง และระยะเวลา*
เส้นโค้งปริมาณ
เส้นโค้งปริมาณแสดงถึงการเปลี่ยนแปลงของแอมพลิจูดเมื่อเวลาผ่านไป และกำหนดโดยคู่อุปกรณ์
ของอาร์เรย์จำนวนลอยตัว x[] และ y[] ที่กำหนดชุดของจุดควบคุม แต่ละรายการ (x, y)
คู่หมายถึงเวลาและปริมาณตามลำดับ อาร์เรย์ต้องมีความยาวเท่ากัน
และมีค่าอย่างน้อย 2 แต่ไม่เกิน 16 ค่า (ความยาวเส้นโค้งสูงสุดคือ
มีคำจำกัดความใน getMaximumCurvePoints()
)
พิกัดเวลาจะอยู่ในช่วง [0.0, 1.0] ครั้งแรก จุดต้องเป็น 0.0 ค่าสุดท้ายต้องเป็น 1.0 และจำนวนครั้งต้องเป็นแบบเดี่ยว เพิ่มขึ้น
ระบุพิกัดปริมาตรเป็นสเกลเชิงเส้นในช่วง [0.0, 1.0]
ประเภทตัวแปลงสัญญาณ
เส้นโค้งระดับเสียงจะผ่านจุดควบคุมที่ระบุเสมอ ค่า
ระหว่างจุดควบคุมที่ได้มาจากการหมุนตาม
ประเภทตัวกำหนดช่วงของการกำหนดค่า มีค่าคงที่ 4 ค่า
ประเภทตัวกำหนดอัตรา 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.Configuration
ก่อนที่จะสร้าง VolumeShaper
ดำเนินการนี้โดยใช้
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})
เริ่มเล่นและ Shar พร้อมกัน วิธีนี้ช่วยให้มั่นใจว่าการเล่น จะเริ่มจากระดับเสียงเงียบและระดับเสียงจะเพิ่มระดับเสียงจนสุด ซึ่งอธิบายไว้ใน หัวข้อถัดไป
การเรียกใช้ VolumeShaper
แม้ว่าระดับเสียงของจุดควบคุมแรกจะมีผลกับเส้นทางเสียง
ทันทีที่สร้างตัวควบคุมรูปร่าง เครื่องมือสร้างรูปร่างจะไม่คืบหน้าตามเส้นโค้ง
จนกว่าคุณจะเรียกเมธอด apply()
ด้วย VolumeShaper.Operation.PLAY
หลัง
การสร้างตัวควบคุมรูปแบบ การเรียกใช้ครั้งแรกของ apply()
ต้องระบุ PLAY
เพื่อเริ่มตัวควบคุมรูปร่าง ซึ่งเรียกใช้เส้นโค้งจากกราฟแรกถึง
จุดควบคุมสุดท้าย:
Kotlin
Shar.apply(VolumeShaper.Operation.PLAY)
Java
Shar.apply(VolumeShaper.Operation.PLAY);
ขณะที่ Shaper กำลังทำงาน คุณสามารถออกการเรียก apply()
สลับเพื่อระบุ
การดำเนินการย้อนกลับและ PLAY การดำเนินการนี้จะเปลี่ยนทิศทางการอ่านออกของ
จุดควบคุมได้ทุกครั้ง
ตัวควบคุมรูปร่างจะปรับระดับเสียงอย่างต่อเนื่องและผ่านจุดควบคุมทั้งหมด จนกว่าข้อเสนอจะหมดอายุ ซึ่งจะเกิดขึ้นเมื่อเครื่องมือรูปร่างถึงจุดสุดท้าย (สำหรับ PLAY ) หรือจุดควบคุมแรก (สำหรับการดำเนินการย้อนกลับ) ในเส้นโค้ง
เมื่อตัวควบคุมตัวกรองหมดอายุ ระดับเสียงจะยังคงอยู่ตามการตั้งค่าล่าสุด ซึ่งอาจเป็น
จุดควบคุมแรกหรือจุดควบคุมสุดท้าย คุณสามารถโทรหา VolumeShaper.getVolume()
เป็นเวลา
ระดับเสียงในปัจจุบันได้ทุกเมื่อ
หลังจากตัวควบคุมรูปแบบหมดอายุ คุณสามารถเรียกใช้ apply()
อีกครั้งเพื่อเรียกใช้เส้นโค้งได้
ในทิศทางตรงกันข้าม ตัวอย่างเช่น หากตัวควบคุมรูปร่างหมดอายุขณะวิ่ง
PLAY
apply()
ถัดไปต้องเป็น REVERSE
กำลังจะโทรหา PLAY
หลังจาก PLAY
มี
หมดอายุ หรือ REVERSE
หลังจาก REVERSE
หมดอายุ จะไม่มีผล
คุณต้องเลือกวิธีดำเนินการ PLAY
และ REVERSE
แทน ไม่มีวิธีเล่น
โค้งจากจุดควบคุมแรกจนถึงจุดควบคุมสุดท้าย แล้วเริ่มอีกครั้งจาก
จุดควบคุมแรก คุณสามารถใช้เมธอด replace()
ตามที่อธิบายไว้ใน
เพื่อแทนที่เส้นโค้งด้วยสำเนาของตัวมันเอง ซึ่งจะเป็นการรีเซ็ตเครื่องมือรูปร่าง
กำหนดให้มีการดำเนินการ PLAY
เพื่อเริ่มต้นอีกครั้ง
การเปลี่ยนเส้นโค้ง
ใช้เมธอด replace()
เพื่อเปลี่ยนเส้นโค้งของ VolumeShaper
วิธีนี้ใช้เวลา
การกำหนดค่า การดำเนินการ และพารามิเตอร์การรวม คุณสามารถเรียกใช้
replace()
ได้ทุกเมื่อ ขณะที่ตัวควบคุมรูปร่างกำลังทำงานหรือหลังจากหมดอายุ:
Kotlin
val newConfig = VolumeShaper.Configuration.Builder() .setDuration(1,000) .setCurve(FloodArrayOf(0f, 0.5f), FloatArrayOf(0f, 1f)) .setInterpolatorType(VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR) .build() การเข้าร่วมแบบ Val = จริง Shar.replace(newConfig, VolumeShaper.Operation.PLAY, เข้าร่วม)
Java
VolumeShaper.Configuration newConfig = VolumeShaper.Configuration.Builder() ใหม่ .setDuration(1,000) .setCurve(new Float[] {0.f, 0.5f}, Float ใหม่[] {0.f, 1.f}) .setInterpolatorType(VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR) .build(); boolean Join = true; Shar.replace(newConfig, VolumeShaper.Operation.PLAY, เข้าร่วม);
เมื่อคุณเรียก replace()
ขณะที่ตัวควบคุมรูปร่างกำลังทำงาน อุปกรณ์จะหยุดเปลี่ยน
และยังคงอยู่ที่ค่าปัจจุบัน จากนั้นเครื่องมือรูปร่างจะพยายามเริ่มต้น
เส้นโค้งจากจุดควบคุมแรก ซึ่งหมายความว่าอาร์กิวเมนต์การดำเนินการ
จะควบคุมว่าเครื่องมือรูปร่างจะทำงานหลังจากการประชุมหรือไม่ ระบุ PLAY
ถึง
เริ่มต้นเส้นโค้งใหม่ทันที ระบุ REVERSE
เพื่อออกจากตัวควบคุมรูปร่างหยุดชั่วคราวที่
ปริมาตรของจุดควบคุมแรกในเส้นโค้งใหม่ คุณเริ่มตัวควบคุมรูปร่างได้
ภายหลังด้วย apply(VolumeShaper.Operation.PLAY)
เมื่อเรียก replace()
ด้วย join = false
ตัวสร้างรูปร่างจะเริ่มเส้นโค้งที่
ระดับที่ระบุโดยจุดควบคุมแรก ซึ่งอาจทำให้เล่นได้ไม่ต่อเนื่อง
ระดับเสียง คุณหลีกเลี่ยงปัญหานี้ได้โดยโทรหา replace()
ด้วยหมายเลข join = true
ค่านี้จะกำหนดจุดควบคุมแรกของเส้นโค้งใหม่เป็นระดับปัจจุบันของ
Shaper และปรับขนาดระดับเสียงของจุดควบคุมทั้งหมดระหว่างจุดแรกและ
สุดท้าย เพื่อรักษารูปร่างสัมพัทธ์ของเส้นโค้งใหม่ (จุดควบคุมสุดท้ายคือ
(ไม่เปลี่ยนแปลง) การดำเนินการปรับขนาดจะเปลี่ยนจุดควบคุมอย่างถาวรใน
เส้นโค้งใหม่ของเครื่องมือรูปร่าง
การนำ VolumeShaper ออก
ระบบจะปิดและขยะเก็บรวบรวม VolumeShaper
เมื่อ AudioTrack
หรือ
MediaPlayer
ได้รับการปล่อยแล้วหรือไม่ได้ใช้งานแล้ว คุณสามารถเรียกใช้เมธอด close()
บนเชปเปอร์เพื่อทำลายในทันที ระบบจะนำตัวควบคุมออกจาก
ไปป์ไลน์เสียงภายในเวลาประมาณ 20 มิลลิวินาที โปรดระมัดระวังเมื่อปิด VolumeShaper
ขณะที่เสียงกำลังเล่น หากเครื่องมือสร้างมีระดับเสียงน้อยกว่า 1.0 เมื่อคุณเรียกใช้
close()
ระดับเสียงของตัวควบคุมรูปแบบจะเปลี่ยนเป็น 1.0 ซึ่งอาจทำให้เหตุการณ์
ปริมาณที่เพิ่มขึ้น