TLDR; 运行一个方法,从每隔几毫秒更新一次的OnCallBack函数更新专用线程上的UI !!
我正在使用Vitamio库获取直播视频并在SurfaceView
上显示这是由图书馆的MediaPlayer
完成的。
但是,我需要将屏幕拆分为VR体验。如果MediaPlayer
有方法在2 SurfaceView
s上显示视频,那么我就不会遇到这样的问题。不幸的是,它没有。
因此,我认为直播视频会在屏幕上半部分的SurfaceView
上运行,并且我会将每个帧图像Bitmap
显示为占据下半部分的ImageView
屏幕。
这是有效但不好......问题是复制图像太多了,这就是ImageView
滞后的原因。
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<SurfaceView
android:id="@+id/surfaceview_livestream"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginBottom="@dimen/activity_vertical_margin"
android:layout_marginTop="@dimen/activity_vertical_margin"
android:layout_weight="1" />
<ImageView
android:id="@+id/imageview_livestream"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginBottom="@dimen/activity_vertical_margin"
android:layout_marginTop="@dimen/activity_vertical_margin"
android:layout_weight="1"
android:contentDescription="@string/live_stream" />
</LinearLayout>
public class LiveStreamManager implements MediaPlayer.OnBufferingUpdate {
// some irrelevant code
public void initLiveStream() {
io.vov.vitamio.MediaPlayer mediaPlayer = new io.vov.vitamio.MediaPlayer();
mediaPlayer.setDisplay(mainActivity.getSurfaceView());
// other irrelevant code...
}
@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
Bitmap frame = mp.getCurrentFrame();
if (frame != null) {
mainActivity.setFrame(frame);
}
}
}
public MainActivity extends Activity {
// some code...
// I want this to run on a dedicated thread
public void setFrame(Bitmap frame) {
imageviewLiveStream.setImageBitmap(frame);
}
}
答案 0 :(得分:0)
尝试使用rxJava:
Observable.interval(100, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.handlerThread())
.map(t -> {
// do rendering here (on single render thread
return 'rendered images'
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe( t -> {
// set bitmaps here
});
渲染将是每10毫秒在单独的线程(预先创建调度程序)上的一个,然后将在主线程上处理结果。