Android-Exoplayer 2-平滑更改重叠的音乐

我正在用Exoplayer 2构建音乐播放器。 我想平滑地更改音乐,使两种音乐重叠。因此,当您传递到下一首歌曲时,当前一首调低而第二首开始。

我不知道Exoplayer如何同时播放两种声音。

PS:我无法创建独特的合并音乐,因为我事先不知道音乐何时会通过。

jinjbnu 回答:Android-Exoplayer 2-平滑更改重叠的音乐

如下所述,似乎尚不支持此功能(淡入淡出)。请查看以下链接。

来源https://github.com/google/ExoPlayer/issues/3438

但是,如果您可以牺牲重叠功能,则可以将其作为上述链接中所述的变通方法来实现,即在过去N秒钟内降低上一首音乐的声音,并在增加前一首音乐后的声音的同时开始其他音乐完成。它不会同时,但会顺序

请参见下文:(这些当然只是示例/示例代码部分,旨在仅给出有关变通办法的想法,并且可能有另一种/更好的方法来实现此变通办法。尽管考虑了某些情况,仍然可能有一些遗漏的东西或错误。因此,可以随意修改)

在减少声音的同时完成以前的音乐,在增加声音的同时开始新的音乐

Target decreaseVolumeTarget = new Target() {
  @Override
  void handleMessage(int messageType,Object payload) throws ExoPlaybackException {
    Integer[] payloadArr = (Integer[]) payload;
    Integer volumeAmount = payloadArr[0];
    Integer dontExceedVolumeAmount = payloadArr[1];

    float playerVolume = player.getVolume() * 100.0F;

    /* Decrease if playerVolume is bigger than 0 */
    if(playerVolume > 0) {
      /* If the player volume is bigger than the target volume */
      if(playerVolume > dontExceedVolumeAmount) {
        /* If volumeAmount is bigger than the volume difference between player & target */
        if(playerVolume - dontExceedVolumeAmount < volumeAmount) {
          volumeAmount = playerVolume - dontExceedVolumeAmount;
        }

        playerVolume = playerVolume - volumeAmount; /* 100% to 0% */
        player.setVolume(playerVolume / 100.0F);

        volumeDecreaseOperationDone = true;
      }
    }     
  }
}

Target increaseVolumeTarget = new Target() {
  @Override
  void handleMessage(int messageType,Object payload) throws ExoPlaybackException {
    Integer[] payloadArr = (Integer[]) payload;
    Integer volumeAmount = payloadArr[0];
    Integer dontExceedVolumeAmount = payloadArr[1];

    float playerVolume = player.getVolume() * 100.0F;

    /* Increase if playerVolume is smaller than 100 */
    if(playerVolume < 100) {
      /* If the player volume is lower than the target volume */
      if(playerVolume < dontExceedVolumeAmount) {
        /* If volumeAmount is bigger than the volume difference between player & target */
        if(dontExceedVolumeAmount - playerVolume < volumeAmount) {
          volumeAmount = dontExceedVolumeAmount - playerVolume;
        }

        // Consider the original user set volume
        if(initialPlayerVolume - playerVolume < volumeAmount) {
          volumeAmount = initialPlayerVolume - playerVolume;
        }

        playerVolume = playerVolume + volumeAmount; /* 0% to 100% */
        player.setVolume(playerVolume / 100.0F);

        volumeIncreaseOperationDone = true;
      }
    }
  }
}

设置排定的消息以减小曲目的最后位置的音量

