# CompressClip **Repository Path**: ddhslfqc4/CompressClip ## Basic Information - **Project Name**: CompressClip - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-07-08 - **Last Updated**: 2025-07-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## How it works 在调用视频文件进行压缩时,视频库会检查用户是否希望设置最低比特率,以避免压缩低分辨率视频。如果不想每次处理视频时都对其进行压缩,以避免多轮压缩后视频质量变得很差,那么设置最小比特率就很方便。最小值是 * 比特率:2mbps 如果不想让视频库自动生成这些值,也可以传递自定义的 resizer 和 videoBitrate 值。 这些值已在大量视频上进行过测试,运行良好且速度很快。根据项目需要和预期,这些值可能会有所改变。 Usage -------- 要使用此库,必须添加以下权限,允许读写外部存储。请参考示例应用程序,了解如何通过正确设置启动压缩。 **API < 29** ```xml ``` **API >= 29** ```xml ``` **API >= 33** ```xml ``` ```kotlin if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { // request READ_MEDIA_VIDEO run-time permission } else { // request WRITE_EXTERNAL_STORAGE run-time permission } ``` 并导入以下依赖项以使用 kotlin 协程 ### Groovy ```groovy implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:${Version.coroutines}" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:${Version.coroutines}" ``` 然后只需调用 [VideoCompressor.start()],并传递 **context**、**uris**、**isStreamable**、**configureWith** 和 **sharedStorageConfiguration 或 appSpecificStorageConfiguration**。 该方法有 5 个功能的回调; 1) OnStart - 压缩开始时调用 2) OnSuccess - 压缩完成且无错误/异常时调用 3) OnFailure - 出现异常或视频比特率和大小低于压缩所需的最小值时调用。 4) OnProgress - 当进度更新时调用 5) OnCancelled - 取消任务时调用 ### Important Notes: - 所有回调函数都会按照传递给视频库的 URL 的顺序返回一个正在压缩的视频索引。您可以使用该索引更新用户界面或检索有关原始 uri/文件的信息。 - 源视频必须以内容 uri 列表的形式提供。 - OnSuccess 会返回存储视频的路径。 - 如果您希望输出优化为流式的视频,请确保您传递的 [isStreamable] 标志为 true。 ### Configuration values - VideoQuality: VERY_HIGH (original-bitrate * 0.6) , HIGH (original-bitrate * 0.4), MEDIUM (original-bitrate * 0.3), LOW (original-bitrate * 0.2), OR VERY_LOW (original-bitrate * 0.1) - isMinBitrateCheckEnabled:这表示如果比特率低于 2mbps 则不压缩 - videoBitrateInMbps:以 Mbps 为单位的任何自定义比特率值。 - disableAudio:true/false,用于生成无音频的视频。默认为假。 - resizer:调整视频尺寸的函数。默认为 `VideoResizer.auto`。 ## 存储配置(StorageConfiguration)是一个接口,用于指示将文件保存在哪个库中。 #### 提供了一些更易于使用的行为,具体如下 ### AppSpecificStorageConfiguration 配置值 - subFolderName: 在应用程序特定存储空间中创建的子文件夹名称。 ### SharedStorageConfiguration 配置值 - saveAt:视频应保存的目录。必须是以下其中之一:[SaveLocation.pictures]、[SaveLocation.movies] 或 [SaveLocation.downloads]。 - subFolderName:在共享存储中创建的子文件夹名称。 ### CacheStorageConfiguration - 根据 Google 的定义,在缓存目录中创建文件没有配置值,如需了解更多信息,请访问 [此处](https://developer.android.com/training/data-storage/app-specific?hl=es-419) ### Fully custom configuration - 如果这些没有符合你的需求,你可以自定义 StorageConfiguration,只需实现接口并将其传递给库即可 - ```kotlin class AppCacheStorageConfiguration( ) : StorageConfiguration { val compressDir = PathUtils.getInternalAppCachePath() + File.separator + "compress" override fun createFileToSave( context: Context, videoFile: File, fileName: String, shouldSave: Boolean ): File { FileUtils.createOrExistsDir(compressDir) val outputName = "compressVideo.mp4" val out = compressDir + File.separator + outputName if (shouldSave) { FileUtils.getFileByPath(out).let { FileUtils.copy(videoFile, it) return it } } return File.createTempFile(videoFile.nameWithoutExtension, videoFile.extension) } } ``` 要取消压缩任务,只需调用 [VideoCompressor.cancel()] 即可。 ### Kotlin ```kotlin VideoCompressor.start( context = applicationContext, uris = List, isStreamable = false, storageConfiguration = SharedStorageConfiguration( saveAt = SaveLocation.movies, subFolderName = "save-videos" ) configureWith = Configuration( videoNames = listOf(), /*视频名称列表,大小应与传递的 uris 一致*/ quality = VideoQuality.MEDIUM, isMinBitrateCheckEnabled = true, videoBitrateInMbps = 5, disableAudio = false, startTime = 0,//开始时间 s endTime = 120,//结束时间 s resizer = VideoResizer.matchSize(360, 480) ), listener = object : CompressionListener { override fun onProgress(index: Int, percent: Float) { runOnUiThread { } } override fun onStart(index: Int) { } override fun onSuccess(index: Int, size: Long, path: String?) { } override fun onFailure(index: Int, failureMessage: String) { } override fun onCancelled(index: Int) { } } ) ```