RTSP

ExoPlayer hỗ trợ cả RTSP trực tiếp và theo yêu cầu. Bạn có thể xem danh sách các định dạng mạng và định dạng mẫu được hỗ trợ bên dưới.

Đị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.

Loại mạng được hỗ trợ

  • RTP qua UDP unicast (không hỗ trợ phát đa hướng).
  • RTSP xen kẽ, RTP qua RTSP bằng TCP.

Sử dụng MediaItem

Để phát luồng RTSP, bạn cần phải phụ thuộc vào mô-đun RTSP.

Kotlin

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

Groovy

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

Sau đó, bạn có thể tạo một MediaItem cho URI RTSP và truyền URI đó cho 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 lại bằng phương thức xác thực RTSP BASIC và IFS. Để 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 có dạng rtsp://<username>:<password>@<host address>.

Sử dụng RtspMediaSource

Để có thêm lựa chọn tuỳ chỉnh, bạn có thể tạo RtspMediaSource và truyền trực tiếp đế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 phía sau NAT (hỗ trợ RTP/TCP)

ExoPlayer sử dụng UDP làm giao thức mặc định để truyền tải RTP.

Khi truyền trực tuyến RTSP phía sau lớp NAT, NAT có thể không 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 sự liên kết cổng UDP cần thiết. Nếu ExoPlayer phát hiện chưa có gói RTP đến trong một thời gian và quá trình phát chưa bắt đầu, ExoPlayer sẽ chia phiên phát RTSP hiện tại rồi thử phát lại bằng RTP qua RTSP (truyền phát các gói RTP bằng kết nối TCP được 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 4 giây, thì người chơi sẽ thử lại bằng TCP sau 4 giây nếu UDP không hoạt động.

Việc đặt thời gian chờ cũng ảnh hưởng đến logic phát hiện cuối luồng. Điều này nghĩa là ExoPlayer sẽ báo cáo quá trình phát đã kết thúc nếu không nhận được thiết bị nào trong khoảng thời gian chờ đã đặt. Việc đặt giá trị này quá nhỏ có thể dẫn đến tín hiệu cuối luồng sớm trong điều kiện mạng kém.

RTP/TCP cung cấp khả năng tương thích tốt hơn trong một số 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 với RtspMediaSource.Factory.setForceUseRtpTcp().

Truyền một 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 truyền 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 socket tiêu chuẩn của Java (SocketFactory.getDefault()) để tạo kết nối đến các điểm cuối từ xa. Bạn có thể ghi đè hành vi này bằ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));