2015-08-11 2 views
2

Я ищу, чтобы реализовать аудиоплеер с переменным воспроизведением скорости (1.0x, 1.25x, 1.5x), как это обычно делают на рынке обычные аудиокниги. Я бы хотел использовать библиотеку Exoplayer Google как свою библиотеку аудиоплеера, но они, похоже, не поддерживают воспроизведение с переменной скоростью. Любые идеи о том, как реализовать это, или какие-либо расширения, которые поддерживают это? Заранее спасибо!Скорость воспроизведения Exoplayer

+0

UPDATE: Просто обновление это для тех, кто все еще ищет: Exoplayer добавила эту функцию, запеченную в их API. Счастливое кодирование! – two1stnamz

ответ

2

Все, что вам нужно, это https://github.com/waywardgeek/sonic/blob/master/Sonic.java

Если посмотреть на MediaCodecAudioTrackRenderer.java, вы можете получить выходной буфер (декодированного MediaCodec) из ExoPlayer в методе processOutputBuffer и обрабатывать его через Sonic.java, прежде чем отправлять его на адрес AudioTrack.

Следующий документ объясняет, как использовать libsonic https://github.com/waywardgeek/sonic/blob/master/doc/index.md

+0

Во-первых, спасибо за ответ @ T.J, оцените его. Так что я сделал некоторые Googling и нашел это https://github.com/skonb/MediaCodecSpeedControllableTrackRenderer/blob/master/MediaCodecSpeedControllableAudioTrackRenderer.java выглядит ли эта реализация близка к тому, что вы говорите? Я попытался интегрировать его с библиотекой Exoplayer и, похоже, не было никакого звука. – two1stnamz

+0

Нет проблем. Да, именно это я и говорил. Не уверен, почему нет звука. Я бы сказал, log processOutputBuffer, чтобы посмотреть, что происходит с данными. –

-1

Вы должны посмотреть этот проект, который был очень полезным для меня: https://github.com/AmrMohammed89/exoplayer2.4.0_speedup

Внутри SimpleExoPlayer, я реализовал следующие методы:

private final ExoPlayer player; 
private float playbackSpeed; 

float SPEED_NORMAL = 1f; 
float SPEED_MEDIUM = 1.5f; 
float SPEED_HIGH = 2f; 


@Override 
public float getPlaybackSpeed() { 
    return playbackSpeed; 
} 

@Override 
public void setPlaybackSpeed(float speed) { 
    playbackSpeed = speed; 
    player.setPlaybackSpeed(speed); 
} 

@Override 
public void changePlaybackSpeed() { 
    if (playbackSpeed == SPEED_MEDIUM) { 
     player.setPlaybackSpeed(SPEED_HIGH); 
     playbackSpeed = SPEED_HIGH; 
    } else if (playbackSpeed == SPEED_HIGH) { 
     player.setPlaybackSpeed(SPEED_NORMAL); 
     playbackSpeed = SPEED_NORMAL; 
    } else { 
     player.setPlaybackSpeed(SPEED_MEDIUM); 
     playbackSpeed = SPEED_MEDIUM; 
    } 
} 

Я установил и сохранил скорость таким образом из-за ошибки, когда я попытался получить последнюю сохраненную скорость. Итак, следуйте этому механизму, и он будет работать отлично.

Приветствия

Смежные вопросы