Когда я воспроизводю второе видео, отображается только замороженный кадр первого видео и воспроизводится звук.

В моем приложении есть фрагмент, который воспроизводит видео длительностью в одну секунду. После воспроизведения видео пользователь должен нажать кнопку, после чего должно быть воспроизведено новое видео. Перед воспроизведением второго видео мое основное действие загружается, создает новый фрагмент и создает новый экземпляр Exoplayer.

При первом просмотре видео все работает как положено. Однако, если я хочу воспроизвести второе видео, он показывает замороженное изображение последнего кадра первого видео и воспроизводит звук второго видео. Эта ошибка появляется не в Android 8 (уровень API 26), а в версиях ниже Android 8 (я тестировал Android 6 и Android 7.1).

Учитывая, что у меня есть и новая поверхность с новым фрагментом, и новый Exoplayer, для меня загадка, почему все еще есть данные для последнего кадра предыдущего видео. Есть ли какая-то функция, которую я могу вызвать, чтобы удалить эти данные и получить поведение, которое я получаю в Android 8, где второе видео воспроизводится без проблем также в более ранних версиях Android?

До того, как я использовал ExoPlayer, у обычного MediaPlayer была такая же проблема. Я создал минимизированный пример проблемы, в которой у меня есть:

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button mButton = findViewById(R.id.button1);
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                createNewFragment();
            }
        });
    }

    private void createNewFragment() {
        FragmentTransaction ft = getFragmentManager().beginTransaction();
        ft.add(R.id.contentFragment, new VideoFragment());
        ft.commit();
    }
}

public class VideoFragment extends Fragment implements SurfaceHolder.Callback{
    private Context mContext;
    private SimpleExoPlayer mPlayer;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.videolayout, container, false);
        SurfaceView mSurfaceView = (SurfaceView) view.findViewById(R.id.surface_view1);
        SurfaceHolder surfaceHolder = mSurfaceView.getHolder();
        surfaceHolder.setSizeFromLayout();
        surfaceHolder.addCallback(this);

        mContext = inflater.getContext();

        return view;
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
        TrackSelection.Factory videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory(bandwidthMeter);
        TrackSelector trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);

        mPlayer = ExoPlayerFactory.newSimpleInstance(mContext, trackSelector);
        mPlayer.setVideoSurfaceHolder(holder);
        mPlayer.setPlayWhenReady(true);
        playVideo(mContext);
    }

    private void playVideo(Context context){
        final RawResourceDataSource rawResourceDataSource = new RawResourceDataSource(context);

        int raw_res_id = context.getResources().getIdentifier(
                "collect",
                "raw",
                context.getPackageName());
        DataSpec dataSpec = new DataSpec(RawResourceDataSource.buildRawResourceUri(raw_res_id));
        try {
            rawResourceDataSource.open(dataSpec);

            DataSource.Factory factory = new DataSource.Factory() {
                @Override
                public DataSource createDataSource() {
                    return rawResourceDataSource;
                }
            };
            MediaSource media_source = new ExtractorMediaSource.Factory(factory).createMediaSource(rawResourceDataSource.getUri());
            mPlayer.prepare(media_source);

        } catch (RawResourceDataSource.RawResourceDataSourceException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
    }
}

person Christian    schedule 15.05.2018    source источник


Ответы (1)


попробуйте выполнить приведенный ниже код для изменения фрагмента

 final FragmentTransaction transaction = fragmentManager.beginTransaction();
    Fragment f = new VideoFragment();
    transaction.replace(R.id.contentFragment, f).commit();

Просто попробуйте этот код и проверьте, происходит ли то же самое

person Jinson Paul    schedule 22.05.2018