ขวาไปซ้าย

ExoPlayer รองรับ RTSP ทั้งแบบสดและออนดีมานด์ รูปแบบตัวอย่างที่รองรับและ ประเภทเครือข่ายมีดังต่อไปนี้

รูปแบบตัวอย่างที่รองรับ

  • H264 (คำอธิบายสื่อ SDP ต้องมีข้อมูล SPS/PPS ใน fmtp สำหรับการเริ่มต้นตัวถอดรหัส)
  • AAC (ที่มีบิตสตรีม ADTS)
  • AC3

ประเภทเครือข่ายที่รองรับ

  • RTP ผ่าน UDP แบบ Unicast (ไม่รองรับมัลติแคสต์)
  • RTSP แบบแทรกสลับ, RTP ผ่าน RTSP โดยใช้ TCP

การใช้ MediaItem

หากต้องการเล่นสตรีม RTSP คุณต้องใช้โมดูล RTSP

Kotlin

implementation("androidx.media3:media3-exoplayer-rtsp:1.4.1")

ดึงดูด

implementation "androidx.media3:media3-exoplayer-rtsp:1.4.1"

จากนั้นคุณจะสร้าง MediaItem สำหรับ URI RTSP และส่งไปยังโปรแกรมเล่นได้

Kotlin

// Create a player instance.
val player = ExoPlayer.Builder(context).build()
// Set the media item to be played.
player.setMediaItem(MediaItem.fromUri(rtspUri))
// Prepare the player.
player.prepare()

Java

// Create a player instance.
ExoPlayer player = new ExoPlayer.Builder(context).build();
// Set the media item to be played.
player.setMediaItem(MediaItem.fromUri(rtspUri));
// Prepare the player.
player.prepare();

การตรวจสอบสิทธิ์

ExoPlayer รองรับการเล่นด้วยการตรวจสอบสิทธิ์ RTSP BASIC และ DIGEST เพื่อเล่น เนื้อหา RTSP ที่มีการป้องกัน คุณต้องกำหนดค่า URI ของ MediaItem ด้วยเมธอด ข้อมูลการตรวจสอบสิทธิ์ กล่าวโดยละเอียดคือ URI ควรอยู่ในรูปแบบ rtsp://<username>:<password>@<host address>

การใช้ RtspMediaSource

หากต้องการตัวเลือกการปรับแต่งเพิ่มเติม คุณสามารถสร้าง RtspMediaSource และส่งต่อ ไปยังโปรแกรมเล่นโดยตรง แทนที่จะเป็น MediaItem

Kotlin

// Create an RTSP media source pointing to an RTSP uri.
val mediaSource: MediaSource =
RtspMediaSource.Factory().createMediaSource(MediaItem.fromUri(rtspUri))
// Create a player instance.
val player = ExoPlayer.Builder(context).build()
// Set the media source to be played.
player.setMediaSource(mediaSource)
// Prepare the player.
player.prepare()

Java

// Create an RTSP media source pointing to an RTSP uri.
MediaSource mediaSource =
    new RtspMediaSource.Factory().createMediaSource(MediaItem.fromUri(rtspUri));
// Create a player instance.
ExoPlayer player = new ExoPlayer.Builder(context).build();
// Set the media source to be played.
player.setMediaSource(mediaSource);
// Prepare the player.
player.prepare();

การใช้ RTSP ด้านหลัง NAT (รองรับ RTP/TCP)

ExoPlayer ใช้ UDP เป็นโปรโตคอลเริ่มต้นสำหรับการรับส่งข้อมูล RTP

เมื่อสตรีม RTSP หลังเลเยอร์ NAT อาจทำให้ NAT อาจไม่สามารถส่งต่อ แพ็กเก็ต RTP/UDP ขาเข้าไปยังอุปกรณ์ กรณีนี้จะเกิดขึ้นหาก NAT ไม่มี การแมปพอร์ต UDP ที่จำเป็น หากตรวจพบว่าไม่มี ExoPlayer เข้ามา แพ็กเก็ต RTP เป็นระยะเวลาหนึ่งและยังไม่เริ่มเล่น ExoPlayer น้ำตาไหล ปิดเซสชันการเล่น RTSP ปัจจุบัน และพยายามเล่นซ้ำโดยใช้ RTP-over-RTSP (การส่งแพ็กเก็ต RTP โดยใช้การเชื่อมต่อ TCP ที่เปิดอยู่สำหรับ RTSP)

การหมดเวลาในการลองอีกครั้งด้วย TCP สามารถปรับแต่งได้โดยการเรียกใช้เมธอด RtspMediaSource.Factory.setTimeoutMs() เช่น หากตั้งค่าระยะหมดเวลาเป็น 4 วินาที โปรแกรมเล่นจะลองอีกครั้งโดยใช้ TCP หลังจาก UDP 4 วินาที การไม่ใช้งาน

การตั้งค่าระยะหมดเวลาจะส่งผลต่อตรรกะการตรวจหาตอนท้ายสตรีมด้วย นั่นคือ ExoPlayer จะรายงานว่าการเล่นจบลงแล้วหากไม่มีการรับการแจ้งเตือน ของระยะหมดเวลาที่กำหนดไว้ การตั้งค่านี้น้อยเกินไปอาจทำให้ สัญญาณตอนท้ายของสตรีมภายใต้สภาวะของเครือข่ายที่ไม่ดี

ซึ่ง RTP/TCP สามารถใช้งานร่วมกับการตั้งค่าเครือข่ายบางรูปแบบได้ดีกว่า คุณสามารถกำหนดค่า ExoPlayer เพื่อใช้ RTP/TCP โดยค่าเริ่มต้น RtspMediaSource.Factory.setForceUseRtpTcp()

การส่ง Socketfactor ที่กำหนดเอง

อินสแตนซ์ SocketFactory ที่กำหนดเองจะมีประโยชน์เมื่อการกำหนดเส้นทางเฉพาะ (เช่น เมื่อการรับส่งข้อมูล RTSP ต้องผ่านอินเทอร์เฟซหนึ่งๆ หรือ socket ต้องมีแฟล็กการเชื่อมต่อเพิ่มเติม)

โดยค่าเริ่มต้น RtspMediaSource จะใช้โรงงานซ็อกเก็ตมาตรฐานของ Java (SocketFactory.getDefault()) เพื่อสร้างการเชื่อมต่อกับปลายทางระยะไกล คุณสามารถลบล้างลักษณะการทำงานนี้ได้โดยใช้ RtspMediaSource.Factory.setSocketFactory()

Kotlin

// Create an RTSP media source pointing to an RTSP uri and override the socket
// factory.
val mediaSource: MediaSource =
RtspMediaSource.Factory()
    .setSocketFactory(...)
    .createMediaSource(MediaItem.fromUri(rtspUri))

Java

// Create an RTSP media source pointing to an RTSP uri and override the socket
// factory.
MediaSource mediaSource =
    new RtspMediaSource.Factory()
        .setSocketFactory(...)
        .createMediaSource(MediaItem.fromUri(rtspUri));