为了避免应用程序中的任何混蛋,从后台线程使用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 !它也慢得慢,我会有另一个帧丢失
答案 0 :(得分:1)
ExoPlayer的内部负责处理线程 - 因此在主(应用程序)线程上调用大多数API是安全的。
建议从单个应用程序线程创建和访问ExoPlayer实例。应用程序的主要线程是理想的。不鼓励从多个线程访问实例,但是如果应用程序确实希望这样做,那么它可以这样做,只要它确保访问是同步的。
答案 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" />
操作,最后终止播放线程。