【问题标题】:Sometime video buffering very slowly in exoplayer?有时在 exoplayer 中视频缓冲非常慢?
【发布时间】:2023-01-24 03:44:49
【问题描述】:

我不知道为什么,但有时 Exoplayer 缓冲我的视频非常慢。我的服务器响应正常,互联网也很快,但有时 Exoplayer 会缓慢缓冲我的视频不到 1 秒。并且它总是在每播放 1-2 秒后缓冲一次。

        int MIN_BUFFER_DURATION = 3000;
        int MAX_BUFFER_DURATION = 8000;
        int MIN_PLAYBACK_RESUME_BUFFER = 1500;
        int MIN_PLAYBACK_START_BUFFER = 500;
        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();
        simpleExoPlayer = new ExoPlayer.Builder(this).setTrackSelector(trackSelector).setLoadControl(loadControl).build();
        binding.exoPlayerView.setPlayer(simpleExoPlayer);
        mediaItem = MediaItem.fromUri(getVid);
        simpleExoPlayer.addMediaItem(mediaItem);
        simpleExoPlayer.prepare();
        simpleExoPlayer.play();

我正在我的 Exoplayer 和Chrome Browser player. Chrome 浏览器player plays my video 4X faster than my appExoplayer 中测试我的视频?我正在同一时间播放同一视频。有人也在 exoplayer git 中问过这个问题,但没有得到很好的答案或结果,请参阅他们的问题exoplayer issue github 这同样的问题导致了我!

有谁知道为什么会这样?你的回答对我有帮助。

【问题讨论】:

  • 更新 .setTargetBufferBytes(C.LENGTH_UNSET)
  • @PrasadTamgale 先生,请解释您写的内容。我不明白?
  • 我是说,也许尝试将目标缓冲区字节大小设置为 C.LENGTH_UNSET 并查看是否有帮助。
  • @PrasadTamgale 你能给我解释一下如何实现吗?用一些代码?
  • 您的代码相同,只需从 .setTargetBufferBytes(-1) 更新为 .setTargetBufferBytes(C.LENGTH_UNSET)

标签: java android exoplayer exoplayer2.x


【解决方案1】:
  1. 确保您使用的是最新版本的 Exoplayer。在撰写本文时,即 2.10.4。

  2. 尝试增加 LoadControl 中的缓冲持续时间值:

    int MIN_BUFFER_DURATION = 3000; // 3 seconds 
    int MAX_BUFFER_DURATION = 8000; // 8 seconds 
    int MIN_PLAYBACK_RESUME_BUFFER = 1500; // 1.5 seconds 
    int MIN_PLAYBACK_START_BUFFER = 500; // 0.5 seconds 
    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()
    
    1. 尝试使用不同的 LoadControl。例如,您可以将 DefaultLoadControl 与较小的目标缓冲区(例如视频比特率的 25%)一起使用:
    int TARGET_BUFFER_BYTES = (int) (0.25 * videoBitrate); // 25% of the video bitrate in bytes 
    LoadControl loadControl = new DefaultLoadControl(new DefaultAllocator(true, 16), TARGET_BUFFER_BYTES , DEFAULT _MIN _REBUFFER _MS , DEFAULT _MAX LOADING _MS, DEFAULT __MIN ELAPSED __MS_BEFORE STOPPING , false); 
    
    1. 尝试使用不同的分配器。例如,您可以使用更大的:
    int allocatorSize = 2 * 1024 * 1024; // 2MB 
    Allocator allocator = new DefaultAllocator(true, allocatorSize); 
    LoadControl loadControl = new DefaultLoadControl(allocator , DEFAULT _TARGET_BUFFER _BYTES , DEFAULT __MIN REBUFFER MS , DEFAULT MAX LOADING MS , DEFAULT MIN ELAPSED MS BEFORE STOPPING , false); 
    

【讨论】:

  • 先生,我怎样才能得到我的视频的比特率?
  • 您可以使用 ExoPlayer.TrackInfo.bitrate ``` int videoBitrate = exoPlayer.getTrackInfo().bitrate; 获取视频的比特率; ``` 注意:如果您使用 ExoPlayer.EventListener 来监听事件,请确保您的事件监听器中没有太多逻辑。因为它们是在主线程上调用的,所以如果它们花费的时间太长,它们可能会减慢播放速度。
  • 我试过你的代码,但在 Exoplayer 库中找不到的一些代码是 DEFAULT MAX LOADING MS , DEFAULT MIN ELAPSED MS BEFORE STOPPING, 在 exoplayer 库中找不到。我尝试了第二种方法,但没有找到好的结果。我正在我的 Exoplayer 和 Chrome Browser 播放器中测试我的视频。 Chrome 浏览器播放器播放我的视频的速度比我的应用程序 Exoplayer 快 4 倍?我正在同一时间播放同一视频。有人也在 exoplayer git 中问过这个问题,但没有得到好的答案或结果,请参阅他们的问题github.com/google/ExoPlayer/issues/6484 这同样的问题导致了我!
  • 我刚刚编辑了第一种方法的代码,它可能会修复它
  • 它工作得很好(有关 Exo 的更新或任何错误修复)。但是您的回答有助于提高播放速度和视频加载速度。谢谢
【解决方案2】:

将以下设置为 0 -> 测试行为 -> 根据需要进行调整

int MIN_PLAYBACK_RESUME_BUFFER = 1500;
int MIN_PLAYBACK_START_BUFFER = 500;

【讨论】:

  • 感谢您的回答。我试图让它们为 0,但视频每次都在缓冲意味着缓冲和播放缓冲和播放。您还有其他解决方案或更改吗?
【解决方案3】:

对我有用的是:

    int MIN_BUFFER_DURATION = 3000; // 3 seconds
    int MAX_BUFFER_DURATION = 3000; // 3 seconds
    int MIN_PLAYBACK_RESUME_BUFFER = 1500; // 1.5 seconds
    int MIN_PLAYBACK_START_BUFFER = 500; // 0.5 seconds
    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();
    ExoPlayer player= new ExoPlayer.Builder(this).setLoadControl(loadControl).build();

根据@Carter McKay 的回答,只是更改了 MAX_BUFFER_DURATION。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-30
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    • 2018-04-02
    • 1970-01-01
    相关资源
    最近更新 更多