Android Studio 实现将视频资源嵌入APP中

Android Studio 实现将视频资源嵌入APP中

(直取思路跟代码跳转文末,如有帮助勿忘分享点赞奥!你的支持是我更新的动力!)

在正文之前首先想给大家引入安卓数据存储路径
  • 内部存储internal storage:==内部存储(internal storage)不是内存。==内部存储位于系统中很特殊的一个位置,如果你想将文件存储于内部存储中,那么文件默认只能被你的应用访问到,且一个应用所创建的所有文件都在和应用包名相同的目录下。当一个应用卸载之后,内部存储中的这些文件也被删除。从技术上来讲如果你在创建内部存储文件的时候将文件属性设置成可读,其他app能够访问自己应用的数据,前提是他知道你这个应用的包名,如果一个文件的属性是私有(private),那么即使知道包名其他应用也无法访问。 内部存储空间十分有限,因而显得可贵,另外,它也是系统本身和系统应用程序主要的数据存储所在地,一旦内部存储空间耗尽,手机也就无法使用了。所以对于内部存储空间,我们要尽量避免使用。Shared Preferences和SQLite数据库都是存储在内部存储空间上的。

    • 存储路径:一般在data/data/包名/ 下的文件
  • 外部存储external storage:我们很容易认为机身固有存储是内部存储,而扩展的T卡是外部存储。比如我们任务16GB版本的Nexus 4有16G的内部存储,普通消费者可以这样理解,但是安卓的编程中不能,这16GB仍然是外部存储。安卓的早期设备,那个时候的设备内部存储确实是固定的,而外部存储确实是可以像U盘一样移动的。但是在后来的设备中,很多中高端机器都将自己的机身存储扩展到了8G以上,他们将存储在概念上分成了"内部internal" 和"外部external" 两部分,但其实都在手机内部。

    • 存储路径: / sd卡根目录/Android/data// 下的文件,不同机型具体路径有差异

那么,问题来了,为什么小编要花时间给大家介绍安卓数据存储路径呢?

那是因为Android提供了常见的视频的编码、解码机制。使用Android自带的MediaPlayer、MediaController等类可以很方便的实现视频播放的功能。支持的视频格式有MP4和3GP等。这些多媒体数据可以来自于Android应用的资源文件,也可以来自于外部存储器上的文件,甚至可以是来自于网络上的文件流。

好吧,其实是因为网上大多数实现安卓的视频播放都是基于将现有资源上传至SD卡,如图:

在这里插入图片描述

下面来说一下视频播放的几种实现方式:

1、MediaController+VideoView实现方式

这种方式是最简单的实现方式。VideoView继承了SurfaceView同时实现了MediaPlayerControl接口,MediaController则是安卓封装的辅助控制器,带有暂停,播放,停止,进度条等控件。通过VideoView+MediaController可以很轻松的实现视频播放、停止、快进、快退等功能。

使用此实现方式的步骤:

加载指定的视频文件
建立VideoView和MediaController之间的关联,这样就不需要自己去控制视频的播放、暂停等。让MediaController控制即可。
VideoView获取焦点。

虽然VideoView的实现方式很简单,但是由于是自带的封装好的类,所以无论是播放器的大小、位置以及控制都不受我们控制。

所以就有了另一种较好的方式

2、MediaPlayer+SurfaceView+自定义控制器

这种实现方式步骤如下:

创建MediaPlayer对象,并让它加载指定的视频文件。可以是应用的资源文件、本地文件路径、或者URL。
在界面布局文件中定义SurfaceView组件,并为SurfaceView的SurfaceHolder添加Callback监听器。
调用MediaPlayer对象的setDisplay(SurfaceHolder sh)将所播放的视频图像输出到指定的SurfaceView组件。
调用MediaPlayer对象的prepareAsync()或prepare()方法装载流媒体文件
调用MediaPlayer对象的start()、stop()和pause()方法来控制视频的播放。
在实现第二步之前需要先给surfaceHolder设置一个callback,callback的3个回调函数如下:

@Override
public void surfaceCreated(SurfaceHolder holder) {
    
    
}
 
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    
    
 
}
 
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    
    
 
}

**注意事项:**MediaPlayer有prepare和prepareAsync两种方法。这两种方法的区别是:prepare方法是将资源同步缓存到内存中,一般加载本地较小的资源可以用这个,如果是较大的资源或者网络资源建议使用prepareAsync方法,异步加载。

第二种实现方式使用的是自定义控件,MediaPlayer+SurfaceView也可以使用系统自带的MediaController控制器。

3、MediaPlayer+SurfaceView+MediaController

使用这个方式实现,布局文件只需一个SurfaceView即可,其他的控件都交给MediaController控制器.

美中不足的是,以上三种实现方式均是基于使用外部存储SD卡的,那么有没有一种方式将视频资源嵌入到APP中呢,这样就可以避免在目标机上指定的目录下上传所需的视频资源。

First temp:起初,我想既然播放视频的核心是获取到视频资源路径,那应该可以想C语言一样将res资源与Main.cpp文件至于同一文件夹下即可,再将路径改为当前目录下的xxx.mp3灯视频资源文件名即可,我想着,既然是在java文件中写的路径,那应该将资源与java文件至于同一级目录。可是后面运行,报错视频无法打开。那就是路径出错了,我又想到既然图片资源可以嵌入APP中,那是否可以仿照新增一个目录?

于是乎–实现了不借助外部存储实现播放视频

(个人觉得这个需求还是挺常见的,实现了这个功能还是挺好的。我是根据C语言项目经验,慢慢推敲出来的,所以我想说的是编程语言的思想永远是不分家的,还有就是多练,just have a try!)

在做引导界面的时候有一个视频文件, 把它放在res/raw目录下面. 引用方法 如下:

videoView = (VideoView) findViewById(R.id.video_view);
videoView.setMediaController(new MediaController(this));
Uri uri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.video);
videoView.setVideoURI(uri);
videoView.start();

经测试, 对于mp4, avi, mov 这三种格式, VideoView是可以直接播放的 (我只测了这三个种格式, 其它的格式没测试)

猜你喜欢

转载自blog.csdn.net/qq_56845026/article/details/126131685