下载地址:https://www.pan38.com/dow/share.php?code=JCnzE 提取密码:8868
代码说明:
核心视频处理模块使用JavaCV实现视频捕获、特效处理和虚拟设备输出
Xposed模块通过Hook微信摄像头相关方法实现视频流替换
包含完整的Android构建配置和NDK本地代码支持
视频处理管道支持自定义滤镜算法扩展
项目配置包含JavaCV和OpenCV的Maven依赖
源码部分:
import org.bytedeco.javacv.;
import org.bytedeco.opencv.opencv_core.;
import static org.bytedeco.opencv.global.opencv_imgproc.*;
public class VirtualCameraDemo {
private static final int WIDTH = 1280;
private static final int HEIGHT = 720;
public static void main(String[] args) throws Exception {
// 视频源配置
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("input.mp4");
grabber.setImageWidth(WIDTH);
grabber.setImageHeight(HEIGHT);
grabber.start();
// 虚拟摄像头输出配置
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(
"video=VirtualCam", WIDTH, HEIGHT);
recorder.setFormat("dshow");
recorder.setFrameRate(30);
recorder.start();
// 视频处理管道
OpenCVFrameConverter.ToMat converter = new OpenCVFrameConverter.ToMat();
while (true) {
Frame frame = grabber.grab();
if (frame == null) break;
// 视频特效处理
Mat mat = converter.convert(frame);
Mat processed = applyEffects(mat);
// 输出到虚拟设备
recorder.record(converter.convert(processed));
Thread.sleep(33); // 30fps
}
grabber.close();
recorder.close();
}
private static Mat applyEffects(Mat src) {
Mat dst = new Mat();
// 添加灰度+边缘检测特效
cvtColor(src, dst, COLOR_BGR2GRAY);
Canny(dst, dst, 50, 150);
return dst;
}
}
package com.virtual.plugin;
import de.robv.android.xposed.;
import de.robv.android.xposed.callbacks.;
public class MainModule implements IXposedHookLoadPackage {
private static final String TARGET_PKG = "com.tencent.mm";
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) {
if (!lpparam.packageName.equals(TARGET_PKG)) return;
// Hook摄像头开启方法
XposedHelpers.findAndHookMethod(
"com.tencent.mm.plugin.mmsight.api.MMSightCamera",
lpparam.classLoader,
"openCamera",
int.class,
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) {
param.args[0] = 9999; // 替换为虚拟摄像头ID
}
});
// Hook视频帧处理方法
XposedHelpers.findAndHookMethod(
"com.tencent.mm.plugin.mmsight.model.a.d",
lpparam.classLoader,
"processFrame",
byte[].class, int.class, int.class,
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) {
byte[] frame = (byte[]) param.args[0];
param.args[0] = processVirtualFrame(frame);
}
});
}
private native byte[] processVirtualFrame(byte[] input);
static {
System.loadLibrary("virtualcam");
}
}
{
compileSdkVersion 34
buildToolsVersion "34.0.0"
defaultConfig {
minSdkVersion 24
targetSdkVersion 34
versionCode 1
versionName "1.0"
externalNativeBuild {
cmake {
cppFlags "-std=c++17"
abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
}
}
}
externalNativeBuild {
cmake {
path "src/main/cpp/CMakeLists.txt"
}
}
}
dependencies {
compileOnly 'de.robv.android.xposed:api:82'
implementation 'org.bytedeco:javacv:1.5.7'
implementation group: 'org.bytedeco', name: 'opencv', version: '4.5.5-1.5.7'
}