ExoPlayer hỗ trợ cả RTSP trực tiếp và theo yêu cầu. Các định dạng mẫu được hỗ trợ và được liệt kê bên dưới.
Định dạng mẫu được hỗ trợ
- H264 (phần mô tả nội dung nghe nhìn SDP phải bao gồm dữ liệu SPS/PPS trong 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 UDP unicast (không hỗ trợ phát đa hướng).
- RTSP xen kẽ, RTP qua RTSP dùng giao thức 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 đó cho người chơi.
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 với xác thực RTSP BASIC và PWA. Để chơi
nội dung RTSP được bảo vệ, thì URI của MediaItem
phải được định cấu hình bằng thuộc tính
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 lựa chọn tuỳ chỉnh, bạn có thể tạo một RtspMediaSource
rồi truyền vào đó
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 sau NAT (hỗ trợ RTP/TCP)
ExoPlayer sử dụng UDP làm giao thức mặc định cho truyền tải RTP.
Khi truyền trực tuyến RTSP sau lớp NAT, NAT có thể không chuyển tiếp được gói RTP/UDP tới thiết bị. Điều này xảy ra nếu NAT thiếu ánh xạ cổng UDP cần thiết. Nếu ExoPlayer phát hiện không có tín hiệu đến Gói RTP trong một thời gian và quá trình phát chưa bắt đầu, ExoPlayer bị xé hình giảm phiên phát RTSP hiện tại và thử phát lại bằng RTP-over-RTSP (truyền gói RTP sử dụng kết nối TCP được mở cho RTSP).
Bạn có thể tuỳ chỉnh thời gian chờ để thử lại với 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
sau 4 giây, người chơi sẽ thử lại bằng TCP sau 4 giây của UDP
trạng thái 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. 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ì cho của thời gian chờ đã đặt. Việc đặt giá trị này quá nhỏ có thể dẫn đến việc tín hiệu cuối luồng 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 khi 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 một quá trình định tuyến cụ thể
bắt buộc (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 ổ cắm 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 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));