รองรับการเปลี่ยนเวลา

ใช้ API การเลื่อนเวลาในบริการอินพุตทีวีเพื่อให้ผู้ใช้หยุดชั่วคราว กรอกลับ และกรอไปข้างหน้าโปรแกรมที่กำลังออกอากาศสดในช่องบริการของคุณได้ หากแอปของคุณรองรับการเลื่อนเวลา ผู้ใช้จะมีความยืดหยุ่นมากขึ้นในการดูเนื้อหาของคุณ ดังนี้

  • ผู้ใช้สามารถหยุดโปรแกรมชั่วคราวขณะจัดการกับการหยุดชะงักระยะสั้น เพื่อไม่ให้พลาดช่วงเวลาสำคัญ
  • ผู้ใช้สามารถกรอไปข้างหน้าเนื้อหาที่เคยดูแล้วหรือเนื้อหาที่ ไม่สนใจ
  • ผู้ใช้สามารถกรอกลับและดูช่วงเวลาที่ชื่นชอบในเนื้อหาโปรแกรมอีกครั้ง
รูปที่ 1 ตัวควบคุมการเล่นของ Android TV ที่ใช้สำหรับการเลื่อนเวลา

การเลื่อนเวลาใช้ส่วนย่อยของข้อมูลโปรแกรมที่บันทึกไว้ชั่วคราวในระยะสั้นเพื่อใช้ความสามารถในการเล่นโปรแกรมที่กำลังออกอากาศสด ผู้ใช้ไม่สามารถเล่นไฟล์บันทึกการเลื่อนเวลาเหล่านี้ภายนอกเซสชันการเล่นปัจจุบัน ซึ่งหมายความว่าผู้ใช้ไม่สามารถใช้การเลื่อนเวลาเพื่อหยุดโปรแกรมชั่วคราวเพื่อดูในวันถัดไป หรือหยุดโปรแกรมชั่วคราวเพื่อดูในภายหลังขณะเปลี่ยนไปใช้ช่องอื่น

ใช้ API การบันทึกทีวี หากต้องการ ให้ผู้ใช้บันทึกเนื้อหาโปรแกรมเพื่อดูภายนอกเซสชันการเล่น ปัจจุบัน

เพิ่มการรองรับการเลื่อนเวลา

หากต้องการเพิ่มการรองรับการเลื่อนเวลาในบริการอินพุตทีวี คุณต้องใช้ API การเลื่อนเวลาในคลาส TvInputService.Session จัดการการบันทึกและการเล่นไฟล์บันทึกการเลื่อนเวลาในแอป และแจ้งให้ระบบทราบว่าบริการอินพุตของคุณรองรับการเลื่อนเวลา

เมธอด TvInputService.Session ที่คุณใช้มีดังนี้

  • onTimeShiftGetCurrentPosition(): ระบบเรียกใช้เพื่อรับตำแหน่งการเล่นปัจจุบันเป็นมิลลิวินาที ดูรายละเอียดเพิ่มเติมได้ที่ส่วน ติดตามเวลาการเล่น
  • onTimeShiftGetStartPosition(): ระบบเรียกใช้เพื่อรับตำแหน่งเริ่มต้น ของไฟล์บันทึกการเลื่อนเวลาปัจจุบันเป็นมิลลิวินาที ดูรายละเอียดเพิ่มเติมได้ที่ ดูส่วนติดตามเวลาการเล่น
  • onTimeShiftPause(): ระบบเรียกใช้เมื่อผู้ใช้หยุดการเล่นชั่วคราว
  • onTimeShiftResume(): ระบบเรียกใช้เมื่อผู้ใช้เล่นต่อ
  • onTimeShiftSeekTo(long): ระบบเรียกใช้เมื่อต้องการค้นหาตำแหน่งเวลาใหม่ โดยปกติแล้วตำแหน่งใหม่จะอยู่ระหว่างตำแหน่ง ตำแหน่งเริ่มต้นกับตำแหน่งปัจจุบัน
  • onTimeShiftSetPlaybackParams(PlaybackParams): ระบบเรียกใช้เพื่อระบุพารามิเตอร์การเล่น เช่น ความเร็วในการเล่น สำหรับเซสชันปัจจุบัน ดูรายละเอียดเพิ่มเติมได้ที่ส่วน รองรับพารามิเตอร์การเล่น

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีแจ้งให้ระบบทราบว่าบริการอินพุตของคุณรองรับ การเลื่อนเวลาได้ที่ ส่วนแจ้งให้ระบบทราบเกี่ยวกับสถานะการเลื่อนเวลา

หากคุณใช้ TIF Companion Library เพื่อใช้คลาส TvInputService.Session คุณจะได้รับการใช้งานการเลื่อนเวลาที่ใช้ ExoPlayer โดยอัตโนมัติ คุณสามารถใช้การใช้งานนี้หรือลบล้างเมธอด API การเลื่อนเวลาใน BaseTvInputService.Session และระบุการใช้งานของคุณเอง ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้ TIF Companion Library ได้ที่หัวข้อ สร้างบริการอินพุตทีวีโดยใช้ TIF Companion Library

