Logo
Android Video Pipeline

Android: Sharpen Video via JavaCV (FFmpeg + OpenCV)

Instead of writing complex JNI/NDK bridges, we use JavaCV to access pre-compiled FFmpeg 7 and OpenCV libraries on Android. Grab frames, sharpen them, and re-encode seamlessly.

Step 1: JavaCV Gradle Setup

Add dependencies for FFmpeg and OpenCV provided by Bytedeco

App-level build.gradle.kts

dependencies {
    // 核心库
    implementation("org.bytedeco:javacv:1.5.10")

    // 引入 FFmpeg 库及 Android 对应的底层库 (arm64)
    implementation("org.bytedeco:ffmpeg:6.1.1-1.5.10")
    implementation("org.bytedeco:ffmpeg:6.1.1-1.5.10:android-arm64")

    // 引入 OpenCV 库及 Android 对应的底层库 (arm64)
    implementation("org.bytedeco:opencv:4.9.0-1.5.10")
    implementation("org.bytedeco:opencv:4.9.0-1.5.10:android-arm64")
}

Step 2: Kotlin FFmpeg Pipeline

Use FFmpegFrameGrabber and Recorder alongside OpenCV Mat

import org.bytedeco.javacv.FFmpegFrameGrabber
import org.bytedeco.javacv.FFmpegFrameRecorder
import org.bytedeco.javacv.OpenCVFrameConverter
import org.bytedeco.opencv.global.opencv_imgproc
import org.bytedeco.opencv.opencv_core.Mat
import org.bytedeco.opencv.opencv_core.CvType
import org.bytedeco.opencv.opencv_core.Size

fun processVideoSharpening(inputPath: String, outputPath: String) {
    // 1. 初始化 FFmpeg 视频拉取器
    val grabber = FFmpegFrameGrabber(inputPath)
    grabber.start()

    // 2. 初始化 FFmpeg 视频编码写入器 (保持原宽高)
    val recorder = FFmpegFrameRecorder(outputPath, grabber.imageWidth, grabber.imageHeight)
    recorder.frameRate = grabber.frameRate
    recorder.videoCodec = grabber.videoCodec // 沿用原编码格式
    recorder.videoBitrate = grabber.videoBitrate
    recorder.start()

    // 3. 初始化帧格式转换器 (FFmpeg Frame <-> OpenCV Mat)
    val converter = OpenCVFrameConverter.ToMat()

    // 4. 构建 3x3 拉普拉斯锐化矩阵
    val kernel = Mat(3, 3, CvType.CV_32F)
    val kernelData = floatArrayOf(
        0f, -1f,  0f,
       -1f,  5f, -1f,
        0f, -1f,  0f
    )
    // 获取指向矩阵数据的指针并填入数据
    kernel.createIndexer().put(*kernelData)

    // 5. 循环逐帧处理
    var frame = grabber.grabImage()
    val sharpenedMat = Mat()
    while (frame != null) {
        val mat = converter.convert(frame)
        // 调用 OpenCV filter2D 进行锐化
        opencv_imgproc.filter2D(mat, sharpenedMat, mat.depth(), kernel)
        // 将处理后的 Mat 转换回 Frame 并交由 FFmpeg 写入
        recorder.record(converter.convert(sharpenedMat))
        frame = grabber.grabImage()
    }

    // 6. 释放资源
    recorder.stop()
    recorder.release()
    grabber.stop()
    grabber.release()
    kernel.close()
    sharpenedMat.close()
}

Step 3: Permissions & Usage

Run in a background thread with proper storage permissions

Thread Warning

Video processing is CPU intensive. NEVER call `processVideoSharpening()` on the Main UI thread, or your app will crash with ANR (Application Not Responding).

Call from Activity (Kotlin Coroutines)
// 确保已在 AndroidManifest.xml 中申请了 READ_EXTERNAL_STORAGE 等权限
val inputPath = "/storage/emulated/0/Download/blurry.mp4"
val outputPath = "/storage/emulated/0/Download/sharp.mp4"

// 使用生命周期协程域放入 IO 线程执行
lifecycleScope.launch(Dispatchers.IO) {
    try {
        processVideoSharpening(inputPath, outputPath)
        withContext(Dispatchers.Main) {
            Toast.makeText(this@MainActivity, "处理完成!", Toast.LENGTH_LONG).show()
        }
    } catch (e: Exception) {
        e.printStackTrace()
    }
}

Explore More#mobile-dev

Integrating FFmpeg 7+ with Kotlin via JNI

Article

A complete, step-by-step visual guide to integrating pre-compiled FFmpeg 7 dynamic libraries (.so) into a modern Android project using CMake, JNI, and Jetpack Compose.

Android FFmpeg + C++: Video Cropping and Filter Processing

Article

A detailed demonstration of how to use FFmpeg and C++ in an Android project to implement video cropping, filter processing, and progress callbacks.

Integrating OpenCV 4.x in Android Studio

Article

A detailed step-by-step guide on how to integrate OpenCV 4.x into an Android Studio project, configure CMake and JNI, and implement image processing features.

Using OpenCV for Image Sharpening in Android

Article

A detailed step-by-step guide on how to integrate OpenCV into an Android project and implement image sharpening functionality.

Android OpenCV + FFmpeg 7: Making Videos Clearer from Blurry

Article

A detailed demonstration of how to use OpenCV and FFmpeg 7 in an Android project for video processing, achieving clarity from blurriness.

FFmpeg Android + OpenSSL Compilation Guide

Article

A detailed step-by-step guide on how to compile FFmpeg from source and integrate OpenSSL on the Android platform for HTTPS streaming support.

FFmpeg Xcode + Swift Compilation Guide

Article

A detailed step-by-step guide on how to compile FFmpeg from source using Xcode and Swift on macOS, and integrate it into an iOS project.

Android Image Similarity Detection and Grouping

Article

A detailed demonstration of how to use OpenCV in an Android project to implement image similarity detection and grouping features.