如何停止ExoPlayer后台播放音频。

5
**

需要使用exoplayer在一个片段中实现视频流。流媒体正常工作,但当从片段活动移动到其他活动或屏幕旋转时,同一音频的多个副本将在后台连续播放,直到应用被杀死。请问如何处理这种情况。谢谢。

    public class VideoFragment extends Fragment {
    private SimpleExoPlayerView simpleExoPlayerView;
    public SimpleExoPlayer player;
    Uri mp4VideoUri;
    String TAG ="LOGG";
    SharedPrefs sharedPrefs;
    TextView notavailable;
    String url;
    Connection connection;
    long media_length;

    public VideoFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.video_fragment,container,false);
        sharedPrefs = new SharedPrefs(getContext());
        connection = new Connection(getContext());
        notavailable= (TextView) rootView.findViewById(R.id.videonotavailable);
        BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
        TrackSelection.Factory videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory(bandwidthMeter);
        TrackSelector trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);
        LoadControl loadControl = new DefaultLoadControl();
        player = ExoPlayerFactory.newSimpleInstance(getContext(), trackSelector, loadControl);
        simpleExoPlayerView = new SimpleExoPlayerView(getContext());
        simpleExoPlayerView = (SimpleExoPlayerView) rootView.findViewById(R.id.player_view);
        simpleExoPlayerView.setUseController(true);
        simpleExoPlayerView.requestFocus();
        simpleExoPlayerView.setPlayer(player);
        DefaultBandwidthMeter bandwidthMeterA = new DefaultBandwidthMeter();
        DefaultDataSourceFactory dataSourceFactory = new DefaultDataSourceFactory(getContext(), Util.getUserAgent(getContext(), "exoplayer2example"), bandwidthMeterA);
        ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();
        url=sharedPrefs.getvideoUrl();
        if (url==null || url.equals("")){
            simpleExoPlayerView.setVisibility(View.GONE);
            notavailable.setVisibility(View.VISIBLE);
        }else if (connection.isInternet()){
            mp4VideoUri=Uri.parse(sharedPrefs.getvideoUrl());
            MediaSource videoSource = new ExtractorMediaSource(mp4VideoUri,dataSourceFactory,extractorsFactory,null,null);
            final LoopingMediaSource loopingSource = new LoopingMediaSource(videoSource);

            player.prepare(loopingSource);

            player.addListener(new ExoPlayer.EventListener() {
                @Override
                public void onLoadingChanged(boolean isLoading) {
                    Log.v(TAG,"Listener-onLoadingChanged...");
                }

                @Override
                public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
                    Log.v(TAG,"Listener-onPlayerStateChanged...");
                }

                @Override
                public void onTimelineChanged(Timeline timeline, Object manifest) {
                    Log.v(TAG,"Listener-onTimelineChanged...");

                }

                @Override
                public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {

                }

                @Override
                public void onPlayerError(ExoPlaybackException error) {
                    Log.v(TAG,"Listener-onPlayerError...");
                    player.stop();
                }

                @Override
                public void onPositionDiscontinuity() {
                    Log.v("LOG","Listener-onPositionDiscontinuity...");

                }

                @Override
                public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {

                }
            });
            player.setPlayWhenReady(true);
        }else {
            simpleExoPlayerView.setVisibility(View.GONE);
            notavailable.setVisibility(View.VISIBLE);
            notavailable.setText(getString(R.string.nointernet));
        }
        return rootView;
    }

    @Override
    public void onPause() {
        super.onPause();
        if(player != null) {
            player.stop();
            player.release();
            media_length = player.getCurrentPosition();
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        if(player != null) {
            player.seekTo(media_length);
            player.setPlayWhenReady(true);
        }
    }
}

在片段中创建一个简单的ExoPlayerView。通常的方法是在活动/片段中创建一个服务。它只会启动一次,无论活动被重新创建多少次。我不知道ExoPlayer如何工作,但如果它不启动服务,您应该在片段或活动的onCreateView/onDestroyView(或onResume/onPause)中正确地启动和停止它,以及onStart/onStop/onDestroy。 - CoolMind
2个回答

1
在您的片段持有活动中,您需要在onPause方法中处理情况:
@Override
protected void onPause() {
    super.onPause();
    mPlayerFragment.pause();
}

你可以在片段中定义一个方法,通过将 false 传递给 setPlayWhenReady() 来暂停播放。
public void pausePlayback() {
        mExoPlayer.setPlayWhenReady(false); //pauses the playback if it's playing
    }

0

我遇到了同样的问题,但在我的现有代码中实施以下代码后问题得到解决

首先,您需要创建全局变量

 boolean isActivityRunning = false;

在活动的onCreate()onResume()中将此值设置为true

如果值为isActivityRunning,则需要设置Player为true

之后你需要在onPause()onStop()onDestroy()中释放播放器并将isActivityRunning = false设置为如下:

 @Override
    public void onPause() {
        super.onPause();
        isActivityRunning = false;
        releasePlayer();
    }

    @Override
    public void onStop() {
        super.onStop();
        isActivityRunning = false;
        releasePlayer();
    }

 @Override
    public void onBackPressed() {
        super.onBackPressed();
        releasePlayer();
    }

  @Override
    protected void onDestroy(){
        super.onDestroy();
        releasePlayer();
    }

releasePlayer()的实现看起来像是这样的

 SimpleExoPlayer player;
 PlayerView playerUI;

     private void releasePlayer(){
            if(player!=null){
                player.release();
                player.clearVideoSurface();
                playerUI.getPlayer().release();;
    
    
                player = null;
                playerUI =null;
            }
        }

玩家和玩家UI是需要设置为全局变量的null

这个解决方案对我很有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接