上一篇
安卓开发保存视频数据库
- 行业动态
- 2025-04-23
- 4223
安卓保存视频可将视频文件存至外部存储或应用私有目录,数据库(如SQLite/Room)存储视频路径及元数据,需优化查询并管理文件避免冗余占用空间
安卓开发保存视频到数据库的实现方案
存储方案分析
在安卓开发中,直接将视频文件存储到数据库(如SQLite)中并不推荐,因为视频文件通常较大(可能几十MB甚至更大),直接存储会导致以下问题:
- 数据库体积膨胀:SQLite适合存储小文件(如文本、图片),大文件会显著增加数据库体积。
- 性能问题:读写大文件会拖慢数据库操作速度。
- 内存占用:加载大文件到内存可能导致OOM(内存溢出)。
推荐方案:
- 视频文件存储:将视频文件保存到设备外部存储(如
ExternalFilesDir
)或应用私有目录。 - 数据库存储元数据:在数据库中保存视频的路径、名称、时长、缩略图路径等元数据。
数据库设计
创建一个表用于存储视频的元数据,示例如下:
字段名 | 类型 | 说明 |
---|---|---|
id | INTEGER | 主键,自增 |
video_path | TEXT | 视频文件存储路径 |
video_name | TEXT | 视频名称 |
duration | INTEGER | 视频时长(毫秒) |
thumbnail_path | TEXT | 视频缩略图路径 |
upload_time | INTEGER | 上传时间(时间戳) |
实现步骤
存储视频文件到设备
// 获取应用私有外部存储目录 File videoDir = new File(getExternalFilesDir(null), "Videos"); if (!videoDir.exists()) { videoDir.mkdirs(); } // 保存视频文件到指定路径 File videoFile = new File(videoDir, "example_video.mp4"); try (FileOutputStream fos = new FileOutputStream(videoFile)) { byte[] buffer = new byte[1024]; int len; while ((len = inputStream.read(buffer)) != -1) { fos.write(buffer, 0, len); } } catch (IOException e) { e.printStackTrace(); }
生成视频缩略图
// 使用MediaMetadataRetriever生成缩略图 MediaMetadataRetriever retriever = new MediaMetadataRetriever(); retriever.setDataSource(videoFile.getAbsolutePath()); Bitmap thumbnail = retriever.getFrameAtTime(1000000); // 获取1秒时的帧 String thumbnailPath = saveBitmapToFile(thumbnail); // 保存缩略图到文件 retriever.release();
保存元数据到SQLite数据库
// 创建Video对象 Video video = new Video(); video.setVideoPath(videoFile.getAbsolutePath()); video.setVideoName("example_video.mp4"); video.setDuration(extractVideoDuration(videoFile.getAbsolutePath())); // 自定义方法获取时长 video.setThumbnailPath(thumbnailPath); video.setUploadTime(System.currentTimeMillis()); // 插入数据库 ContentValues values = new ContentValues(); values.put("video_path", video.getVideoPath()); values.put("video_name", video.getVideoName()); values.put("duration", video.getDuration()); values.put("thumbnail_path", video.getThumbnailPath()); values.put("upload_time", video.getUploadTime()); // 执行插入 db.insert("VideoTable", null, values);
注意事项
- 权限处理:
- Android 10+ 需要使用
MediaStore
或Storage Access Framework
。 - 动态申请
WRITE_EXTERNAL_STORAGE
和READ_EXTERNAL_STORAGE
权限。
- Android 10+ 需要使用
- 路径兼容性:
- 使用
getExternalFilesDir()
获取应用私有目录,避免存储公开路径。
- 使用
- 视频时长获取:
- 使用
MediaPlayer
或MediaMetadataRetriever
提取视频时长。
- 使用
- 缩略图优化:
缩略图需压缩后保存,避免占用过多空间。
相关问题与解答
问题1:如何从数据库中读取视频并播放?
解答:
- 查询数据库获取
video_path
。 - 使用
VideoView
加载路径播放:VideoView videoView = findViewById(R.id.videoView); videoView.setVideoPath(videoPath); videoView.start();
问题2:如何删除数据库中的视频记录及对应文件?
解答:
- 删除数据库记录:
DELETE FROM VideoTable WHERE id = ?
- 删除视频文件和缩略图文件:
new File(videoPath).delete(); new File(thumbnailPath).delete();