【问题标题】:slow loading of video exoplayer视频播放器加载缓慢
【发布时间】:2020-11-07 15:25:12
【问题描述】:

所以我正在为 ExoPlayer 使用自定义控制器布局,如果 DefaultTimeBar 的搜索是在 00:01 并且我去 00:03 有 3 或 4 秒 延迟。我要播放的视频在我的 SD 卡中。

视频大小为813kb,为mp4

我需要增加缓冲区段大小还是需要自定义加载控件?

玩家:

public class VideoPlayer extends AppCompatActivity {

    PlayerView playerView;
    SimpleExoPlayer simpleExoPlayer;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_video_player);

        
    }

    @Override
    protected void onStart() {
        super.onStart();

        playerView = findViewById(R.id.exoPlayer);
        File file = new File("sdcard/" + Environment.DIRECTORY_DOWNLOADS + "/" + "playthis.mp4");
        Uri uri = Uri.fromFile(file);
        Uri uri1 = Uri.parse("file://" + uri);
        LoadControl loadControl = new DefaultLoadControl()
        BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
        TrackSelector trackSelector = new DefaultTrackSelector(new AdaptiveTrackSelection.Factory(bandwidthMeter));
        simpleExoPlayer = ExoPlayerFactory.newSimpleInstance(this, trackSelector, loadControl);
        MediaSource mediaSource = buildMediaSource(uri1);
        playerView.setPlayer(simpleExoPlayer);
        playerView.setKeepScreenOn(true);
        simpleExoPlayer.prepare(mediaSource);
        simpleExoPlayer.setPlayWhenReady(true);
        simpleExoPlayer.addListener(new Player.EventListener() {
            @Override
            public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
                if(playWhenReady && playbackState==ExoPlayer.STATE_READY){
                    
                }
                if (playbackState == ExoPlayer.STATE_ENDED) {
                    

                    finish();
                }
            }
        });

       

    }
    public MediaSource buildMediaSource(Uri uri){
        return new ExtractorMediaSource.Factory(new DefaultDataSourceFactory(this,"Test3")).createMediaSource(uri);
    } 
}


自定义控制器的xml:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent"
             android:layout_height="match_parent">
    <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content"
                 android:layout_gravity="center" style="@style/ExoMediaButton.Pause"
                 android:src="@drawable/pause_button_increased" android:id="@+id/exo_pause"/>

    <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content"
                 android:layout_gravity="center"
                 android:src="@drawable/play_button_increased"
                 style="@style/ExoMediaButton.Play" android:id="@+id/exo_play" android:cropToPadding="true"
                 android:adjustViewBounds="true"/>

    <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content"
                 android:layout_gravity="start|center" style="@style/ExoMediaButton.Previous"
                 android:layout_marginStart="250dp"
                 android:src="@drawable/prev_button" android:id="@+id/exo_prev"/>

    <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content"
                 android:layout_gravity="end|center" android:layout_marginEnd="250dp"
                 style="@style/ExoMediaButton.Next"
                 android:src="@drawable/next_button" android:id="@+id/exo_next"/>

    <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content"
                 android:layout_gravity="start"
                 android:rotation="180" android:layout_marginStart="15dp"
                 android:layout_marginTop="20dp"
                 android:src="@drawable/settings_icon_back" android:onClick="endActivity" android:background="@null"/>
    <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content"
                 android:layout_gravity="end" android:layout_marginEnd="10dp"
                 android:layout_marginTop="10dp" android:rotation="90"
                 android:src="@drawable/menu_overflow_vector"
                 android:onClick="addOverlay"
                 android:id="@+id/video_menu" android:background="@null"/>
    <TextView android:layout_width="40dp" android:layout_height="30dp"
              android:layout_gravity="bottom|end"
              android:layout_marginBottom="5dp"
              android:id="@+id/exo_duration" android:textColor="#FFFFFF" android:layout_marginTop="10dp"
              android:layout_marginEnd="72dp"/>
    <TextView android:layout_width="40dp" android:layout_height="30dp"
              android:layout_gravity="start|bottom" android:layout_marginStart="72dp"
              android:layout_marginBottom="5dp" android:layout_marginTop="10dp"
              android:id="@+id/playedTillNow" android:textColor="#FFFFFF"/>

    <TextView android:layout_height="wrap_content" android:layout_width="wrap_content"
              android:id="@+id/videoName" android:layout_gravity="top" android:layout_marginStart="60dp"
              android:layout_marginTop="20dp" android:textColor="#FFFFFF" android:textStyle="bold"/>

    <com.google.android.exoplayer2.ui.DefaultTimeBar
            android:layout_width="500dp" android:layout_height="26dp"
            android:id="@+id/exo_progress"
            android:layout_gravity="bottom|center"
            app:unplayed_color="#000000"
            android:layout_marginBottom="12dp" app:played_color="@color/crimson"/>

</FrameLayout>

如何解决延迟问题?

【问题讨论】:

    标签: android performance exoplayer


    【解决方案1】:

    检查这个:Exoplayer video loading speed

    如果您查看答案,您会发现最小化缓冲时间:

    //Minimum Video you want to buffer while Playing
    private int MIN_BUFFER_DURATION = 2000;
    //Max Video you want to buffer during PlayBack
    private int MAX_BUFFER_DURATION = 5000;
    //Min Video you want to buffer before start Playing it
    private int MIN_PLAYBACK_START_BUFFER = 1500;
    //Min video You want to buffer when user resumes video
    private int MIN_PLAYBACK_RESUME_BUFFER = 2000;
    
    LoadControl loadControl = new DefaultLoadControl.Builder()
        .setAllocator(new DefaultAllocator(true, 16))
        .setBufferDurationsMs(MIN_BUFFER_DURATION,
             MAX_BUFFER_DURATION,
             MIN_PLAYBACK_START_BUFFER,
             MIN_PLAYBACK_RESUME_BUFFER)
        .setTargetBufferBytes(-1)
        .setPrioritizeTimeOverSizeThresholds(true).createDefaultLoadControl();
    
    TrackSelector trackSelector = new DefaultTrackSelector();
    player = ExoPlayerFactory.newSimpleInstance(this, trackSelector, loadControl);
    

    【讨论】:

    • 我确实尝试过,但延迟仍然存在。 @NazarilMoshenskiy
    • 延迟仍然存在,而且似乎这段代码根本没有改变任何东西。
    猜你喜欢
    • 1970-01-01
    • 2011-04-05
    • 2017-03-30
    • 1970-01-01
    • 2019-09-10
    • 1970-01-01
    • 2020-07-24
    • 2020-09-13
    • 1970-01-01
    相关资源
    最近更新 更多