android vlc rtsp

/**
 * created by XuTi on 2019/5/20 14:00
 */
public class VlcModel {
    private static final String TAG = VlcModel.class.getSimpleName();

    private LibVLC      mLibVLC;
    private MediaPlayer mMediaPlayer;

    private String mUriString;

    private SurfaceView mSurfaceView = null;

    private MediaPlayer.EventListener mEventListener;

    private int mPortraitDisplayWidth;
    private int mPortraitDisplayHeight;
    private int mLandscapeDisplayWidth;
    private int mLandscapeDisplayHeight;

    public VlcModel(String uriString,MediaPlayer.EventListener eventListener) {
        mUriString = uriString;

        mEventListener = eventListener;
    }

    private void init() {
        if (mMediaPlayer == null || mMediaPlayer.isReleased()) {
            final ArrayList<String> args = new ArrayList<>();
            args.add("-vvv");
            mLibVLC = new LibVLC(mSurfaceView.getContext(), args);

            mMediaPlayer = new MediaPlayer(mLibVLC);
        }
    }

    public void onCreate(SurfaceView surfaceView) {
        mSurfaceView = surfaceView;

        init();

        {
            Context        context       = surfaceView.getContext();
            WindowManager  windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
            DisplayMetrics dm            = new DisplayMetrics();
            windowManager.getDefaultDisplay().getMetrics(dm);

            int screenWidth  = dm.widthPixels;
            int screenHeight = dm.heightPixels;

            int portraitDisplayWidth;
            int portraitDisplayHeight;
            int landscapeDisplayWidth;
            int landscapeDisplayHeight;

            if (context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
                portraitDisplayWidth = screenWidth;
                landscapeDisplayWidth = screenHeight;
                landscapeDisplayHeight = screenWidth;
            } else {
                portraitDisplayWidth = screenHeight;
                landscapeDisplayWidth = screenWidth;
                landscapeDisplayHeight = screenHeight;
            }
            portraitDisplayHeight = portraitDisplayWidth * 9 / 16;

            mPortraitDisplayWidth = portraitDisplayWidth;
            mPortraitDisplayHeight = portraitDisplayHeight;
            mLandscapeDisplayWidth = landscapeDisplayWidth;
            mLandscapeDisplayHeight = landscapeDisplayHeight;
        }
    }

    public void attachViews() {
        init();

        mMediaPlayer.setEventListener(mEventListener);
        final IVLCVout vlcVout = mMediaPlayer.getVLCVout();
        if (!vlcVout.areViewsAttached()) {
            vlcVout.addCallback(mCallback);
            vlcVout.setVideoView(mSurfaceView);
            vlcVout.attachViews(mOnNewVideoLayoutListener);

            play();
        }
    }

    public void detachViews() {
        if (mMediaPlayer != null && mMediaPlayer.getVLCVout() != null &&mMediaPlayer.getVLCVout().areViewsAttached()) {
            mMediaPlayer.stop();

            mMediaPlayer.getVLCVout().detachViews();
        }
    }

    public void onDestroy() {
        if (mMediaPlayer != null&&!mMediaPlayer.isReleased()) {
            mMediaPlayer.release();
        }
        if (mLibVLC != null&&!mLibVLC.isReleased()) {
            mLibVLC.release();
        }
    }

    private IVLCVout.Callback mCallback = new IVLCVout.Callback() {
        @Override
        public void onSurfacesCreated(IVLCVout vlcVout) {
        }

        @Override
        public void onSurfacesDestroyed(IVLCVout vlcVout) {
        }
    };

    private IVLCVout.OnNewVideoLayoutListener mOnNewVideoLayoutListener = new IVLCVout.OnNewVideoLayoutListener() {
        @Override
        public void onNewVideoLayout(IVLCVout vlcVout, int width, int height, int visibleWidth, int visibleHeight, int sarNum, int sarDen) {
//            updateVideoSurfaces();
        }
    };

