国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Android 音視頻開發(fā) - VideoView

這篇具有很好參考價(jià)值的文章主要介紹了Android 音視頻開發(fā) - VideoView。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

Android 音視頻開發(fā) - VideoView

本篇文章主要介紹下Android 中的VideoView.

1: VideoView簡介

VideoView是一個(gè)用于播放視頻的視圖組件,可以方便地在應(yīng)用程序中播放本地或網(wǎng)絡(luò)上的視頻文件。

VideoView可以直接在布局文件中使用,也可以在代碼中動(dòng)態(tài)創(chuàng)建。

它封裝了MediaPlayer和SurfaceView,提供了簡單的接口來控制視頻的播放和顯示。

它提供了一系列方法來控制視頻的播放、暫停、停止等操作,并且支持全屏播放和視頻控制器的顯示。

VideoView播放視頻非常簡單,只需要指定視頻的URL或本地路徑.

2: 使用

以下是VideoView的簡單使用:

2.1 布局

在XML布局文件中添加VideoView組件.

<VideoView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    android:id="@+id/videoview"
    />

2.2 設(shè)置視頻源

代碼如下:

videoView = findViewById(R.id.videoview);
videoView.setVideoPath("sdcard/test.mp4");

除了setVideoPath外,我們還可以調(diào)用:

  1. setVideoURI(Uri uri)
  2. setVideoURI(Uri uri, Map<String, String> headers)

當(dāng)然不管是setVideoPath或者setVideoURI實(shí)際都是執(zhí)行的setVideoURI(Uri uri, Map<String, String> headers).

源碼如下:

/**
 * Sets video path.
 *
 * @param path the path of the video.
 */
public void setVideoPath(String path) {
    setVideoURI(Uri.parse(path));
}

/**
 * Sets video URI.
 *
 * @param uri the URI of the video.
 */
public void setVideoURI(Uri uri) {
    setVideoURI(uri, null);
}

2.3 播放視頻

videoView.start();

我們可以看下start()的源碼:

@Override
public void start() {
    if (isInPlaybackState()) {
        mMediaPlayer.start();
        mCurrentState = STATE_PLAYING;
    }
    mTargetState = STATE_PLAYING;
}

可以看到實(shí)際上調(diào)用mMediaPlayer.start();另外設(shè)置了當(dāng)前的狀態(tài)為STATE_PLAYING.

這里直接調(diào)用了mMediaPlayer.start();那mMediaPlayer是什么時(shí)機(jī)初始化的呢?

查看源碼可以看到:

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();
    }
}

可以看到openVideo()

  1. release()方法釋放正在播放的視頻.
  2. 初始化mMediaPlayer,傳入U(xiǎn)ri,設(shè)置狀態(tài) STATE_PREPARING。
  3. attachMediaController()綁定MediaPlayer與VideoView。

最后openVideo()則是在setVideoURI(Uri uri, Map<String, String> headers)內(nèi)調(diào)用。

這樣其實(shí)已經(jīng)可以播放指定的視頻了。

下面的方法可選。

2.4 MediaController控制器

MediaController是一個(gè)用于控制媒體播放器的視圖組件。

MediaController的使用步驟如下:

  1. 創(chuàng)建一個(gè)MediaController對(duì)象:MediaController mediaController = new MediaController(context);
  2. 將MediaController與媒體播放器組件關(guān)聯(lián):mediaController.setMediaPlayer(mediaPlayer);
  3. 將MediaController添加到布局中:layout.addView(mediaController);
videoView.setMediaController(new MediaController(this));
videoView.start().

直接調(diào)用setMediaController,運(yùn)行后我們可以看到與之前直接調(diào)用start()的區(qū)別就是多了個(gè)控制器的顯示。其中包含一組常用的媒體控制按鈕,如播放/暫停、快進(jìn)/快退、前進(jìn)/后退等,并且可以與MediaPlayer或VideoView等媒體播放器組件進(jìn)行關(guān)聯(lián).

我們可以看下源碼:

public void setMediaController(MediaController controller) {
    if (mMediaController != null) {
        mMediaController.hide();
    }
    mMediaController = controller;
    attachMediaController();
}

可以看到做的操作如下:

  1. 如果存在mMediaController,則調(diào)用hide方法。
  2. 對(duì)mMediaController賦值
  3. attachMediaController

本文由博客一文多發(fā)平臺(tái) OpenWrite 發(fā)布!文章來源地址http://www.zghlxwxcb.cn/news/detail-844289.html

到了這里,關(guān)于Android 音視頻開發(fā) - VideoView的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包