@Override
public void onPlayerStateChanged(boolean playWhenReady,int playbackState) {
  // Also PlaybackStateCompat.STATE_PLAYING can be checked

  switch (playbackState) {
    case Player.STATE_IDLE:
      break;
    case Player.STATE_BUFFERING:
      break;
    case Player.STATE_READY:
      // Get current track duration
      long trackDuration = player.getDuration();
      long trackCurrentMs = player.getCurrentPosition();
      player.setVolume(initialPlayerVolume / 100.0F);

      initialPlayerVolume = player.getVolume() * 100.0F; // initialPlayerVolume may be stored like global or in some temporary configuration etc.

      // Check track duration whether it is longer than 5000 ms or not before sending message
      if(trackDuration > 5000 && trackCurrentMs < trackDuration - 5000) {
        player.createMessage(decreaseVolumeTarget)
        .setPosition(trackDuration - 5000L) // in milliseconds
        .setPayload(new Integer[]{ 20,80 })
        .setHandler(new Handler()) // A shared handler may also be used
        .send();
      }

      // Check track duration whether it is longer than 4000 ms or not before sending message
      if(trackDuration > 4000 && trackCurrentMs < trackDuration - 4000) {
        player.createMessage(decreaseVolumeTarget)
        .setPosition(trackDuration - 4000L) // in milliseconds
        .setPayload(new Integer[]{ 20,60 })
        .setHandler(new Handler()) // A shared handler may also be used
        .send();
      }

      // Check track duration whether it is longer than 3000 ms or not before sending message
      if(trackDuration > 3000 && trackCurrentMs < trackDuration - 3000) {
        player.createMessage(decreaseVolumeTarget)
        .setPosition(trackDuration - 3000L) // in milliseconds
        .setPayload(new Integer[]{ 20,40 })
        .setHandler(new Handler()) // A shared handler may also be used
        .send();
      }

      // Check track duration whether it is longer than 2000 ms or not before sending message
      if(trackDuration > 2000 && trackCurrentMs < trackDuration - 2000) {
        player.createMessage(decreaseVolumeTarget)
        .setPosition(trackDuration - 2000L) // in milliseconds
        .setPayload(new Integer[]{ 20,20 })
        .setHandler(new Handler()) // A shared handler may also be used
        .send();
      }

      // Check track duration whether it is longer than 1000 ms or not before sending message
      if(trackDuration > 1000 & trackCurrentMs < trackDuration - 1000) {
        player.createMessage(decreaseVolumeTarget)
        .setPosition(trackDuration - 1000L) // in milliseconds
        .setPayload(new Integer[]{ 20,0 })
        .setHandler(new Handler()) // A shared handler may also be used
        .send();
      }
      break;
    case Player.STATE_ENDED:
      player.setVolume(initialPlayerVolume / 100.0F);
      break;
    default:
      break;
  }
}

上一首音乐→下一首音乐

@Override
public void onPositionDiscontinuity(@Player.DiscontinuityReason int reason) {
  //Get new track information & increase volume slowly    

  switch (reason) {
    case Player.DISCONTINUITY_REASON_PERIOD_TRANSITION:
      // Get new track duration
      long trackDuration = player.getDuration();

      if(volumeDecreaseOperationDone){
        volumeDecreaseOperationDone = false;

        // Check track duration whether it is longer than 1000 ms or not before sending message
        if(trackDuration > 1000) {
          player.createMessage(increaseVolumeTarget)
          .setPosition(1000L) // in milliseconds
          .setPayload(new Integer[]{ 20,20 })
          .setHandler(new Handler()) // A shared handler may also be used
          .send();
        }

        // Check track duration whether it is longer than 2000 ms or not before sending message
        if(trackDuration > 2000) {
          player.createMessage(increaseVolumeTarget)
          .setPosition(2000L) // in milliseconds
          .setPayload(new Integer[]{ 20,40 })
          .setHandler(new Handler()) // A shared handler may also be used
          .send();
        }

        // Check track duration whether it is longer than 3000 ms or not before sending message
        if(trackDuration > 3000) {
          player.createMessage(increaseVolumeTarget)
          .setPosition(3000L) // in milliseconds
          .setPayload(new Integer[]{ 20,60 })
          .setHandler(new Handler()) // A shared handler may also be used
          .send();
        }

        // Check track duration whether it is longer than 4000 ms or not before sending message
        if(trackDuration > 4000) {
          player.createMessage(increaseVolumeTarget)
          .setPosition(4000L) // in milliseconds
          .setPayload(new Integer[]{ 20,80 })
          .setHandler(new Handler()) // A shared handler may also be used
          .send();
        }

        // Check track duration whether it is longer than 5000 ms or not before sending message
        if(trackDuration > 5000) {
          player.createMessage(increaseVolumeTarget)
          .setPosition(5000L) // in milliseconds
          .setPayload(new Integer[]{ 20,100 })
          .setHandler(new Handler()) // A shared handler may also be used
          .send();
        }
      }
      break;
    case Player.DISCONTINUITY_REASON_SEEK:
      break;
    case Player.DISCONTINUITY_REASON_SEEK_ADJUSTMENT:         
      break;
    case Player.DISCONTINUITY_REASON_AD_INSERTION:        
      break;
    case Player.DISCONTINUITY_REASON_INTERNAL:         
      break;
  }

}
本文链接:https://www.f2er.com/2956933.html

大家都在问