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 上使用搜索栏。
请帮忙!
归档时间: |
|
查看次数: |
1098 次 |
最近记录: |