    public void play() {
        if (mMediaPlayer.getVLCVout().areViewsAttached()) {
            final Media media = new Media(mLibVLC, Uri.parse(mUriString));
            media.setHWDecoderEnabled(true, true);
            int cache = 220;
            media.addOption(":network-caching=" + cache);
            media.addOption(":file-caching=" + cache);
            media.addOption(":live-caching=" + cache);
            media.addOption(":sout-mux-caching=" + cache);
            media.addOption(":codec=mediacodec,iomx,all");

//            media.addOption(":clock-jitter=400");
//            media.addOption(":clock-synchro=500");

            //decoder all media type
//            media.addOption(":codec=ALL");


            mMediaPlayer.setMedia(media);
            mMediaPlayer.play();
        }
    }

    /**
     * 横竖屏切换的时候调用
     */
    public void updateVideoSurfaces() {

        final boolean isPortrait = mSurfaceView.getContext().getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT;

        double displayWidth;
        double displayHeight;
        String aspectRatio;
        if (isPortrait) {
            displayWidth = mPortraitDisplayWidth;
            displayHeight = mPortraitDisplayHeight;
        } else {
            displayWidth = mLandscapeDisplayWidth;
            displayHeight = mLandscapeDisplayHeight;

        }

        aspectRatio = displayWidth + ":" + displayHeight;
        mMediaPlayer.getVLCVout().setWindowSize((int) displayWidth, (int) displayHeight);
        mMediaPlayer.setAspectRatio(aspectRatio);
        mMediaPlayer.setScale(0);

        ViewGroup.LayoutParams layoutParams = mSurfaceView.getLayoutParams();
        layoutParams.width = (int) displayWidth;
        layoutParams.height = (int) displayHeight;
        mSurfaceView.setLayoutParams(layoutParams);
    }

    public int getLandscapeDisplayHeight() {
        return mLandscapeDisplayHeight;
    }

    /**
     * 横屏全屏时,Build.VERSION.SDK_INT >= Build.VERSION_CODES.M 才能使状态栏漂浮在Activity之上,否则就得减去状态栏的高度
     * @param landscapeDisplayHeight
     */
    public void setLandscapeDisplayHeight(int landscapeDisplayHeight) {
        mLandscapeDisplayHeight = landscapeDisplayHeight;
    }
}

 

/**
 * created by XuTi on 2019/5/23 9:29
 */
public class PlayActivity extends AppCompatActivity {

    private VlcModel mVlcModel;
    private Handler  mHandler = MyThreadUtils.getThreadHandler();

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_play);


        mVlcModel = new VlcModel("rtsp://192.168.1.254/xxxx.mov",mEventListener);

        mVlcModel.onCreate((SurfaceView) findViewById(R.id.surfaceV));
        mVlcModel.updateVideoSurfaces();
    }

    @Override
    protected void onResume() {
        super.onResume();
        mHandler.post(new Runnable() {
            @Override
            public void run() {
                mVlcModel.attachViews();
            }
        });
    }

    @Override
    protected void onPause() {
        super.onPause();
        mHandler.post(new Runnable() {
            @Override
            public void run() {
                mVlcModel.detachViews();
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mHandler.post(new Runnable() {
            @Override
            public void run() {
                mVlcModel.onDestroy();
            }
        });
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        mVlcModel.updateVideoSurfaces();
    }

    MediaPlayer.EventListener mEventListener = new MediaPlayer.EventListener() {
        @Override
        public void onEvent(MediaPlayer.Event event) {
            switch (event.type) {
                case MediaPlayer.Event.EndReached:
                    LogUtils.d("The connection is interrupted, reconnected");
                    mVlcModel.play();
                    break;
                case MediaPlayer.Event.Playing:
                    LogUtils.d("The connection is successful and starts playing");
                    ToastUtils.showShort("playing");
                    break;
                case MediaPlayer.Event.Paused:
                    break;
                case MediaPlayer.Event.Stopped:
                    break;
                case MediaPlayer.Event.Opening:
                    LogUtils.d("Connecting, please wait ...");
                    ToastUtils.showShort("waitting");
                    break;
                case MediaPlayer.Event.PositionChanged:
                    break;
                case MediaPlayer.Event.EncounteredError:
                    LogUtils.d("Connection failed, reconnected");
                    mVlcModel.play();
                    break;
                default:
                    break;
            }
        }
    };
}

 

多语言切换时,activity中onConfigurationChanged处理多语言,另外一篇讲多语言的已解决

发布了61 篇原创文章 · 获赞 4 · 访问量 3万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览