บันทึกเนื้อหาเมื่อเริ่มเซสชัน

ผู้ใช้สามารถหยุดชั่วคราว กรอกลับ และกรอไปข้างหน้าเนื้อหาโปรแกรมได้โดยเข้าถึงตัวควบคุมการเล่นของช่อง ไม่ว่าจะโดยการกดเลือก ขณะดูเนื้อหา แล้วไปยังตัวควบคุมการเล่น หรือใช้ตัวควบคุมการเล่นเฉพาะในอุปกรณ์ระยะไกล

เนื่องจากผู้ใช้สามารถใช้การเลื่อนเวลาได้ทุกเมื่อขณะดูเนื้อหาโปรแกรม บริการอินพุตทีวีของคุณจึงต้องเริ่มบันทึกเนื้อหาการเลื่อนเวลาทันทีที่ผู้ใช้ปรับไปที่ช่องในฟังก์ชัน onTune() นอกจากนี้ คุณยังต้อง แจ้งให้ระบบทราบว่าคุณสามารถบันทึกได้โดยเรียกใช้ notifyTimeShiftStatusChanged(int), ตามที่อธิบายไว้ใน ส่วนแจ้งให้ระบบทราบเกี่ยวกับสถานะการเลื่อนเวลา

จัดการพื้นที่เก็บข้อมูลเนื้อหาที่บันทึกไว้

บริการอินพุตทีวีของคุณมีหน้าที่จัดเก็บไฟล์บันทึกการเลื่อนเวลาในพื้นที่เก็บข้อมูลส่วนตัวของแอป และเล่นเนื้อหาเมื่อระบบเรียกใช้เมธอดการเลื่อนเวลา เช่น onTimeShiftResume() หากเนื้อหาจัดเก็บไว้ในระบบคลาวด์อยู่แล้วและแอปของคุณจัดการไฟล์บันทึกการเลื่อนเวลาในระบบคลาวด์ได้ คุณสามารถใช้พื้นที่เก็บข้อมูลในระบบคลาวด์แทนพื้นที่เก็บข้อมูลของแอป

หากเนื้อหาใช้เนื้อหาที่ได้รับการคุ้มครอง บริการอินพุตทีวีของคุณมีหน้าที่เข้ารหัสเนื้อหาที่บันทึกไว้อย่างเหมาะสมและถอดรหัสเนื้อหาในระหว่างการเล่น

เนื่องจากเนื้อหาวิดีโอที่บันทึกไว้อาจต้องใช้พื้นที่เก็บข้อมูลจำนวนมาก คุณจึงต้องจัดการเนื้อหาที่บันทึกไว้อย่างระมัดระวังระหว่างการเล่นเซสชัน หากเวลาเซสชันการเล่นเกินจำนวนเวลาที่คุณบันทึกและจัดเก็บไว้สำหรับการเลื่อนเวลา ให้ปรับการบันทึกการเลื่อนเวลาเพื่อรักษาบัฟเฟอร์ปัจจุบันไว้ แต่ต้องแน่ใจว่าได้บันทึกเวลาปัจจุบันไว้ ตัวอย่างเช่น หากผู้ใช้เล่นเนื้อหามา 31 นาทีแล้วและขนาดการบันทึกการเลื่อนเวลาสูงสุดของคุณคือ 30 นาที ให้ปรับการบันทึกและเวลาเริ่มต้นให้มีเนื้อหาตั้งแต่นาทีที่ 1 ถึงนาทีที่ 31

หากบริการอินพุตทีวีของคุณไม่รองรับการเลื่อนเวลาเนื่องจากพื้นที่เก็บข้อมูลไม่เพียงพอ คุณต้องแจ้งให้ระบบทราบ ดูรายละเอียดเพิ่มเติมเกี่ยวกับวิธีแจ้งให้ระบบทราบเกี่ยวกับข้อจำกัดในการรองรับการเลื่อนเวลาได้ที่ส่วน แจ้งให้ระบบทราบเกี่ยวกับสถานะการเลื่อนเวลา

เมื่อผู้ใช้เปลี่ยนไปใช้ช่องอื่นหรือสิ้นสุดเซสชันการเล่น ให้ลบข้อมูลการเลื่อนเวลาที่บันทึกไว้

แจ้งให้ระบบทราบเกี่ยวกับสถานะการเลื่อนเวลา

หากบริการอินพุตทีวีของคุณรองรับการเลื่อนเวลา ให้เรียกใช้ notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_AVAILABLE) ในการใช้งาน onTune() เมื่อผู้ใช้ปรับไปที่ช่อง

หากต้องการแจ้งให้ระบบทราบหากความสามารถในการเลื่อนเวลาของบริการอินพุตมีการเปลี่ยนแปลง ให้ใช้ notifyTimeShiftStatusChanged(int) ตัวอย่างเช่น หากบริการอินพุตทีวีของคุณไม่รองรับการเลื่อนเวลาเนื่องจากข้อจำกัดด้านพื้นที่เก็บข้อมูลหรือเหตุผลอื่นๆ ให้เรียกใช้ notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNAVAILABLE)

