You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Simple-Camera的Android项目添加视频自定义元数据标签求助

为Simple-Camera添加自定义元数据的实现方法

一、图片文件添加元数据(使用Android原生ExifInterface)

Simple-Camera拍照生成的JPG文件,可通过Android自带的ExifInterface快速添加自定义注释或元数据:

  1. 定位图片保存逻辑
    在项目中找到拍照完成后处理文件的代码(比如CameraFragment的savePicture方法附近),拿到生成图片的绝对路径。

  2. 添加元数据代码

import android.media.ExifInterface

fun addImageMetadata(imagePath: String, comment: String) {
    try {
        val exif = ExifInterface(imagePath)
        // 使用Exif标准的UserComment字段存储注释,兼容性更好
        exif.setAttribute(ExifInterface.TAG_USER_COMMENT, comment)
        // 若需自定义键值对,可直接设置自定义键(部分设备可能不兼容)
        // exif.setAttribute("CustomComment", comment)
        exif.saveAttributes()
    } catch (e: Exception) {
        e.printStackTrace()
    }
}

在图片保存完成后调用该方法,传入路径和你的注释内容即可。

二、视频文件添加元数据(使用mp4parser)

针对MP4视频,mp4parser可直接操作文件元数据,具体步骤如下:

  1. 添加依赖
    在Module级别的build.gradle中引入mp4parser:
implementation "com.googlecode.mp4parser:isoparser:1.1.22"
  1. 编写视频元数据修改代码
import com.googlecode.mp4parser.IsoFile
import com.googlecode.mp4parser.boxes.apple.AppleItemListBox
import com.googlecode.mp4parser.boxes.apple.AppleUserDataBox
import com.googlecode.mp4parser.boxes.apple.AppleCommentBox
import java.io.File
import java.io.FileOutputStream

fun addVideoMetadata(videoPath: String, comment: String) {
    val isoFile = IsoFile(videoPath)
    // 获取或创建用户数据盒子(udta)
    val udta = isoFile.getBoxes(AppleUserDataBox::class.java).firstOrNull() 
        ?: run {
            val newUdta = AppleUserDataBox()
            isoFile.addBox(newUdta)
            newUdta
        }
    
    // 获取或创建项目列表盒子(ilst)
    val ilst = udta.getBoxes(AppleItemListBox::class.java).firstOrNull()
        ?: run {
            val newIlst = AppleItemListBox()
            udta.addBox(newIlst)
            newIlst
        }
    
    // 移除已有注释(如需更新)
    ilst.boxes.removeAll { it is AppleCommentBox }
    // 添加新注释
    val commentBox = AppleCommentBox()
    commentBox.data = comment.toByteArray(Charsets.UTF_8)
    ilst.addBox(commentBox)
    
    // 保存修改后的文件
    val tempFile = File.createTempFile("temp_video", ".mp4")
    FileOutputStream(tempFile).use { os ->
        isoFile.writeContainer(os)
    }
    isoFile.close()
    
    // 替换原文件
    val originalFile = File(videoPath)
    if (originalFile.delete() && tempFile.renameTo(originalFile)) {
        // 替换成功
    } else {
        tempFile.delete()
    }
}

这段代码通过操作MP4的用户数据盒子,添加苹果标准的注释字段,也可根据需求自定义元数据盒子。

  1. 集成到项目
    找到视频录制完成后的文件处理逻辑(比如VideoFragment中录制结束的回调),调用上述方法传入视频路径和注释内容。

三、注意事项

  • 图片元数据优先使用标准的TAG_USER_COMMENT,自定义键可能存在兼容性问题。
  • 视频元数据修改涉及文件替换,建议在后台线程执行,避免阻塞主线程。
  • Android 10及以上需注意文件权限,优先使用MediaStore API处理文件操作。

内容的提问来源于stack exchange,提问作者Richard Kamere

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 22:34:59