You need to enable JavaScript to run this app.
文档中心
智能美化特效

智能美化特效

复制全文
下载 pdf
相关协议说明
智能美化特效 SDK 可选个人信息的配置说明
复制全文
下载 pdf
智能美化特效 SDK 可选个人信息的配置说明
作为智能美化特效 SDK 的提供方,北京火山引擎科技有限公司(以下简称“火山引擎”或“我们”)高度重视个人信息保护。智能美化特效 SDK 为开发者提供贴纸特效、美化滤镜、人像智能及计算机视觉基础检测识别算法等智能图像渲染服务。本隐私声明所称的智能美化特效 SDK 产品和/或服务,包括智能美化特效 SDK 服务以及火山引擎不时提供或更新的其他版本(以下统称“本服务”)。当终端用户(以下简称“您”)使用开发者开发和/或运营的网站或应用软件(包括 App、小程序、网页等,以下简称“开发者应用”)且开发者集成本服务时,我们将通过开发者应用向您提供相关功能和服务。我们将严格按照本隐私政策及适用法律法规处理您的个人信息,保护您的个人信息与隐私安全。​
​
特别声明:关于智能美化特效 SDK 可选收集个人信息的控制方式,您可参阅相关接入文档,详细了解未收集相关信息时对对应功能的影响,并结合业务实际需要进行合理配置。具体配置说明如下:​
​
1.Android SDK 可选个人信息配置说明​
​
个人信息采集字段​
代码使用说明​
传感器信息(游戏动作传感器、加速度、重力加速度、重力传感器、陀螺仪)​
【Android】该信息用于智能美化特效运行过程中判断手机旋转方向、移动角度、重力方向等信息。SDK 可通过内置传感器能力读取上述方向和运动变化信息;宿主应用也可按需通过 Android SensorManager 的 registerListener 开启采集,并通过 unregisterListener 关闭采集。​
若不需要使用传感器信息,可在 EffectManager 初始化后调用 setUseBuiltinSensor(false) 关闭 SDK 内置传感器;若由宿主应用自行采集,则不调用 registerListener,或在页面暂停、销毁、场景结束时调用 unregisterListener,将不再采集相应传感器信息。​
​
// 关闭 SDK 内置传感器​
effectManager.init();​
effectManager.setUseBuiltinSensor(false);​
​
// 宿主应用自行采集时的开启 / 关闭方式​
android.hardware.SensorManager sensorManager =​
(android.hardware.SensorManager) getSystemService(Context.SENSOR_SERVICE);​
Sensor accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);​
Sensor gyroscope = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);​
Sensor gravity = sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY);​
Sensor rotation = sensorManager.getDefaultSensor(Sensor.TYPE_GAME_ROTATION_VECTOR);​
if (rotation == null) {​
rotation = sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);​
}​
sensorManager.registerListener(listener, accelerometer,​
android.hardware.SensorManager.SENSOR_DELAY_FASTEST);​
sensorManager.registerListener(listener, gyroscope,​
android.hardware.SensorManager.SENSOR_DELAY_FASTEST);​
sensorManager.registerListener(listener, gravity,​
android.hardware.SensorManager.SENSOR_DELAY_FASTEST);​
sensorManager.registerListener(listener, rotation,​
android.hardware.SensorManager.SENSOR_DELAY_FASTEST);​
​
sensorManager.unregisterListener(listener);​
​
分辨率、设备类型​
【Android】该信息由宿主应用根据实际启用能力调用 Android 系统接口获取,用于相机预览、图片 / 视频输入和纹理处理等必要适配。屏幕分辨率可通过 DisplayMetrics 获取,设备类型可通过 Build.MODEL、Build.MANUFACTURER 获取。​
若宿主应用不需要获取分辨率或设备类型信息,可不调用上述接口;未调用时将不再采集相应信息。​
​
// 获取屏幕分辨率​
DisplayMetrics metrics = getResources().getDisplayMetrics();​
int screenWidth = metrics.widthPixels;​
int screenHeight = metrics.heightPixels;​
​
// 获取设备类型​
String deviceModel = Build.MODEL;​
String manufacturer = Build.MANUFACTURER;​
​
图片、视频​
【Android】该信息用于向智能美化特效 SDK 提供待处理的输入帧。图片、视频由宿主应用在获得用户授权同意后获取:相机预览可通过 Android Camera2 API(android.hardware.camera2)或 CameraX(androidx.camera)打开,本地图片、视频可通过系统照片选择器(Photo Picker)或 MediaStore 访问;SDK 处理宿主应用输入的图像或视频帧,不主动拉起相机或相册采集图片、视频。​
若不声明或不申请 android.permission.CAMERA、READ_MEDIA_IMAGES、READ_MEDIA_VIDEO 或旧版本存储读取权限,或不调用相机 / 相册 / 视频输入能力,将不再采集对应图片、视频信息。页面暂停、销毁或场景结束后,应关闭对应输入源。​
​
// 1. 宿主应用获取图片 / 视频帧并转换为纹理​
int srcTexture = inputTextureId;​
int dstTexture = outputTextureId;​
​
// 2. 将输入帧送入 SDK 处理​
effectManager.process(srcTexture, dstTexture, width, height, rotation, System.nanoTime());​
​
// 3. 场景结束后关闭相机、图片或视频输入源​
imageSourceProvider.close();​
​
图片(AI 美颜 Live/Pro 云端处理,可选场景)​
【Android】该信息仅在启用 AI 美颜 Live / Pro 云端处理时使用。AI 美颜 Pro 在用户选择本地图片后发起处理,图片入口通过相册权限检查后打开相册选择器;AI 美颜 Live 在用户点击 AI 美颜后,从当前输入画面中取得满足条件的关键帧。宿主侧会将图片或关键帧转换为 JPEG Base64 字符串,再作为请求参数提交至云端。​
图片会在宿主侧转换为 data:image/jpeg;base64,... 后写入请求体的 resource_list,并随 template_id、serverId 等字段提交云端任务;任务提交后通过查询接口轮询结果。​
进入 AI 美颜 Live / Pro 页面时会展示隐私政策及服务条款弹窗,用户点击退出则关闭页面。宿主不启用 AI 美颜 Live / Pro 入口、不选择图片、不触发关键帧上传,或不调用上述提交任务接口,将不进入该图片云端处理链路。已发起的请求可通过关闭 AI 美颜流程取消当前请求和轮询。​
​
// Pro:用户选择本地图片后提交​
aiBeautyViewModel.uploadKeyFrameAndPollResult(imagePath, FEATURE_AI_BEAUTY_PRO)​
​
// Live:取得关键帧后提交​
aiBeautyViewModel.uploadKeyFrameAndPollResult(buffer, width, height, FEATURE_AI_BEAUTY_LIVE)​
​
// 关闭 AI 美颜流程时,取消当前请求和轮询​
aiBeautyViewModel.aiBeautyClose()​
​
宿主接入时应在图片提交入口落实同意检查。停止后续采样或轮询,不代表已提交至服务端的图片被删除;服务端留存及删除规则需另行确认。该行用于补充 AI 美颜 Live / Pro 云端处理可选场景,不代表所有智能美化特效接入均会上传图片。​
​
​
2.iOS SDK 可选个人信息配置说明​
​
个人信息采集字段​
代码使用说明​
传感器信息(设备运动、重力及方向信息;SDK 内置传感器的具体字段待确认)​
该信息用于特效相关场景及输入画面方向校正。iOS 侧包含两条独立路径:SDK 内置传感器,以及宿主通过 Core Motion 获取的设备运动数据。当前工程在特效引擎的两条初始化路径中均调用 bef_effect_ai_use_builtin_sensor(handle, YES),开启 SDK 内置传感器;宿主方向检测通过 CMMotionManager 读取 CMDeviceMotion.gravity。​
SDK 内置传感器可通过 bef_effect_ai_use_builtin_sensor(handle, false) 配置为不使用;宿主方向检测可通过 stopDeviceMotionUpdates 停止更新,不调用 startDeviceMotionUpdatesToQueue:withHandler: 则不启动该条宿主采集路径。两者需要分别控制。关闭后,依赖传感器的素材及方向校正可能受到影响。​
​
// handle 已创建;参照当前工程,在 SDK 初始化前配置。​
// 开启内置传感器(当前工程使用此配置)​
bef_effect_ai_use_builtin_sensor(handle, true);​
​
// 如需关闭,初始化前选择 false,替代上方的 true。​
// 当前 initTask、initPostCheckLicense 两条路径均需同步配置。​
bef_effect_ai_use_builtin_sensor(handle, false);​
​
​
#import <CoreMotion/CoreMotion.h>​
​
// motionManager 由宿主持有,并保持存活。​
if (motionManager.isDeviceMotionAvailable) {​
motionManager.deviceMotionUpdateInterval = 1.0;​
[motionManager startDeviceMotionUpdatesToQueue:motionQueue​
withHandler:^(CMDeviceMotion *motion, NSError *error) {​
if (!motion) { return; }​
double gravityX = motion.gravity.x;​
double gravityY = motion.gravity.y;​
// 根据重力方向计算输入画面的旋转角度。​
}];​
}​
​
// 场景结束或不再需要方向检测时,停止宿主更新。​
[motionManager stopDeviceMotionUpdates];​
​
当前工程的相机 stopRunning 仅停止相机会话,未同时停止方向检测;不能将停止相机或关闭画面美颜等同于停止全部传感器访问。具体内置传感器种类及运行时关闭行为需由 SDK 实现进一步确认,不直接套用 Android 的传感器名称。​
分辨率、设备类型​
由宿主根据实际场景读取,用于界面布局、输入画面适配和部分特效的设备支持判断。当前工程读取屏幕尺寸用于布局,通过 uname 获取设备型号用于 nativeGPUIsSupport 判断。特效初始化接口的 deviceName 参数实际传入空字符串;每帧处理时仍将输入纹理的 width、height 传入 SDK。​
当前没有统一的设备信息采集开关。宿主可按业务需要控制屏幕尺寸和设备型号查询;输入图像的宽高属于正确处理图像所需参数,不应作为可随意省略的采集项。宿主不查询设备型号,不代表能够确认 SDK 二进制内部不读取设备信息。​
​
#import <UIKit/UIKit.h>​
#import <sys/utsname.h>​
​
// 原生屏幕像素尺寸;用于确实需要屏幕分辨率的场景。​
CGRect nativeBounds = UIScreen.mainScreen.nativeBounds;​
CGFloat screenWidthPixels = nativeBounds.size.width;​
CGFloat screenHeightPixels = nativeBounds.size.height;​
​
// 设备类别,如 iPhone、iPad。​
NSString *deviceType = UIDevice.currentDevice.model;​
​
// 硬件型号,如 iPhone 的型号标识,用于设备适配。​
struct utsname systemInfo;​
if (uname(&systemInfo) == 0) {​
NSString *deviceModel = [NSString stringWithUTF8String:systemInfo.machine];​
// 根据实际需求使用 deviceModel。​
}​
​
示例中的 nativeBounds 用于展示屏幕像素尺寸的获取方式;当前工程的多数布局实际使用 UIScreen.bounds,其单位为点。屏幕尺寸与输入图像尺寸需要分别描述。​
图片、视频​
该信息用于提供输入图像数据。摄像头画面由宿主在获得相机授权后通过 AVFoundation 获取;本地图片、视频由宿主通过相册选择器获取,当前工程使用 TZImagePickerController。本地视频通过 AVAssetReader 解码,图片或视频帧转换为纹理后输入 SDK 处理。示例工程中的相机和相册访问入口位于宿主层。​
相机用途在 Info.plist 中配置 NSCameraUsageDescription;相册读取用途配置 NSPhotoLibraryUsageDescription;保存处理结果至相册时配置 NSPhotoLibraryAddUsageDescription。用途声明不等同于授权,宿主需要按实际调用的系统 API 获取对应授权。相机授权被拒绝时,当前工程不会建立摄像头采集会话;不启动媒体获取入口、不向 SDK 提交图像数据,则不进入对应宿主输入链路。​
​
#import <AVFoundation/AVFoundation.h>​
​
[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo​
completionHandler:^(BOOL granted) {​
if (granted) {​
// 由宿主创建并启动 AVCaptureSession,获取视频帧。​
} else {​
// 不创建摄像头采集会话。​
}​
}];​
​
// 不再需要摄像头画面时,停止宿主相机会话。​
[captureSession stopRunning];​
​
​
// 以下变量由宿主的图像转换与渲染链路提供。​
// width、height 是输入图像的尺寸,不是屏幕尺寸。​
[effectManager processTexture:inputTexture​
outputTexture:outputTexture​
width:width​
height:height​
rotate:rotation​
timeStamp:timeStamp];​
​
本行描述图像获取与本地纹理处理入口。当前项目还包含 AI 美颜 Live/Pro 的云端图片处理,相关上传行为见下一行,不能对整个项目统一表述为“图片不上传”。​
图片(AI 美颜 Live/Pro 云端处理,可选场景)​
当前工程的 AI 美颜 Live 在用户开启功能后,从输入画面中选择满足条件的关键帧;AI 美颜 Pro 在用户选择图片并通过人脸检测后发起请求。图片经过 JPEG 编码及 Base64 转换,作为 resource_list 中的内容提交至服务端进行分析或处理。​
进入 AI 美颜 Live/Pro 页面时,当前工程显示隐私政策及服务条款弹窗;同意状态保存为 PrivacyPolicyAgreed,拒绝时退出页面。不启用 AI 云端美颜入口、不调用图片请求接口,可避免发起这条宿主图片上传链路。PrivacyPolicyAgreed 是页面同意状态,不能视为 SDK 的统一个人信息采集开关;当前请求方法本身未再次检查该状态。​
​
// imageDataURI 由宿主将所选图片或关键帧编码为 JPEG Base64 后构造。​
// 仅在业务需要且用户已同意对应处理时调用。​
[aiBeautyHelper requestAiBeautyParamsByUri:imageDataURI​
isLive:YES​
completionHandler:^(NSString *taskId, NSError *error) {​
// isLive:YES 对应 Live,NO 对应 Pro。​
}];​
​
宿主接入时应在图片提交入口落实同意检查。停止后续采样或轮询,不代表已提交至服务端的图片被删除;服务端留存及删除规则需另行确认。该行用于补充当前示例工程的云端功能,不代表所有智能美化特效接入均会上传图片。​
​
​
​
3.HarmonyOS SDK 可选个人信息配置说明​
​
个人信息采集字段​
代码使用说明​
传感器信息(加速度传感器、陀螺仪、重力传感器、旋转矢量传感器)​
​
【HarmonyOS】该信息用于智能美化特效运行过程中判断设备旋转方向、移动角度、重力方向、空间姿态等信息。当前 HarmonyOS 版本不通过 SDK 内置传感器能力自动订阅鸿蒙系统传感器;如素材或算法需要传感器信息,宿主应用可按需通过 HarmonyOS @kit.SensorServiceKit 的 sensor.on 开启采集,并通过 sensor.off 关闭采集,然后通过 SDK 暴露的 RenderManager 接口写入数据。​
若不需要使用传感器信息,宿主应用不调用 sensor.on 即不会采集相应传感器数据;如果已经开启采集,应在页面暂停、页面销毁、场景结束或不再需要相关素材或算法时调用 sensor.off 取消订阅。​
​
import { sensor } from '@kit.SensorServiceKit'​
​
// 初始化 Effect 句柄后,关闭 SDK 内置传感器模式。​
renderManager.setUseBuiltinSensor(false)​
​
// 宿主应用根据 sensor.getSensorList() 的结果上报设备实际支持的传感器。​
renderManager.setSensorAvailability(​
hasAccelerometer,​
hasGyroscope,​
hasGravity,​
hasRotationVector​
)​
​
// 加速度传感器。​
sensor.on(sensor.SensorId.ACCELEROMETER, data => {​
renderManager.setAccelerometerData(data.x, data.y, data.z, data.timestamp)​
})​
​
// 陀螺仪传感器。​
sensor.on(sensor.SensorId.GYROSCOPE, data => {​
renderManager.setGyroscopeData(data.x, data.y, data.z, data.timestamp)​
})​
​
// 重力传感器。​
sensor.on(sensor.SensorId.GRAVITY, data => {​
renderManager.setGravityData(data.x, data.y, data.z, data.timestamp)​
})​
​
// 旋转矢量传感器。​
// 宿主应用从 SensorId.ROTATION_VECTOR 获取姿态数据后,可转换为 3x3 旋转矩阵写入算法 IMU 通道。​
// 以下转换函数仅表示数据流,具体转换逻辑由宿主应用按系统返回格式实现。​
sensor.on(sensor.SensorId.ROTATION_VECTOR, data => {​
const matrix = convertRotationVectorToMatrix(data)​
renderManager.setRotationMatrix(matrix, data.timestamp)​
​
const quaternion = convertRotationVectorToQuaternion(data)​
renderManager.setDeviceRotation(quaternion)​
})​
​
// 页面暂停、销毁、场景结束或不再需要时关闭采集。​
sensor.off(sensor.SensorId.ACCELEROMETER)​
sensor.off(sensor.SensorId.GYROSCOPE)​
sensor.off(sensor.SensorId.GRAVITY)​
sensor.off(sensor.SensorId.ROTATION_VECTOR)​
​
分辨率、设备类型​
【HarmonyOS】该信息由宿主应用根据实际启用能力调用 HarmonyOS 系统接口获取,用于渲染区域、触摸坐标归一化、手势坐标归一化,以及按设备形态进行页面、交互或能力适配。屏幕分辨率可通过 @kit.ArkUI 的 display.getDefaultDisplaySync() 获取,设备类型可通过 @kit.BasicServicesKit 的 deviceInfo.deviceType 获取。​
若宿主应用不需要屏幕分辨率或设备类型信息,可不调用上述接口;未调用时将不再采集相应信息。​
​
import { display } from '@kit.ArkUI'​
import { deviceInfo } from '@kit.BasicServicesKit'​
​
const displayInfo = display.getDefaultDisplaySync()​
const width = displayInfo.width​
const height = displayInfo.height​
​
const deviceType = deviceInfo.deviceType​
​
图片、视频​
【HarmonyOS】该信息用于向智能美化特效 SDK 提供图片或视频输入。图片和视频均由宿主应用按业务场景主动选择或读取:图片可通过 @kit.ImageKit 的 image.createImageSource 解码为 PixelMap,再转换为 SDK 可处理的纹理或图像数据;视频可通过 @kit.MediaKit 的 media.createAVPlayer 解码到 SDK 提供或宿主创建的 Surface,并通过 media.createAVMetadataExtractor 读取视频宽高和方向。​
若不需要处理图片或视频,宿主应用不读取对应文件,不创建 ImageSource、PixelMap、AVPlayer 或 AVMetadataExtractor 即可。SDK 不主动拉起相册或文件选择流程,也不主动访问宿主应用未传入的图片或视频资源。​
​
import { fileIo as fs } from '@kit.CoreFileKit'​
import { image } from '@kit.ImageKit'​
​
const file = fs.openSync(imagePath)​
const size = fs.statSync(file.fd).size​
const buffer = new ArrayBuffer(size)​
fs.readSync(file.fd, buffer)​
fs.closeSync(file)​
​
const imageSource = image.createImageSource(buffer)​
const pixelMap = imageSource.createPixelMapSync({})​
const imageInfo = pixelMap.getImageInfoSync()​
const width = imageInfo.size.width​
const height = imageInfo.size.height​
​
// 使用结束后释放图片资源。​
pixelMap.release()​
​
​
import { media } from '@kit.MediaKit'​
import { fileIo as fs } from '@kit.CoreFileKit'​
​
const file = fs.openSync(videoPath)​
const extractor = await media.createAVMetadataExtractor()​
extractor.fdSrc = { fd: file.fd }​
const metadata = await extractor.fetchMetadata()​
​
const width = Number(metadata.videoWidth)​
const height = Number(metadata.videoHeight)​
const orientation = Number(metadata.videoOrientation)​
​
const avPlayer = await media.createAVPlayer()​
avPlayer.url = 'fd://' + file.fd​
avPlayer.surfaceId = surfaceId.toString()​
await avPlayer.prepare()​
await avPlayer.play()​
​
// 使用结束后关闭播放并释放资源。​
await avPlayer.release()​
fs.closeSync(file)​
​
​
​
​
4.Windows SDK 可选个人信息配置说明​
​
​
个人信息采集字段​
代码使用说明​
本地图片​
该信息用于提供输入图像数据。图片由宿主应用读取并以图像帧形式输入 SDK 处理。Windows Demo 中,用户通过 Qt FileDialog 选择本地图片,Demo 将所选地址转换为本地文件路径,使用 QImage 读取图片并转换为 RGBA8888,以 QVideoFrame 形式进入处理流程,再将像素数据生成纹理并输入 SDK。该图片读取流程由 Demo 实现。​
图片输入示例(Demo 图片读取及公共处理入口关键片段):​
​
// imageFile 为用户选择的本地图片地址。​
QString filePath = imageFile.toLocalFile();​
QImage img(filePath);​
if (img.isNull()) {​
return;​
}​
// 省略大图缩放分支,转换为 RGBA。​
m_imgFrame = img.convertToFormat(QImage::Format_RGBA8888);​
// 图片定时回调提交图像帧。​
QVideoFrame outFrame(m_imgFrame);​
emit imageFrame(outFrame, IMAGE_MODE_INDEX);​
​
// 公共处理入口将帧像素数据输入 SDK 接入层。​
m_effectHandle->setInput(imgInput.width(), imgInput.height(),​
imgInput.bits(), BYTED_EFFECT::pixel_format_rgba);​
​
摄像头采集​
该信息用于提供输入图像数据。摄像头由宿主应用开启,采集到的图像以帧数据形式输入 SDK 处理。Windows Demo 中,Demo 使用 QCameraInfo::availableCameras() 枚举设备,按设备索引创建并开启 QCamera,通过 BEVideoSurface 接收 QVideoFrame,转换为 RGBA8888 后生成纹理并输入 SDK。该摄像头选择、开启及采集流程由 Demo 实现。​
摄像头输入示例(Demo 设备初始化、帧转换及公共处理入口关键片段):​
​
// 枚举设备,按 cameraIndex 创建摄像头及输出 surface。​
m_cameraInfoList = QCameraInfo::availableCameras();​
m_cameraSurfaces[cameraIndex] = new BEVideoSurface(cameraIndex);​
m_cameraList[cameraIndex] =​
new QCamera(m_cameraInfoList.at(cameraIndex), this);​
m_cameraList[cameraIndex]->setViewfinder(m_cameraSurfaces[cameraIndex]);​
m_cameraList[cameraIndex]->start();​
​
// BEVideoSurface::present 中将采集图像转换为 RGBA 帧。​
targetImg = targetImg.convertToFormat(QImage::Format_RGBA8888);​
QVideoFrame outFrame(targetImg.mirrored(true, true));​
emit newFrameAvailable(outFrame, m_cameraIndex);​
​
// 公共处理入口将帧像素数据输入 SDK 接入层。​
m_effectHandle->setInput(imgInput.width(), imgInput.height(),​
imgInput.bits(), BYTED_EFFECT::pixel_format_rgba);​
​
​
​
5.Mac SDK 可选个人信息配置说明​
​
个人信息采集字段​
代码使用说明​
本地图片​
该信息用于提供输入图像数据。图片由宿主应用读取并以图像帧形式输入 SDK 处理。Mac Demo 中,用户通过 NSOpenPanel 选择本地图片,Demo 使用 NSImage 读取文件,通过 Core Graphics 转换为像素数据,统一转换为 BGRA 后生成纹理并输入 SDK。该图片读取流程由 Demo 实现。​
图片输入示例(Demo 关键片段,省略界面及初始化代码):​
​
// imageFile 为用户选择的本地图片路径。​
NSImage *image = [[NSImage alloc] initWithContentsOfFile:imageFile];​
if (image == nil) {​
return;​
}​
// 图片转换为 RGBA 像素缓冲区。​
BEBuffer *inputBuffer = [self.imageUtils transforUIImageToBEBuffer:image];​
// 公共帧处理路径将其转换为 BGRA,并输入 SDK 接入层。​
[self onIncommingVideoFrame:inputBuffer​
timeStamp:[[NSDate date] timeIntervalSince1970]​
flip:NO];​
​
摄像头采集​
该信息用于提供输入图像数据。摄像头由宿主应用开启,采集到的图像以帧数据形式输入 SDK 处理。Mac Demo 中,Demo 使用 AVFoundation 获取默认摄像头或按设备索引切换摄像头,通过 AVCaptureSession 开启采集,从 CMSampleBufferRef 回调中取得 BGRA 图像帧及时间戳,生成纹理并输入 SDK。该摄像头选择、开启及采集流程由 Demo 实现。​
摄像头输入示例(Demo 初始化及帧回调关键片段):​
​
// 创建并开启摄像头采集。​
BELocalVideoCapture *capture =​
[[BELocalVideoCapture alloc]​
initWithPosition:AVCaptureDevicePositionUnspecified​
cameraSessionPreset:AVCaptureSessionPreset1280x720​
pixelFormatType:kCVPixelFormatType_32BGRA];​
[capture setCameraOutput:self];​
[capture startCameraCapture];​
​
// cameraFrame: 回调中取得图像帧与时间戳。​
CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);​
CMTime sampleTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer);​
double timeStamp = (double)sampleTime.value / sampleTime.timescale;​
CVPixelBufferLockBaseAddress(pixelBuffer, 0);​
unsigned char *baseAddress =​
(unsigned char *)CVPixelBufferGetBaseAddress(pixelBuffer);​
// Demo 继续读取尺寸、行步长并构造 BGRA inputBuffer。​
[self onIncommingVideoFrame:inputBuffer timeStamp:timeStamp flip:NO];​
CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);​
​
​
​
6.Linux SDK 可选个人信息配置说明​
​
个人信息采集字段​
代码使用说明​
本地图片/视频​
​
该信息用于提供输入图像数据。图片、视频信息由宿主应用主动传入视频图片路径,交由opencv或者其他sdk代码进行视频转换,图像采集,,并将获取的图像 / 视频以帧数据形式输入 SDK 处理,SDK 不主动采集图片、视频信息。​
图片输入:​
​
cv::Mat bgr = cv::imread("input.jpg", cv::IMREAD_COLOR);​
if (bgr.empty()) ​
{​
std::fprintf(stderr, "OpenCV 读图失败: %s\n", options.input_image_path.c_str());​
return 5;​
}​
//bgr转rgba​
cv::Mat rgba;​
cv::cvtColor(bgr, rgba, cv::COLOR_BGR2RGBA);​
//buffer转texture​
unsigned int inputTexture = createTexture();​
updateBufferToTexture(m_width, m_height, rgba.data, inputTexture);​
​
视频输入:​
​
cv::VideoCapture m_capture;​
m_capture.open("input.mp4", cv::CAP_FFMPEG);​
if (!m_capture.isOpened())​
{ ​
std::fprintf(stderr, "OpenCV 打开视频失败: input.mp4\n");​
return 5;​
}​
cv::Mat &bgr​
m_capture.read(bgr);//读一帧​
//bgr转rgba​
cv::Mat rgba;​
cv::cvtColor(bgr, rgba, cv::COLOR_BGR2RGBA);​
//buffer转texture​
unsigned int inputTexture = createTexture();​
updateBufferToTexture(m_width, m_height, rgba.data, inputTexture);​
​
摄像头采集​
该信息用于提供输入图像数据。摄像头图像信息由宿主应用主动传入摄像头id,交由opencv或者其他sdk代码进行视频采集,格式转换等,并将获取的图像 / 视频以帧数据形式输入 SDK 处理,SDK 不主动采集图片、视频信息。​
摄像头输入:​
​
cv::VideoCapture m_capture;​
m_capture.open(0); //打开camere 0​
if (!m_capture.isOpened())​
{​
std::cout << "OpenCV 打开camera 0失败\n" << std::endl;​
return 5;​
}​
cv::Mat &bgr​
m_capture.read(bgr);//读一帧​
//bgr转rgba​
cv::Mat rgba;​
cv::cvtColor(bgr, rgba, cv::COLOR_BGR2RGBA);​
//buffer转texture​
unsigned int inputTexture = createTexture();​
updateBufferToTexture(m_width, m_height, rgba.data, inputTexture);​
​
​
​
最近更新时间:2026.10.28 15:55:28
这个页面对您有帮助吗?
有用
有用
无用
无用