我想播放本地存储在res
- 文件夹中的视频。我需要ExoPlayer2改变播放速度的能力。在实践中,我将不同类型的片段加载到FrameLayout
中。
当我想播放视频时,我首先创建一个ExoPlayer2实例并将新媒体文件加载到其中。然后,我等到播放器处于播放状态Player.READY
,然后加载我的新片段。在片段的onCreateView()
- 方法中,我将片段的SurfaceView
附加到ExoPlayer实例。
不幸的是,在播放我的视频之前,片段会在30到100毫秒内闪烁黑屏,我认为这种行为对于用户体验来说是不受欢迎的,并且希望在片段呈现后立即开始播放视频。
我将最小化的示例上传到Github以说明问题,并在ExoPlayer2的存储库中创建ticket。
提供示例代码的几行:
片段中的onCreateView()
方法:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.videolayout, container, false);
mContext = inflater.getContext();
MainActivity activity = (MainActivity) getActivity();
mPlayer = activity.getPlayer();
mPlayer.setVideoSurfaceView((SurfaceView) view.findViewById(R.id.surface_view1));
mPlayer.setPlayWhenReady(true);
return view;
}
加载新视频文件的功能:
private void playVideo(Context context, String name){
final int raw_res_id = context.getResources().getIdentifier(
name,
"raw",
context.getPackageName());
MediaSource media_source = new ExtractorMediaSource.Factory(getDataSourceFactory()).createMediaSource(
RawResourceDataSource.buildRawResourceUri(raw_res_id));
mPlayer.prepare(media_source);
mPlayer.setPlayWhenReady(false);
}
加载新片段的函数:
private void waitTillReady(){
if (mPlayer.getPlaybackState() == Player.STATE_READY){
createNewFragment();
}
else{
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
waitTillReady();
}
}, 10);
}
}
private void createNewFragment() {
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.contentFragment, new VideoFragment());
ft.commit();
}