从后台线程或主ui线程使用exoplayer更好吗?

时间:2018-01-29 10:14:53

标签: exoplayer

为了避免应用程序中的任何混蛋,从后台线程使用exoplayer或从主ui线程使用它是否更好?

注意:当我在主ui线程中创建一个simpleExoPlayer时:

// 1. Create a default TrackSelector
Handler mainHandler = new Handler();
BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
TrackSelection.Factory videoTrackSelectionFactory =
    new AdaptiveTrackSelection.Factory(bandwidthMeter);
TrackSelector trackSelector =
    new DefaultTrackSelector(videoTrackSelectionFactory);

// 2. Create the player
SimpleExoPlayer player =
    ExoPlayerFactory.newSimpleInstance(context, trackSelector);

然后花了 90 ms !!它太慢了,我会有几个帧丢失导致我的动画中的混蛋。也在做

// Measures bandwidth during playback. Can be null if not required.
DefaultBandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
// Produces DataSource instances through which media data is loaded.
DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(context,
    Util.getUserAgent(context, "yourApplicationName"), bandwidthMeter);
// This is the MediaSource representing the media to be played.
MediaSource videoSource = new ExtractorMediaSource.Factory(dataSourceFactory)
    .createMediaSource(mp4VideoUri);
// Prepare the player with the source.
player.prepare(videoSource);

花了 20ms !它也慢得慢,我会有另一个帧丢失

2 个答案:

答案 0 :(得分:1)

ExoPlayer的内部负责处理线程 - 因此在主(应用程序)线程上调用大多数API是安全的。

来自documentation

  

建议从单个应用程序线程创建和访问ExoPlayer实例。应用程序的主要线程是理想的。不鼓励从多个线程访问实例,但是如果应用程序确实希望这样做,那么它可以这样做,只要它确保访问是同步的。

ExoPlayer Threading Model Diagram

答案 1 :(得分:1)

除了Kyle的解释之外,还可以补充说,除了release()调用之外,所有调用都是非阻塞的,因为消息被发送到播放器正在运行的线程。

release()将阻止,直到资源被释放。只有在完全销毁播放器实例时才需要调用stop()。如果你想重用播放器实例,例如。另一个调用stop的媒体来源就足够了。

如果已经调用了release(),则所有stop实际上都会阻止任何仍在等待的<input type="text" value="Click me!" uib-tooltip="See? Now click away..." tooltip-trigger="'focus'" tooltip-placement="bottom" class="form-control" /> 操作,最后终止播放线程。