Media Enhancement API มีโซลูชัน AI ในอุปกรณ์ที่มีเวลาในการตอบสนองต่ำ รักษาความเป็นส่วนตัว ซึ่งใช้ประโยชน์จากการเร่งฮาร์ดแวร์เพื่อปรับปรุงสื่อคุณภาพสูง โดยไม่มีการขยายขนาด APK ดูข้อมูลเพิ่มเติมได้ที่ทำความเข้าใจ ความสามารถในการปรับปรุงสื่อ
แผนภาพสถาปัตยกรรมต่อไปนี้แสดงวงจรการดำเนินการโหมดพื้นผิวแบบไม่พร้อมกันของ Media Enhancement API โหมดนี้จะลิงก์บัฟเฟอร์ฮาร์ดแวร์ โดยตรงเพื่อขจัดคอขวดด้านประสิทธิภาพของการคัดลอกเฟรมที่ไม่ได้บีบอัด ไปมาในบัฟเฟอร์หน่วยความจำ CPU และ GPU
ไปป์ไลน์การเพิ่มประสิทธิภาพจะดำเนินการผ่านขั้นตอนต่อไปนี้
ระยะที่ 1 ตั้งค่าเซสชันการเพิ่มประสิทธิภาพ
1. ระบุพื้นผิวอินพุต: แอปของคุณมีเฟรมเวิร์กการเพิ่มประสิทธิภาพพร้อมแฮนเดิลพื้นผิวอินพุตเพื่อเข้าถึงเฟรมสำหรับการประมวลผล
2. ตั้งค่าพื้นผิวเอาต์พุต: แอปของคุณจัดสรรและเชื่อมโยงเป้าหมายการแสดงผล
(เช่น SurfaceView หรือ TextureView) กับเฟรมเวิร์กโดยตรง
ระยะที่ 2 สร้างเฟรมอินพุต
3. เตรียมสื่อพื้นฐาน: แอปจะดึงสื่อพื้นฐานที่ไม่มีการบีบอัด เช่น การอ่านไฟล์จากดิสก์ในเครื่อง
4. แทรกข้อมูลเฟรม: แอปจะเขียนเพย์โหลดรูปภาพดิบลงใน ไปป์ไลน์พื้นผิวอินพุตที่เชื่อมโยงโดยตรง
ระยะที่ 3 ประมวลผลและปรับปรุง
5. เรียกใช้การประมวลผลด้วย AI: เฟรมเวิร์กจะประมวลผลเฟรมใน GPU หรือ NPU ของอุปกรณ์ โดยใช้การปรับปรุงแมชชีนเลิร์นนิง เช่น การแมปโทน การปรับให้คมชัด หรือการเพิ่มความละเอียดของรูปภาพ
6. แสดงเฟรมที่ปรับปรุงแล้ว: เครื่องมือจะแสดงเฟรมที่ปรับปรุงแล้วแบบเต็มความละเอียด ไปยังพื้นผิวเอาต์พุตที่เชื่อมโยงโดยตรง
ระยะที่ 4 แสดงหรือบันทึกผลลัพธ์
7. เอาต์พุตสุดท้าย: แอปจะได้รับบัฟเฟอร์สตรีมฮาร์ดแวร์ที่ประมวลผลแล้ว เพื่อแสดงใน UI หรือบันทึกลงในที่เก็บข้อมูล
EnhancementSession เป็นออบเจ็กต์บริบทที่มีน้ำหนักมากซึ่งรักษาไปป์ไลน์หน่วยความจำ GPU หรือ NPU ที่ต่อเนื่อง โดยจะจัดสรร RAM สำหรับวิดีโอ (VRAM) โดยเฉพาะ
และจัดการระบบเนทีฟ โปรดปฏิบัติตามหลักการวงจรต่อไปนี้เพื่อป้องกันการรั่วไหลของหน่วยความจำอย่างรุนแรงและOutOfMemoryErrorการขัดข้องที่อาจเกิดขึ้น
- การเริ่มต้นออบเจ็กต์แบบเลื่อนเวลา: อย่าสร้างเซสชันจนกว่าผู้ใช้จะเริ่มการดำเนินการปรับปรุง
- การนำกลับมาใช้ใหม่เชิงกลยุทธ์: รักษาและนำอินสแตนซ์เซสชันเดียวกลับมาใช้ใหม่เมื่อ ประมวลผลสตรีมหรือเฟรมที่มีการกำหนดค่าเหมือนกัน (มิติข้อมูลและ ตัวเลือกที่สลับ)
- การวิเคราะห์พรอมต์: เรียกใช้
session.release()ทันทีเมื่อมีการสิ้นสุดงานที่เกี่ยวข้องกับภาพ เพื่อเพิ่มพื้นที่ว่างในทรัพยากรฮาร์ดแวร์ที่ใช้ร่วมกัน
เริ่มต้นเครื่องมือเพิ่มประสิทธิภาพ
วิธีนี้จะจัดระเบียบการตรวจสอบ 2 ขั้นตอน โดยจะตรวจสอบว่าฮาร์ดแวร์ของอุปกรณ์ รองรับการเร่งความเร็วหรือไม่ จากนั้นจะตรวจสอบว่ามีโมดูลแมชชีนเลิร์นนิงที่จำเป็น อยู่หรือไม่
การเรียกใช้ขั้นตอนนี้เป็นข้อกำหนดเบื้องต้นจะช่วยป้องกันไม่ให้การเริ่มต้นรันไทม์ล้มเหลวโดยการตรวจสอบความสามารถก่อนที่แอปจะพยายามประมวลผลสื่อ
class MediaSetupViewModel(application: Application) : AndroidViewModel(application) {
private val enhancementClient = Enhancement.getClient(application)
fun initializeEnhancementEngine() {
viewModelScope.launch {
try {
// 1. Verify hardware capability
val isSupported = enhancementClient.isDeviceSupportedAsync()
if (!isSupported) {
notifyUiDeviceIncompatible()
return@launch
}
// 2. Verify and download the Google Play services ML modules
val isInstalled = enhancementClient.isModuleInstalledAsync()
if (!isInstalled) {
notifyUiDownloadingModels()
enhancementClient.installModule().await()
}
notifyUiEngineReady()
} catch (e: Exception) {
// Handle potential errors during session creation or image
// processing.
handleInitializationError(e)
}
}
}
}
การใช้งาน: โหมดพื้นผิว (พื้นผิวเข้า พื้นผิวออก)
โหมดการดำเนินการของ Surface (EnhancementMode.SURFACE) ช่วยลดค่าใช้จ่ายด้านประสิทธิภาพ
ของการย้ายเฟรมระหว่างบัฟเฟอร์หน่วยความจำ CPU และ GPU แต่ไลบรารีการเพิ่มประสิทธิภาพจะแมปบัฟเฟอร์ฮาร์ดแวร์ดิบโดยตรง อ่านเฟรมจาก
Surface อินพุต ประมวลผลเฟรมแบบเนทีฟ และส่งเฟรมไปยัง Surface เอาต์พุตโดยตรง
ภาพรวมพื้นผิวแบบเฟรมเดียว
วิธีนี้ใช้เพื่อใช้เอฟเฟกต์กับเฟรมรูปภาพที่ถอดรหัสด้วยฮาร์ดแวร์เดียวอย่างมีประสิทธิภาพ
// Provisions input Surface (for example, ImageReader) and output Surface (for
// example, SurfaceView)
val inputSurface: Surface = imageReader.surface
val outputSurface: Surface = surfaceView.holder.surface
// 1. Configure parameters for SURFACE mode
val surfaceOptions = EnhancementOptions(
imageReader.width,
imageReader.height,
EnhancementMode.SURFACE,
enableTonemap = true,
enableDeblurDenoise = true,
enableFaceDetection = false
).also {
// 2. Bind hardware surfaces
it.setInputSurface(inputSurface)
it.setOutputSurface(outputSurface)
}
// 3. Create the session to process the hardware frame
val singleFrameSession = enhancementClient.createSessionAsync(surfaceOptions, executor)
// The API processes the single frame. Upon completion, release the session.
singleFrameSession.release()