หากบริการอินพุตทีวีของคุณไม่รองรับการเลื่อนเวลาเลย ให้เรียกใช้ notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNSUPPORTED) เมื่อสร้างเซสชันการเล่น ระบบจะถือว่าบริการอินพุตที่ไม่เคยเรียกใช้ notifyTimeShiftStatusChanged() เป็นบริการอินพุตที่ไม่รองรับการเลื่อนเวลา ซึ่งครอบคลุมบริการอินพุตที่ใช้ API ระดับ 22 และต่ำกว่า

ติดตามเวลาการเล่น

ตำแหน่งเริ่มต้นของไฟล์บันทึกการเลื่อนเวลาคือตำแหน่งเวลาสัมบูรณ์ที่เร็วที่สุดเป็นมิลลิวินาทีตั้งแต่ Epoch ที่ผู้ใช้สามารถค้นหาได้ โดยปกติแล้วจะเป็นเวลาที่การเล่นวิดีโอเริ่มขึ้นหลังจากเรียกใช้ onTune() อย่างไรก็ตาม เมื่อผู้ใช้ดูเนื้อหาจำนวนมากเกินกว่าที่แอปของคุณจะบันทึกได้ คุณต้องเริ่มบันทึกส่วนใหม่สำหรับการเลื่อนเวลาและอัปเดตเวลาเริ่มต้นตามความเหมาะสม

ตำแหน่งปัจจุบันของไฟล์บันทึกการเลื่อนเวลาคือตำแหน่งการเล่นปัจจุบันเป็นมิลลิวินาทีตั้งแต่ Epoch ตำแหน่งนี้จะเปลี่ยนแปลงอย่างต่อเนื่องระหว่างการเล่น โดยปกติแล้วคุณสามารถใช้เครื่องมือการเล่นเพื่อกำหนดค่านี้ได้ ดังที่แสดงในตัวอย่างต่อไปนี้

Kotlin

override fun onTimeShiftGetCurrentPosition(): Long =
        tvPlayer?.run {
            currentProgram?.let { program ->
                currentPosition + program.startTimeUtcMillis
            }
        } ?: TvInputManager.TIME_SHIFT_INVALID_TIME

Java

@Override
public long onTimeShiftGetCurrentPosition() {
  if (getTvPlayer() != null && currentProgram != null) {
    return getTvPlayer().getCurrentPosition() +
      currentProgram.getStartTimeUtcMillis();
  }
  return TvInputManager.TIME_SHIFT_INVALID_TIME;
}

ตรวจสอบว่าเวลาเริ่มต้นที่คุณระบุเมื่อระบบเรียกใช้ onTimeShiftGetStartPosition() ไม่มากกว่าตำแหน่งเวลาปัจจุบันที่คุณระบุใน onTimeShiftGetCurrentPosition() ระบบใช้การเรียกเหล่านี้เพื่ออัปเดตระยะเวลาการเลื่อนเวลาใน UI ตัวควบคุมการเล่น

รองรับพารามิเตอร์การเล่น

ระบบใช้พารามิเตอร์การเล่นเพื่อเปลี่ยนความเร็วในการเล่นระหว่างการเลื่อนเวลา ตัวอย่างเช่น หากผู้ใช้ตัดสินใจกรอกลับการเล่นปัจจุบัน ระบบจะส่งพารามิเตอร์การเล่นใหม่ไปยังแอปของคุณโดยมีความเร็วในการเล่นเป็นค่าลบ นอกจากนี้ การเลื่อนเวลายังรองรับความเร็วในการเล่นหลายระดับ เช่น 2 เท่าหรือ 3 เท่าสำหรับการกรอกลับหรือกรอไปข้างหน้า

ระบบจะเรียกใช้เมธอด onTimeShiftSetPlaybackParams(PlaybackParams) ด้วยออบเจ็กต์ PlaybackParams ที่มี พารามิเตอร์สำหรับเซสชันปัจจุบัน ใช้ข้อมูลนี้เพื่อกำหนดค่าเครื่องมือการเล่นสื่ออย่างเหมาะสม

หากเครื่องมือการเล่นไม่รองรับพารามิเตอร์ ให้จำลองลักษณะการทำงานที่คาดไว้ให้ดีที่สุด ตัวอย่างเช่น หากเครื่องมือการเล่นไม่รองรับความเร็ว 2 เท่า ให้ใช้การดำเนินการค้นหาซ้ำๆ ในเครื่องมือการเล่นเพื่อให้ได้ความเร็วในการเล่นประมาณ 2 เท่า

หลังจากตั้งค่าพารามิเตอร์แล้ว อย่าเปลี่ยนการตั้งค่าเว้นแต่ผู้ใช้จะออกคำสั่งการเล่นที่ต้องใช้พารามิเตอร์อื่นหรือเปลี่ยนไปใช้ช่องใหม่