精华内容
下载资源
问答
  • 2021-10-14 14:48:46

    VideoView


    一、VideoView简介

    在Android中,播放视频有2种方式,第一种方式是使用MediaPlayer结合SurfaceView来播放,通过MediaPlayer来控制视频的播放、暂停、进度等,而通过SurfaceView来显示视频内容;第二种方式是使用VideoView来播放,这个类其实也是**继承了SurfaceView类,并且实现了MediaController.MediaPlayerController这个用于控制媒体播放的接口,另外在VideoView上还有一个用于对媒体播放进行控制的面板,包括快进、快退、播放、暂停按钮以及一个进度条。使用VideoView播放视频的好处是简单因为它已经帮我们实现了SurfaceView以及控制方法,开发过程中只需直接拿来使用就可以了,但它的缺点是不够灵活**。而是用MediaPlayer结合SurfaceView来播放视频的话,好处是可以更灵活的对其进行自定义,缺点是难度较大。


    二、VideoView常用方法

    int getCurrentPosition():获取当前播放的位置。
    int getDuration():获取当前播放视频的总长度。
    boolean isPlaying():当前VideoView是否在播放视频。
    boolean canPause();  //是否可以暂停
    void pause():暂停void seekTo(int msec):从第几毫秒开始播放(使用seekTo时该视频需要在播放状态)。
    void resume():重新播放。
    void setVideoPath(String path):以文件路径的方式设置VideoView播放的视频源。
    void setVideoURI(Uri uri):以Uri的方式设置VideoView播放的视频源,可以是网络Uri或本地Urivoid start():开始播放。
    mVideoView.stopPlayback();停止播放视频,并且释放
    mVideoView.suspend();在任何状态下释放媒体播放器
    mVideoView.canSeekForward();视频是否可以向前调整播放位置
    mVideoView.canSeekBackward();视频是否可以向后调整播放位置
    mVideoView.getBufferPercentage();获取视频缓冲百分比
    mVideoView.resolveAdjustedSize();获取自动解析后VideoView的大小
    mVideoView.onKeyDown();发送物理按键值
    setMediaController(MediaController controller):设置MediaController控制器。
    setOnCompletionListener(MediaPlayer.onCompletionListener l):监听播放完成的事件。
    setOnErrorListener(MediaPlayer.OnErrorListener l):监听播放发生错误时候的事件。
    如果方法处理了错误,则为返回true,不会弹出默认的错误信息;否则为false。返回false或根本没有OnErrorListener,将导致调用OnCompletionListenersetOnPreparedListener(MediaPlayer.OnPreparedListener l)::监听视频装载完成的事件。
    setOnTouchListener(View.OnTouchListener l) :监听videoview的点击事件
    
    
    public class videoViewActivity extends AppCompatActivity implements View.OnClickListener {
      @Override
      protected void oncreate(@Nullable Bundle savedInstancestate) {
        super.oncreate( savedInstancestate);
        setcontentview(R.layout.activity_videoview);
        videoview videoview = findviewById(R.id.videoview);
        MediaController mediaController = new Mediacontroller(this);
        //为MediaController设置上一个视频或者下一个视频按钮的监听
        mediaController.setPrevNextListeners( this, this);
        videoview.setMediacontroller(mediacontroller);
        videoView.setVideoPath(new File(getExternalFilesDir("")"a.mp4").getAbsolutePath());
        videoview.start();
      }
    
      Override
      public void onclick(View v) {
        Log.i( tag: "VideoView" , msg: "");
      }
    }
    
    

    在这里插入图片描述
    在这里插入图片描述

    三、MediaController

    Media Controller类为我们提供了一个悬浮的操作栏,包含了播放,暂停,快进,快退,上一个,下一个等功能键。还有拖动进度条至某一处也可以实现。在使用前VideoView和MeidaController需要相互指定控件。

    Mdedia Controller类包含的内置方法有:

    boolean isShowing()
    
    当前悬浮控制栏是否显示。
    
    void setMediaPlayer(MediaController.MediaPlayerControl player)
    
    设置控制的组件
    
    void hide()
    
    隐藏MeidaController
    
    void show()
    
    显示MeidaController
    
    void show(int timeout)
    
    设置MidiaController显示的时间,以毫秒计算。如果设置为0则一直到调用hide()方法隐藏
    
    void setPrevNextListeners(View.OnClickListener next,View.OnClickListener prev)
    
    设置上一个视频下一个视频的切换事件
    

    默认情况下,Media Controller悬浮显示3s后隐藏,触摸响应的VideoView呼出。默认上一个,下一个按钮隐藏。


    四、VideoView源码解读

    VideoView extends SurfaceView implements MediaPlayerControl,VideoView继承SurfaceView来进行视频界面的展示,MediaPlayerControl其实就是定义的一些start()、pause()等接口,VideoView在内部实际上就是封装了MediaPlayer

    private void openVideo() {
            if (mUri == null || mSurfaceHolder == null) {
                // not ready for playback just yet, will try again later
                return;
            }
            // we shouldn't clear the target state, because somebody might have
            // called start() previously
            release(false);
    
            if (mAudioFocusType != AudioManager.AUDIOFOCUS_NONE) {
                // TODO this should have a focus listener
                mAudioManager.requestAudioFocus(null, mAudioAttributes, mAudioFocusType, 0 /*flags*/);
            }
    
            try {
                mMediaPlayer = new MediaPlayer();
                // TODO: create SubtitleController in MediaPlayer, but we need
                // a context for the subtitle renderers
                final Context context = getContext();
                final SubtitleController controller = new SubtitleController(
                        context, mMediaPlayer.getMediaTimeProvider(), mMediaPlayer);
                controller.registerRenderer(new WebVttRenderer(context));
                controller.registerRenderer(new TtmlRenderer(context));
                controller.registerRenderer(new Cea708CaptionRenderer(context));
                controller.registerRenderer(new ClosedCaptionRenderer(context));
                mMediaPlayer.setSubtitleAnchor(controller, this);
    
                if (mAudioSession != 0) {
                    mMediaPlayer.setAudioSessionId(mAudioSession);
                } else {
                    mAudioSession = mMediaPlayer.getAudioSessionId();
                }
                mMediaPlayer.setOnPreparedListener(mPreparedListener);
                mMediaPlayer.setOnVideoSizeChangedListener(mSizeChangedListener);
                mMediaPlayer.setOnCompletionListener(mCompletionListener);
                mMediaPlayer.setOnErrorListener(mErrorListener);
                mMediaPlayer.setOnInfoListener(mInfoListener);
                mMediaPlayer.setOnBufferingUpdateListener(mBufferingUpdateListener);
                mCurrentBufferPercentage = 0;
                mMediaPlayer.setDataSource(mContext, mUri, mHeaders);
                mMediaPlayer.setDisplay(mSurfaceHolder);
                mMediaPlayer.setAudioAttributes(mAudioAttributes);
                mMediaPlayer.setScreenOnWhilePlaying(true);
                mMediaPlayer.prepareAsync();
    
                for (Pair<InputStream, MediaFormat> pending: mPendingSubtitleTracks) {
                    try {
                        mMediaPlayer.addSubtitleSource(pending.first, pending.second);
                    } catch (IllegalStateException e) {
                        mInfoListener.onInfo(
                                mMediaPlayer, MediaPlayer.MEDIA_INFO_UNSUPPORTED_SUBTITLE, 0);
                    }
                }
    
                // we don't set the target state here either, but preserve the
                // target state that was there before.
                mCurrentState = STATE_PREPARING;
                attachMediaController();
            } catch (IOException ex) {
                Log.w(TAG, "Unable to open content: " + mUri, ex);
                mCurrentState = STATE_ERROR;
                mTargetState = STATE_ERROR;
                mErrorListener.onError(mMediaPlayer, MediaPlayer.MEDIA_ERROR_UNKNOWN, 0);
                return;
            } catch (IllegalArgumentException ex) {
                Log.w(TAG, "Unable to open content: " + mUri, ex);
                mCurrentState = STATE_ERROR;
                mTargetState = STATE_ERROR;
                mErrorListener.onError(mMediaPlayer, MediaPlayer.MEDIA_ERROR_UNKNOWN, 0);
                return;
            } finally {
                mPendingSubtitleTracks.clear();
            }
        }
    

    public interface MediaPlayerControl {
            void    start();
            void    pause();
            int     getDuration();
            int     getCurrentPosition();
            void    seekTo(int pos);
            boolean isPlaying();
            int     getBufferPercentage();
            boolean canPause();
            boolean canSeekBackward();
            boolean canSeekForward();
    
            /**
             * Get the audio session id for the player used by this VideoView. This can be used to
             * apply audio effects to the audio track of a video.
             * @return The audio session, or 0 if there was an error.
             */
            int     getAudioSessionId();
        }
    
    更多相关内容
  • 最近要使用播放器做一个简单的视频播放功能,开始学习VideoView,在横竖屏切换的时候碰到了点麻烦,不过在查阅资料后总算是解决了。在写VideoView播放视频时候定义控制的代码全写在Actvity里了,写完一看我靠代码好乱...
  • VideoView类将视频的显示和控制集于一身,我们可以借助它完成一个简易的视频播放器。VideoView和MediaPlayer也比较相似。 二、VideoView的使用方法 它主要有以下几种常用方法 步骤: 1.指定视频文件的路径, 2....
  • 讲师用的是自定义VideoView,重写onMeasure方法,因为原生的VideoView在那情况下不能实现全屏播放。当时没有深入研究,现在补回来。 用的是36氪之前的视频(608×1080)和Genymotion中的Google Nexus 5(1080×1920...
  • 最近的项目中需要用到VideoView实现视频播放,自己花了一天多时间才能出来,有点想打自己再见,在学校的时候没好好学。 使用VideoView播放视频的步骤如下: 1) 在界面布局文件中定义VideoView组件,或在程序中创建...
  • 由VLC驱动的Android VideoView 什么 VlcVideoView类似于本机VideoView ,但依赖进行播放。 因此,与内置播放器相比,它支持更广泛的协议,格式和编解码器。 但是缺点是它很大:演示应用程序与所有本机库之间的距离...
  • 通过VideoView播放视频的步骤: 1、在界面布局文件中定义VideoView组件,或在程序中创建VideoView组件 2、调用VideoView的如下两个方法来加载指定的视频 (1)setVidePath(String path):加载path文件代表的视频 (2...
  • 使用VideoView播放MP4 播放示例 实现简单的播放功能,播放手机本地的MP4文件。不依赖任何第三方框架,不添加任何防腐剂。 添加一个系统自带的控制条。 相关代码请参阅: ...
  • 本文实例讲述了Android编程实现VideoView循环播放功能的方法。分享给大家供大家参考,具体如下: package com.hangcheng; import com.example.bdcustomer_demo.R; import com.hangcheng.view.MyVideoView; import ...
  • 主要为大家详细介绍了Android原生视频播放VideoView的使用,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 主要为大家详细介绍了Android videoview抢占焦点的处理方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 1、效果展示 2、布局文件 <?xml version=1.0 encoding=utf-8?> ... android:layout_width=match_parent android:layout_height=match_parent android:paddingBottom=@dimen/activity_ve
  • Android播放视频,包含系统自带VideoView控件,和自定义VideoView控件,可全屏播放,案例包含了本地视频和网络视频。 1:自定义VideoView控件 2:布局代码 3:Activity代码: 4:网络权限 5:效果图 小结:其中...
  • android studio VideoView本地视频播放
  • 本节使用系统的示例类VideoView继续SurfaceView类相关内容的讲解,以让大家能更深入理解Android系统中图形绘制基础类的实现原理。也许你会发现无法改变VideoView类的控制方面,我们可以通过重构VideoView类来实现...
  • Android播放视频,包含系统自带VideoView控件,和自定义VideoView控件,可全屏播放,案例包含了本地视频和网络视频。
  • 本文实例为大家分享了VideoView原生自定义视频播放器的具体代码,供大家参考,具体内容如下 项目用到的技术点和亮点 VideoView封装视频播放工具类 自定义视频控制面板 手势识别器的使用 1. VideoView封装视频播放...
  • 为了在Android应用中播放视频,Android提供了VideoView控件,它就是一个位于android.widget包下的控件,它的作用与ImageView类似,只是ImageView用于显示图片,而VideoView用于播放视频。 使用VideoView播放视频的...
  • VideoView视频播放

    2017-08-30 17:49:34
    本Demo实现了自定义样式的MediaController以及结合VideoView的半屏视频播放和全屏视频播放
  • 监听视频缓冲和显示实时下载速度,以及视频大小屏切换,其中使用的MyVideoView,继承自VideoView,除了能随意指定大小,别的都一样,换成VideoView也是一样使用的
  • Android studio 的videoView播放网络视频 demo,直接把项目导入 工程中运行可用。
  • 我们可以试想ImageView能显示图片,而VideoView就是用来显示视频的。 使用VideoView播放视频的步骤如下 【1】在界面布局中定义VideoView <LinearLayout xmlns:android=...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,285
精华内容 4,514
关键字:

videoview