本篇文章主要介绍下android 中的videoview.
1: videoview简介
videoview是一个用于播放视频的视图组件,可以方便地在应用程序中播放本地或网络上的视频文件。
videoview可以直接在布局文件中使用,也可以在代码中动态创建。
它封装了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 设置视频源
代码如下:
videoview = findviewbyid(r.id.videoview);
videoview.setvideopath("sdcard/test.mp4");
除了setvideopath外,我们还可以调用:
- setvideouri(uri uri)
- setvideouri(uri uri, map<string, string> headers)
当然不管是setvideopath或者setvideouri实际都是执行的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;
}
可以看到实际上调用mmediaplayer.start();另外设置了当前的状态为state_playing.
这里直接调用了mmediaplayer.start();那mmediaplayer是什么时机初始化的呢?
查看源码可以看到:
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()
- release()方法释放正在播放的视频.
- 初始化mmediaplayer,传入uri,设置状态 state_preparing。
- attachmediacontroller()绑定mediaplayer与videoview。
最后openvideo()则是在setvideouri(uri uri, map<string, string> headers)内调用。
这样其实已经可以播放指定的视频了。
下面的方法可选。
2.4 mediacontroller控制器
mediacontroller是一个用于控制媒体播放器的视图组件。
mediacontroller的使用步骤如下:
- 创建一个mediacontroller对象:mediacontroller mediacontroller = new mediacontroller(context);
- 将mediacontroller与媒体播放器组件关联:mediacontroller.setmediaplayer(mediaplayer);
- 将mediacontroller添加到布局中:layout.addview(mediacontroller);
videoview.setmediacontroller(new mediacontroller(this)); videoview.start().
直接调用setmediacontroller,运行后我们可以看到与之前直接调用start()的区别就是多了个控制器的显示。其中包含一组常用的媒体控制按钮,如播放/暂停、快进/快退、前进/后退等,并且可以与mediaplayer或videoview等媒体播放器组件进行关联.
我们可以看下源码:
public void setmediacontroller(mediacontroller controller) {
if (mmediacontroller != null) {
mmediacontroller.hide();
}
mmediacontroller = controller;
attachmediacontroller();
}
可以看到做的操作如下:
- 如果存在mmediacontroller,则调用hide方法。
- 对mmediacontroller赋值
- attachmediacontroller
到此这篇关于android中videoview音视频开发的实现的文章就介绍到这了,更多相关android videoview音视频内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论