seekTo 在 exoplayer 上重新开始播放

Man*_*ore 6 java android seekbar exoplayer exoplayer2.x

在尝试调用 exoplayer 实例的 seekTo 函数时,在缓冲实时音频流后,播放正在重置并从头开始播放。正如一些博客和要点所建议的那样,在暂停 exoplayer 后尝试调用 seekto,然后在调用 seekto 后再次开始播放,但没有任何影响,它只是重新缓冲播放并重新开始。以下是我到目前为止的尝试:

这是我的 onCreate 事件,其中 seekbar 事件与 exoplayer seekto 调用一起处理

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    playButton = findViewById(R.id.play_button);
    playButton.setOnClickListener(this);
    mSeekBar = findViewById(R.id.seekbar);
    handler.postDelayed( runnable = new Runnable() {
        public void run() {
            //do something
            if (exoPlayer!=null)
            {
                mSeekBar.setMax((int)(exoPlayer.getBufferedPosition()/1000));
                mSeekBar.setProgress((int)(exoPlayer.getCurrentPosition()/1000));
            }
            handler.postDelayed(runnable, delay);
        }
    }, delay);

    mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            Log.d("SEEKBAR_UPDATE",""+progress);
            if (exoPlayer!=null&&fromUser){
                int duration = exoPlayer.getDuration() == com.google.android.exoplayer2.C.TIME_UNSET ? 0
                        : (int) exoPlayer.getDuration();
                long seekPosition = exoPlayer.getDuration() == com.google.android.exoplayer2.C.TIME_UNSET ? 0
                        : Math.min(Math.max(0, progress*1000), duration);
                exoPlayer.setPlayWhenReady(false);//pause
                exoPlayer.seekTo(seekPosition);
                exoPlayer.setPlayWhenReady(true);
            }
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

这是我的 exoplayer 的初始化方式

private void initializePlayer(){
    exoPlayer = new SimpleExoPlayer.Builder(this).build();
    DataSource.Factory dataSourceFactory = new DefaultHttpDataSourceFactory("exoplayer-codelab",5000,2000,true);

    MediaSource mediaSource = new ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(Uri.parse(stream_url));
    exoPlayer.prepare(mediaSource);
    Log.d("total duration",""+exoPlayer.getDuration());
    
    exoPlayer.setPlayWhenReady(true);        

}
Run Code Online (Sandbox Code Playgroud)

如果我在这里遗漏了什么,请告诉我。

更新2:

在阅读了与在 exoplayer 中查找相关的某些问题后,其中一张票中提到我们需要在提取器工厂中设置此标志 LAG_ENABLE_CONSTANT_BITRATE_SEEKING 以使 mp3 流可查找。

DefaultExtractorsFactory extractorsFactory =new DefaultExtractorsFactory()
                        .setMp3ExtractorFlags(Mp3Extractor.FLAG_ENABLE_CONSTANT_BITRATE_SEEKING)
                        .setConstantBitrateSeekingEnabled(true);
Run Code Online (Sandbox Code Playgroud)

所以只是为了对搜索的工作原理有一个基本的了解,我在下面尝试了一个带有简单 exoplayer 实例的活动,该实例被传递到播放器视图,在那里我可以控制播放,甚至使用 UI 的内置搜索栏。

主活动.java

public class MainActivity extends AppCompatActivity {
    SimpleExoPlayer exoPlayer;
    PlayerView playerView;
    String stream_url_mp3 = "https://sc6.gergosnet.com/puls00HD.mp3";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        playerView = findViewById(R.id.playerView);
        initPlayer();
    }

    private void initPlayer(){
        exoPlayer = new SimpleExoPlayer.Builder(this).build();
        playerView.setPlayer(exoPlayer);
        // Produces DataSource instances through which media data is loaded.
        DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(this, Util.getUserAgent(this, "exo-app"));
        DefaultExtractorsFactory extractorsFactory =new DefaultExtractorsFactory()
                        .setMp3ExtractorFlags(Mp3Extractor.FLAG_ENABLE_CONSTANT_BITRATE_SEEKING)
                        .setConstantBitrateSeekingEnabled(true);
        // This is the MediaSource representing the media to be played.
        MediaSource mediaSource =  new ProgressiveMediaSource.Factory(dataSourceFactory,extractorsFactory)
                        .createMediaSource(Uri.parse(stream_url_mp3));
        // Prepare the player with the source.
        exoPlayer.prepare(mediaSource);

    }
}
Run Code Online (Sandbox Code Playgroud)

MainLayout.xml 包含 Player Ui 组件

<com.google.android.exoplayer2.ui.PlayerView
        android:id="@+id/playerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
Run Code Online (Sandbox Code Playgroud)

即使添加了 FLAG_ENABLE_CONSTANT_BITRATE_SEEKING 并设置了 mp3 提取器,我也无法在播放器视图 UI 上使用搜索栏。

请帮忙!