ทําความเข้าใจวงจรการปรับปรุงสื่อในโหมด Surface

Media Enhancement API มีโซลูชัน AI ในอุปกรณ์ที่มีเวลาในการตอบสนองต่ำ รักษาความเป็นส่วนตัว ซึ่งใช้ประโยชน์จากการเร่งฮาร์ดแวร์เพื่อปรับปรุงสื่อคุณภาพสูง โดยไม่มีการขยายขนาด APK ดูข้อมูลเพิ่มเติมได้ที่ทำความเข้าใจ ความสามารถในการปรับปรุงสื่อ

แผนภาพสถาปัตยกรรมต่อไปนี้แสดงวงจรการดำเนินการโหมดพื้นผิวแบบไม่พร้อมกันของ Media Enhancement API โหมดนี้จะลิงก์บัฟเฟอร์ฮาร์ดแวร์ โดยตรงเพื่อขจัดคอขวดด้านประสิทธิภาพของการคัดลอกเฟรมที่ไม่ได้บีบอัด ไปมาในบัฟเฟอร์หน่วยความจำ CPU และ GPU

แผนภาพแสดงวงจรการใช้งานแบบอะซิงโครนัสจากต้นทางถึงปลายทาง 7 ขั้นตอนของ Media Enhancement API
รูปที่ 1 วงจรการดำเนินการของโหมดพื้นผิวแบบไม่พร้อมกันและขั้นตอนที่ดำเนินการได้ 7 ขั้นตอนของไปป์ไลน์การเพิ่มประสิทธิภาพ

ไปป์ไลน์การเพิ่มประสิทธิภาพจะดำเนินการผ่านขั้นตอนต่อไปนี้

ระยะที่ 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()