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));