【问题标题】:Android libVLC - way to clear the surface after stopping playbackAndroid libVLC - 停止播放后清除表面的方法
【发布时间】:2019-11-25 13:20:25
【问题描述】:

使用vlc-android,我在片段中有以下sn-p:

private LibVLC mLibVLC;
private MediaPlayer mMediaPlayer;
private VLCVideoLayout mVideoLayout;

public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    mVideoLayout = inflate.findViewById(R.id.video_layout);
    mMediaPlayer.attachViews(mVideoLayout, null, true, false);

    return inflate;
}

public void onCreate(@Nullable Bundle savedInstanceState) {
    mLibVLC = new LibVLC(getActivity(), args);
    mMediaPlayer = new MediaPlayer(mLibVLC);
}

public void playStream(String stream) {
    mMediaPlayer.play(Uri.parse(stream));
}

public void stopStream() {
    mMediaPlayer.stop();
}

此代码基于官方libvlc-android-samples

一切正常,它可以通过将它传递给 playStream 来播放我想要的任何东西。

当我调用 stopStream 函数时,播放停止但表面停留在那里并且没有被清除。 IE。 mVideoLayout 包含最后解码的帧。

有没有办法清除这个框架并将其设置为黑色?

我想重新使用这个播放器来再次使用 playStream 播放其他内容。

我已经尝试过的:

  • mMediaPlayer.detachViews() -> 不清除帧
  • mVideoLayout.removeAllViews() -> 清除帧,但下一个播放操作崩溃(如果我再次调用 attachViews())
  • 使 mVideoLayout 不可见,然后在流实际开始后可见 -> 在新流开始的一小段时间内,表面显示旧流

在媒体更改期间,片段将可见,带有片段事务的解决方案现在不适用于我。

【问题讨论】:

    标签: android surfaceview libvlc


    【解决方案1】:

    在停止流式传输后尝试分离视图:

    mMediaPlayer.getVLCVout().detachViews();
    

    祝你好运,

    【讨论】:

    • 不幸的是,它的结果与 mMediaPlayer.detachViews() 相同。谢谢!
    【解决方案2】:

    如果有人需要回答这个问题,你应该存储所有布局子

     for (int i = 0; i <  vlcVideoLayout.getChildCount(); i++) {
            View v = vlcVideoLayout.getChildAt(i);
            viewArrayList.add(v);
        }
    

    那么你应该使用

       vlcVideoLayout.removeAllViewsInLayout();
    

    要重用此播放器来播放其他内容,您应该将数组添加到 vlcVideoLayout

    【讨论】:

      猜你喜欢
      • 2013-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-18
      • 1970-01-01
      • 2016-09-17
      相关资源
      最近更新 更多