美文网首页Android
rtsp协议 通过vlc实现播放

rtsp协议 通过vlc实现播放

作者: 树新蜜蜂 | 来源:发表于2019-12-16 15:15 被阅读0次

    最近写了一个rtsp的一个视频流播放,废话不多说直接上代码
    MainActivity

    public class MainActivity extends AppCompatActivity implements IVLCVout.OnNewVideoLayoutListener, View.OnClickListener {
        private static final boolean USE_SURFACE_VIEW = true;
        private static final boolean ENABLE_SUBTITLES = true;
        private static final String TAG = "tag";
        private static final String ASSET_FILENAME = "bbb.m4v";
        private static final int SURFACE_BEST_FIT = 0;
        private static final int SURFACE_FIT_SCREEN = 1;
        private static final int SURFACE_FILL = 2;
        private static final int SURFACE_16_9 = 3;
        private static final int SURFACE_4_3 = 4;
        private static final int SURFACE_ORIGINAL = 5;
        private static String MYURL="";
        private static int CURRENT_SIZE = SURFACE_BEST_FIT;
        private int count=0;
        private FrameLayout mVideoSurfaceFrame = null;
        private SurfaceView mVideoSurface = null;
        private SurfaceView mSubtitlesSurface = null;
        private TextureView mVideoTexture = null;
        private View mVideoView = null;
    
        private final Handler mHandler = new Handler();
        private View.OnLayoutChangeListener mOnLayoutChangeListener = null;
    
        private LibVLC mLibVLC = null;
        private MediaPlayer mMediaPlayer = null;
        private int mVideoHeight = 0;
        private int mVideoWidth = 0;
        private int mVideoVisibleHeight = 0;
        private int mVideoVisibleWidth = 0;
        private int mVideoSarNum = 0;
        private int mVideoSarDen = 0;
        private Button btn;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            setContentView(R.layout.activity_main);
            Log.i(TAG, "onCreate:准备 "+ SystemClock.elapsedRealtimeNanos() );
            final ArrayList<String> args = new ArrayList<>();
            args.add("-vvv");
            args.add("--ignore-config");
            args.add("--rtsp-tcp");
            args.add("--network-caching=200");
            args.add("--ipv4-timeout=1000");
            args.add("--rtsp-frame-buffer-size=10000");
            args.add(":sout-rtp-proto={dccp,sctp,tcp,udp,udplite}");//RTSP采用TCP传输方式
            mLibVLC = new LibVLC(this, args);
            mMediaPlayer = new MediaPlayer(mLibVLC);
            btn = findViewById(R.id.btn);
            btn.setOnClickListener(this);
            mVideoSurfaceFrame = (FrameLayout) findViewById(R.id.video_surface_frame);
            if (USE_SURFACE_VIEW) {
                ViewStub stub = (ViewStub) findViewById(R.id.surface_stub);
                mVideoSurface = (SurfaceView) stub.inflate();
                if (ENABLE_SUBTITLES) {
                    stub = (ViewStub) findViewById(R.id.subtitles_surface_stub);
                    mSubtitlesSurface = (SurfaceView) stub.inflate();
                    mSubtitlesSurface.setZOrderMediaOverlay(true);
                    mSubtitlesSurface.getHolder().setFormat(PixelFormat.TRANSLUCENT);
                }
                mVideoView = mVideoSurface;
            }
            else
            {
                ViewStub stub = (ViewStub) findViewById(R.id.texture_stub);
                mVideoTexture = (TextureView) stub.inflate();
                mVideoView = mVideoTexture;
            }
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            mMediaPlayer.release();
            mLibVLC.release();
        }
    
        @Override
        protected void onStart() {
            super.onStart();
    
            final IVLCVout vlcVout = mMediaPlayer.getVLCVout();
            if (mVideoSurface != null) {
                vlcVout.setVideoView(mVideoSurface);
                if (mSubtitlesSurface != null)
                    vlcVout.setSubtitlesView(mSubtitlesSurface);
            }
            else
                vlcVout.setVideoView(mVideoSurface);
            vlcVout.attachViews(this);
            if(count%2==0){
                MYURL="http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8";
            }else{
                MYURL="http://ivi.bupt.edu.cn/hls/cctv6hd.m3u8";
            }
    
            final Media media = new Media(mLibVLC, Uri.parse(MYURL));
    //        final Media media = new Media(mLibVLC, Uri.parse("http://ivi.bupt.edu.cn/hls/cctv6hd.m3u8"));
            mMediaPlayer.setMedia(media);
            media.release();
            mMediaPlayer.play();
            Log.i(TAG, "onCreate:开始播放 "+ SystemClock.elapsedRealtimeNanos());
    
    
            if (mOnLayoutChangeListener == null) {
                mOnLayoutChangeListener = new View.OnLayoutChangeListener() {
                    private final Runnable mRunnable = new Runnable() {
                        @Override
                        public void run() {
                            updateVideoSurfaces();
                        }
                    };
                    @Override
                    public void onLayoutChange(View v, int left, int top, int right,
                                               int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
                        if (left != oldLeft || top != oldTop || right != oldRight || bottom != oldBottom) {
                            mHandler.removeCallbacks(mRunnable);
                            mHandler.post(mRunnable);
                        }
                    }
                };
            }
            mVideoSurfaceFrame.addOnLayoutChangeListener(mOnLayoutChangeListener);
        }
    
        @Override
        protected void onStop() {
            super.onStop();
    
            if (mOnLayoutChangeListener != null) {
                mVideoSurfaceFrame.removeOnLayoutChangeListener(mOnLayoutChangeListener);
                mOnLayoutChangeListener = null;
            }
    
            mMediaPlayer.stop();
    
            mMediaPlayer.getVLCVout().detachViews();
        }
    
        private void changeMediaPlayerLayout(int displayW, int displayH) {
            /* Change the video placement using the MediaPlayer API */
            switch (CURRENT_SIZE) {
                case SURFACE_BEST_FIT:
                    mMediaPlayer.setAspectRatio(null);
                    mMediaPlayer.setScale(0);
                    break;
                case SURFACE_FIT_SCREEN:
                case SURFACE_FILL: {
                    Media.VideoTrack vtrack = mMediaPlayer.getCurrentVideoTrack();
                    if (vtrack == null)
                        return;
                    final boolean videoSwapped = vtrack.orientation == Media.VideoTrack.Orientation.LeftBottom
                            || vtrack.orientation == Media.VideoTrack.Orientation.RightTop;
                    if (CURRENT_SIZE == SURFACE_FIT_SCREEN) {
                        int videoW = vtrack.width;
                        int videoH = vtrack.height;
    
                        if (videoSwapped) {
                            int swap = videoW;
                            videoW = videoH;
                            videoH = swap;
                        }
                        if (vtrack.sarNum != vtrack.sarDen)
                            videoW = videoW * vtrack.sarNum / vtrack.sarDen;
    
                        float ar = videoW / (float) videoH;
                        float dar = displayW / (float) displayH;
    
                        float scale;
                        if (dar >= ar)
                            scale = displayW / (float) videoW; /* horizontal */
                        else
                            scale = displayH / (float) videoH; /* vertical */
                        mMediaPlayer.setScale(scale);
                        mMediaPlayer.setAspectRatio(null);
                    } else {
                        mMediaPlayer.setScale(0);
                        mMediaPlayer.setAspectRatio(!videoSwapped ? ""+displayW+":"+displayH
                                : ""+displayH+":"+displayW);
                    }
                    break;
                }
                case SURFACE_16_9:
                    mMediaPlayer.setAspectRatio("16:9");
                    mMediaPlayer.setScale(0);
                    break;
                case SURFACE_4_3:
                    mMediaPlayer.setAspectRatio("4:3");
                    mMediaPlayer.setScale(0);
                    break;
                case SURFACE_ORIGINAL:
                    mMediaPlayer.setAspectRatio(null);
                    mMediaPlayer.setScale(1);
                    break;
            }
        }
    
        private void updateVideoSurfaces() {
            int sw = getWindow().getDecorView().getWidth();
            int sh = getWindow().getDecorView().getHeight();
    
            // sanity check
            if (sw * sh == 0) {
                //Log.e(TAG, "Invalid surface size");
                return;
            }
    
            mMediaPlayer.getVLCVout().setWindowSize(sw, sh);
    
            ViewGroup.LayoutParams lp = mVideoView.getLayoutParams();
            if (mVideoWidth * mVideoHeight == 0) {
                /* Case of OpenGL vouts: handles the placement of the video using MediaPlayer API */
                lp.width  = ViewGroup.LayoutParams.MATCH_PARENT;
                lp.height = ViewGroup.LayoutParams.MATCH_PARENT;
                mVideoView.setLayoutParams(lp);
                lp = mVideoSurfaceFrame.getLayoutParams();
                lp.width  = ViewGroup.LayoutParams.MATCH_PARENT;
                lp.height = ViewGroup.LayoutParams.MATCH_PARENT;
                mVideoSurfaceFrame.setLayoutParams(lp);
                changeMediaPlayerLayout(sw, sh);
                return;
            }
    
            if (lp.width == lp.height && lp.width == ViewGroup.LayoutParams.MATCH_PARENT) {
                /* We handle the placement of the video using Android View LayoutParams */
                mMediaPlayer.setAspectRatio(null);
                mMediaPlayer.setScale(0);
            }
    
            double dw = sw, dh = sh;
            final boolean isPortrait = getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT;
    
            if (sw > sh && isPortrait || sw < sh && !isPortrait) {
                dw = sh;
                dh = sw;
            }
    
            // compute the aspect ratio
            double ar, vw;
            if (mVideoSarDen == mVideoSarNum) {
                /* No indication about the density, assuming 1:1 */
                vw = mVideoVisibleWidth;
                ar = (double)mVideoVisibleWidth / (double)mVideoVisibleHeight;
            } else {
                /* Use the specified aspect ratio */
                vw = mVideoVisibleWidth * (double)mVideoSarNum / mVideoSarDen;
                ar = vw / mVideoVisibleHeight;
            }
    
            // compute the display aspect ratio
            double dar = dw / dh;
    
            switch (CURRENT_SIZE) {
                case SURFACE_BEST_FIT:
                    if (dar < ar)
                        dh = dw / ar;
                    else
                        dw = dh * ar;
                    break;
                case SURFACE_FIT_SCREEN:
                    if (dar >= ar)
                        dh = dw / ar; /* horizontal */
                    else
                        dw = dh * ar; /* vertical */
                    break;
                case SURFACE_FILL:
                    break;
                case SURFACE_16_9:
                    ar = 16.0 / 9.0;
                    if (dar < ar)
                        dh = dw / ar;
                    else
                        dw = dh * ar;
                    break;
                case SURFACE_4_3:
                    ar = 4.0 / 3.0;
                    if (dar < ar)
                        dh = dw / ar;
                    else
                        dw = dh * ar;
                    break;
                case SURFACE_ORIGINAL:
                    dh = mVideoVisibleHeight;
                    dw = vw;
                    break;
            }
    
            // set display size
            lp.width  = (int) Math.ceil(dw * mVideoWidth / mVideoVisibleWidth);
            lp.height = (int) Math.ceil(dh * mVideoHeight / mVideoVisibleHeight);
            mVideoView.setLayoutParams(lp);
            if (mSubtitlesSurface != null)
                mSubtitlesSurface.setLayoutParams(lp);
    
            // set frame size (crop if necessary)
            lp = mVideoSurfaceFrame.getLayoutParams();
            lp.width = (int) Math.floor(dw);
            lp.height = (int) Math.floor(dh);
            mVideoSurfaceFrame.setLayoutParams(lp);
    
            mVideoView.invalidate();
            if (mSubtitlesSurface != null)
                mSubtitlesSurface.invalidate();
        }
    
        @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
        @Override
        public void onNewVideoLayout(IVLCVout vlcVout, int width, int height, int visibleWidth, int visibleHeight, int sarNum, int sarDen) {
            mVideoWidth = width;
            mVideoHeight = height;
            mVideoVisibleWidth = visibleWidth;
            mVideoVisibleHeight = visibleHeight;
            mVideoSarNum = sarNum;
            mVideoSarDen = sarDen;
            updateVideoSurfaces();
        }
    
        @Override
        public void onClick(View v) {
    
            count++;
            onStop();
            onStart();
    
        }
    }
    

    activity_main

    
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:keepScreenOn="true"
        android:background="@android:color/background_dark"
        >
    
        <FrameLayout
            android:id="@+id/video_surface_frame"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center"
            android:foregroundGravity="clip_horizontal|clip_vertical"
            tools:ignore="true">
    
            <ViewStub
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout="@layout/surface_view"
                android:id="@+id/surface_stub" />
    
            <ViewStub
                android:layout_width="1dp"
                android:layout_height="1dp"
                android:layout="@layout/surface_view"
                android:id="@+id/subtitles_surface_stub" />
    
            <ViewStub
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout="@layout/texture_view"
                android:id="@+id/texture_stub" />
            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/btn"
                android:text="切换"></Button>
        </FrameLayout>
    </FrameLayout>
    
    

    surface_view

    <SurfaceView xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </SurfaceView>
    

    texture_view

    <TextureView xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </TextureView>
    
    效果图

    ps:码字不易 希望关注点赞

    相关文章

      网友评论

        本文标题:rtsp协议 通过vlc实现播放

        本文链接:https://www.haomeiwen.com/subject/nvhdnctx.html