VolumeShaper로 진폭 제어

오디오 앱에서 VolumeShaper를 사용하여 페이드 인, 페이드 아웃, 크로스 페이드, 볼륨 낮추기 및 기타 짧은 자동 볼륨 사용할 수 있습니다. VolumeShaper 클래스는 Android 8.0 (API 수준 26)에서 사용할 수 있습니다. 및 나중에 확인할 수 있습니다.

인스턴스에서 createVolumeShaper()를 호출하여 VolumeShaper를 만듭니다. 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]과 일치해야 합니다.

보간기 유형

볼륨 곡선은 항상 지정된 제어점을 통과합니다. 값 스플라인에 의해 파생됩니다. 보간기 유형입니다. 이 속성은 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 실행

첫 번째 컨트롤 포인트의 볼륨 수준이 오디오 경로에 적용되지만 셰이퍼가 만들어지면 바로 셰이퍼가 곡선을 따라 진행되지 않습니다. VolumeShaper.Operation.PLAYapply() 메서드를 호출할 때까지 후(After) 셰이퍼를 만드는 경우 apply()의 첫 번째 호출은 PLAY를 지정해야 합니다. 연산을 완료해야 합니다. 그러면 곡선이 첫 번째 지점에서 시작 지점까지 마지막 컨트롤 포인트:

Kotlin

Shaper.apply(VolumeShaper.Operation.PLAY)

자바

Shaper.apply(VolumeShaper.Operation.PLAY);

셰이퍼가 실행되는 동안 다음을 지정하는 apply() 호출을 번갈아 실행할 수 있습니다. REVERSE 및 PLAY 연산을 실행합니다. 이렇게 하면 반복해 나갈 수 있습니다.

셰이퍼가 지속적으로 볼륨을 조정하고 모든 컨트롤 포인트를 통과합니다. 만료될 때까지 셰이퍼가 마지막에 도달하면 발생합니다 (PLAY의 경우). 곡선의 첫 번째 제어점 (역방향 연산의 경우)입니다.

셰이퍼가 만료되면 볼륨은 마지막 설정으로 유지되며, 첫 번째 또는 마지막 제어점에 전달합니다. VolumeShaper.getVolume()에 전화하여 다음 작업을 할 수 있습니다. 언제든지 현재 볼륨 레벨을 변경할 수 있습니다.

셰이퍼가 만료된 후 apply() 호출을 다시 실행하여 곡선을 실행할 수 있습니다. 반대 방향으로 돌리세요 예를 들어 셰이퍼가 실행 중에 만료되고 PLAY, 다음 apply()REVERSE여야 합니다. PLAY 이후에 PLAY에 전화를 겁니다 만료되거나 REVERSE 만료 후 REVERSE가 만료되지 않습니다.

PLAYREVERSE 연산을 번갈아 수행해야 합니다. 에코를 연주할 방법이 없습니다. 마지막 제어점에서 곡선을 그리며 거기에서 다시 시작합니다. 첫 번째 기준점에 도달할 수 있습니다 replace() 메서드를 사용할 수 있습니다. 자세한 내용은 다음 도움말을 참고하세요. 곡선 자체의 사본으로 대체합니다. 이렇게 하면 셰이퍼가 재설정되고 PLAY 작업을 다시 시작해야 합니다.

곡선 변경

VolumeShaper의 곡선을 변경하려면 replace() 메서드를 사용합니다. 이 메서드는 구성, 연산, 조인 매개변수가 있습니다. 다음과 같이 호출할 수 있습니다. replace() 메서드를 호출할 수 있습니다.

Kotlin

val newConfig = VolumeShaper.Configuration.Builder()
        .setDuration(1000)
        .setCurve(floatArrayOf(0f, 0.5f), floatArrayOf(0f, 1f))
        .setInterpolatorType(VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR)
        .build()
val join = true
Shaper.replace(newConfig, VolumeShaper.Operation.PLAY, join)

자바

VolumeShaper.Configuration newConfig =
  새 VolumeShaper.Configuration.Builder()
    .setDuration(1000)
    .setCurve(new float[] {0.f, 0.5f}, new float[] {0.f, 1.f})
    .setInterpolatorType(VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR)
    .build()

boolean join = true;
Shaper.replace(newConfig, VolumeShaper.Operation.PLAY, join);

셰이퍼가 실행되는 동안 replace()를 호출하면 셰이퍼가 현재 값으로 유지됩니다 그런 다음 셰이퍼는 새로운 곡선 아래에 있습니다. 즉, 연산 인수는 셰이퍼가 호출 후 실행될지 여부를 제어합니다. PLAY 지정 대상: 바로 새 곡선을 시작하고 REVERSE를 지정하여 셰이퍼를 일시중지한 상태로 둡니다. 새 곡선의 첫 번째 제어점의 볼륨입니다. 셰이퍼를 시작하고 나중에 apply(VolumeShaper.Operation.PLAY)로.

join = falsereplace()를 호출하면 셰이퍼는 다음 위치에서 곡선을 시작합니다. 첫 번째 컨트롤 포인트에서 지정한 레벨입니다. 이로 인해 확인할 수 있습니다 이를 방지하려면 replace()로 설정한 상태에서 join = true를 호출하면 됩니다. 그러면 새 곡선의 첫 번째 제어점이 셰이퍼를 만들고 첫 번째와 새 곡선의 상대적 모양을 유지하기 위한 마지막 지점입니다. 마지막 제어점은 변경되지 않음). 확장 작업은 셰이퍼의 새 곡선입니다.

VolumeShaper 제거

VolumeShaperAudioTrack 또는 MediaPlayer 버전이 출시되었거나 더 이상 사용되지 않습니다. close() 메서드를 호출할 수 있습니다. 즉시 파괴할 것입니다. 시스템은 셰이퍼를 매우 짧은 시간 안에 오디오 파이프라인을 만들어 보겠습니다 VolumeShaper를 닫을 때 주의 사용할 수 있습니다. 호출 시 셰이퍼의 볼륨이 1.0 미만인 경우 close()이면 셰이퍼의 볼륨 스케일이 1.0으로 변경됩니다. 이로 인해 갑작스러운 규모 증가