ExoPlayer hỗ trợ cả RTSP trực tiếp và theo yêu cầu. Dưới đây là danh sách các định dạng mẫu và loại mạng được hỗ trợ.
Định dạng mẫu được hỗ trợ
- H264 (nội dung mô tả nội dung nghe nhìn SDP phải bao gồm dữ liệu SPS/PPS trong thuộc tính fmtp để khởi chạy bộ giải mã).
- AAC (với luồng bit ADTS).
- AC3.
Các loại mạng được hỗ trợ
- RTP qua giao thức truyền tin một địa chỉ UDP (không hỗ trợ truyền tin đa địa chỉ).
- RTSP, RTP được xếp kề nhau qua RTSP bằng TCP.
Sử dụng MediaItem
Để phát luồng RTSP, bạn cần phụ thuộc vào mô-đun RTSP.
Kotlin
implementation("androidx.media3:media3-exoplayer-rtsp:1.4.1")
Groovy
implementation "androidx.media3:media3-exoplayer-rtsp:1.4.1"
Sau đó, bạn có thể tạo MediaItem
cho URI RTSP và truyền URI đó đến trình phát.
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();
Xác thực
ExoPlayer hỗ trợ phát bằng phương thức xác thực RTSP BASIC và DIGEST. Để phát nội dung RTSP được bảo vệ, bạn phải định cấu hình URI của MediaItem
bằng thông tin xác thực. Cụ thể, URI phải ở dạng rtsp://<username>:<password>@<host address>
.
Sử dụng RtspMediaSource
Để có thêm tuỳ chọn tuỳ chỉnh, bạn có thể tạo RtspMediaSource
và truyền trực tiếp RtspMediaSource
đó đến trình phát thay vì 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();
Sử dụng RTSP qua NAT (hỗ trợ RTP/TCP)
ExoPlayer sử dụng UDP làm giao thức mặc định để truyền RTP.
Khi truyền trực tuyến RTSP qua lớp NAT, NAT có thể không thể chuyển tiếp các gói RTP/UDP đến thiết bị. Điều này xảy ra nếu NAT thiếu liên kết cổng UDP cần thiết. Nếu ExoPlayer phát hiện không có gói RTP nào đến trong một thời gian và quá trình phát chưa bắt đầu, thì ExoPlayer sẽ huỷ phiên phát RTSP hiện tại và thử phát lại bằng RTP-over-RTSP (truyền các gói RTP bằng kết nối TCP đã mở cho RTSP).
Bạn có thể tuỳ chỉnh thời gian chờ để thử lại bằng TCP bằng cách gọi phương thức RtspMediaSource.Factory.setTimeoutMs()
. Ví dụ: nếu thời gian chờ được đặt thành bốn giây, thì người chơi sẽ thử lại bằng TCP sau bốn giây không hoạt động của UDP.
Việc đặt thời gian chờ cũng ảnh hưởng đến logic phát hiện khi kết thúc luồng. Tức là, ExoPlayer sẽ báo cáo quá trình phát đã kết thúc nếu không nhận được gì trong thời gian chờ đã đặt. Việc đặt giá trị này quá nhỏ có thể dẫn đến tín hiệu kết thúc luồng sớm trong điều kiện mạng kém.
RTP/TCP mang lại khả năng tương thích tốt hơn trong một số chế độ thiết lập mạng. Bạn có thể định cấu hình ExoPlayer để sử dụng RTP/TCP theo mặc định bằng RtspMediaSource.Factory.setForceUseRtpTcp()
.
Truyền SocketFactory tuỳ chỉnh
Các thực thể SocketFactory
tuỳ chỉnh có thể hữu ích khi cần định tuyến cụ thể (ví dụ: khi lưu lượng truy cập RTSP cần phải chuyển qua một giao diện cụ thể hoặc ổ cắm cần thêm cờ kết nối).
Theo mặc định, RtspMediaSource
sẽ sử dụng nhà máy ổ cắm tiêu chuẩn của Java (SocketFactory.getDefault()
) để tạo kết nối với các điểm cuối từ xa.
Bạn có thể ghi đè hành vi này bằng cách sử dụng 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));