ขวาไปซ้าย

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

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

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

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

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

การใช้ MediaItem

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

Kotlin

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

Groovy

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

จากนั้นคุณจะสร้าง 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()

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

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

โดยค่าเริ่มต้น RtspMediaSource จะใช้ Socket Factory มาตรฐานของ 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(socketFactory)
    .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(socketFactory)
        .createMediaSource(MediaItem.fromUri(rtspUri));