// Create a player instance.valplayer=ExoPlayer.Builder(context).build()// Set the media item to be played.player.setMediaItem(MediaItem.fromUri(rtspUri))// Prepare the player.player.prepare()
자바
// Create a player instance.ExoPlayerplayer=newExoPlayer.Builder(context).build();// Set the media item to be played.player.setMediaItem(MediaItem.fromUri(rtspUri));// Prepare the player.player.prepare();
인증
ExoPlayer는 RTSP 기본 및 다이제스트 인증을 사용한 재생을 지원합니다. 보호된 RTSP 콘텐츠를 재생하려면 MediaItem의 URI가 인증 정보로 구성되어야 합니다. 특히 URI는 rtsp://<username>:<password>@<host address> 형식이어야 합니다.
RtspMediaSource 사용
더 많은 맞춤설정 옵션을 사용하려면 MediaItem 대신 RtspMediaSource를 만들어 플레이어에 직접 전달하면 됩니다.
Kotlin
// Create an RTSP media source pointing to an RTSP uri.valmediaSource:MediaSource=RtspMediaSource.Factory().createMediaSource(MediaItem.fromUri(rtspUri))// Create a player instance.valplayer=ExoPlayer.Builder(context).build()// Set the media source to be played.player.setMediaSource(mediaSource)// Prepare the player.player.prepare()
자바
// Create an RTSP media source pointing to an RTSP uri.MediaSourcemediaSource=newRtspMediaSource.Factory().createMediaSource(MediaItem.fromUri(rtspUri));// Create a player instance.ExoPlayerplayer=newExoPlayer.Builder(context).build();// Set the media source to be played.player.setMediaSource(mediaSource);// Prepare the player.player.prepare();
NAT 뒤에서 RTSP 사용 (RTP/TCP 지원)
ExoPlayer는 RTP 전송의 기본 프로토콜로 UDP를 사용합니다.
NAT 레이어 뒤에서 RTSP를 스트리밍할 때 NAT가 수신되는 RTP/UDP 패킷을 기기로 전달하지 못할 수 있습니다. 이 문제는 NAT에 필요한 UDP 포트 매핑이 없는 경우 발생합니다. ExoPlayer가 한동안 수신되는 RTP 패킷이 없고 아직 재생이 시작되지 않았음을 감지하면 ExoPlayer는 현재 RTSP 재생 세션을 종료하고 RTP-over-RTSP를 사용하여 재생을 다시 시도합니다(RTSP용으로 열린 TCP 연결을 사용하여 RTP 패킷 전송).
TCP로 재시도하는 시간 제한은 RtspMediaSource.Factory.setTimeoutMs() 메서드를 호출하여 맞춤설정할 수 있습니다. 예를 들어 제한 시간이 4초로 설정된 경우 플레이어는 UDP 비활성 상태가 4초 지난 후 TCP로 재시도합니다.
제한 시간을 설정하면 스트림 종료 감지 로직에도 영향을 미칩니다. 즉, 설정된 제한 시간 동안 수신된 것이 없으면 ExoPlayer는 재생이 종료되었다고 보고합니다. 이 값을 너무 작게 설정하면 네트워크 상태가 좋지 않을 때 스트림이 일찍 종료될 수 있습니다.
RTP/TCP는 일부 네트워크 설정에서 더 나은 호환성을 제공합니다. RtspMediaSource.Factory.setForceUseRtpTcp()를 사용하여 기본적으로 RTP/TCP를 사용하도록 ExoPlayer를 구성할 수 있습니다.
맞춤 SocketFactory 전달
맞춤 SocketFactory 인스턴스는 특정 라우팅이 필요한 경우 (예: RTSP 트래픽이 특정 인터페이스를 통과해야 하거나 소켓에 추가 연결 플래그가 필요한 경우) 유용할 수 있습니다.
기본적으로 RtspMediaSource는 Java의 표준 소켓 팩토리(SocketFactory.getDefault())를 사용하여 원격 엔드포인트에 대한 연결을 만듭니다.
이 동작은 RtspMediaSource.Factory.setSocketFactory()를 사용하여 재정의할 수 있습니다.
Kotlin
// Create an RTSP media source pointing to an RTSP uri and override the socket// factory.valmediaSource:MediaSource=RtspMediaSource.Factory().setSocketFactory(...).createMediaSource(MediaItem.fromUri(rtspUri))
Java
// Create an RTSP media source pointing to an RTSP uri and override the socket// factory.MediaSourcemediaSource=newRtspMediaSource.Factory().setSocketFactory(...).createMediaSource(MediaItem.fromUri(rtspUri));
이 페이지에 나와 있는 콘텐츠와 코드 샘플에는 콘텐츠 라이선스에서 설명하는 라이선스가 적용됩니다. 자바 및 OpenJDK는 Oracle 및 Oracle 계열사의 상표 또는 등록 상표입니다.
최종 업데이트: 2025-08-27(UTC)
[[["이해하기 쉬움","easyToUnderstand","thumb-up"],["문제가 해결됨","solvedMyProblem","thumb-up"],["기타","otherUp","thumb-up"]],[["필요한 정보가 없음","missingTheInformationINeed","thumb-down"],["너무 복잡함/단계 수가 너무 많음","tooComplicatedTooManySteps","thumb-down"],["오래됨","outOfDate","thumb-down"],["번역 문제","translationIssue","thumb-down"],["샘플/코드 문제","samplesCodeIssue","thumb-down"],["기타","otherDown","thumb-down"]],["최종 업데이트: 2025-08-27(UTC)"],[],[],null,["# RTSP\n\nExoPlayer supports both live and on demand RTSP. Supported sample formats and\nnetwork types are listed below.\n\n### Supported sample formats\n\n- H264 (the SDP media description must include SPS/PPS data in the fmtp attribute for decoder initialization).\n- AAC (with ADTS bitstream).\n- AC3.\n\n| **Note:** Please comment on [this issue](https://github.com/google/ExoPlayer/issues/9210) to request support for additional sample formats.\n\n### Supported network types\n\n- RTP over UDP unicast (multicast is not supported).\n- Interleaved RTSP, RTP over RTSP using TCP.\n\nUsing MediaItem\n---------------\n\nTo play an RTSP stream, you need to depend on the RTSP module. \n\n### Kotlin\n\n```kotlin\nimplementation(\"androidx.media3:media3-exoplayer-rtsp:1.8.0\")\n```\n\n### Groovy\n\n```groovy\nimplementation \"androidx.media3:media3-exoplayer-rtsp:1.8.0\"\n```\n\nYou can then create a `MediaItem` for an RTSP URI and pass it to the player. \n\n### Kotlin\n\n```kotlin\n// Create a player instance.\nval player = ExoPlayer.Builder(context).build()\n// Set the media item to be played.\nplayer.setMediaItem(MediaItem.fromUri(rtspUri))\n// Prepare the player.\nplayer.prepare()\n```\n\n### Java\n\n```java\n// Create a player instance.\nExoPlayer player = new ExoPlayer.Builder(context).build();\n// Set the media item to be played.\nplayer.setMediaItem(MediaItem.fromUri(rtspUri));\n// Prepare the player.\nplayer.prepare();\n```\n\n\u003cbr /\u003e\n\n### Authentication\n\nExoPlayer supports playback with RTSP BASIC and DIGEST authentication. To play\nprotected RTSP content, the `MediaItem`'s URI must be configured with the\nauthentication info. Specifically, the URI should be of the form\n`rtsp://\u003cusername\u003e:\u003cpassword\u003e@\u003chost address\u003e`.\n\nUsing RtspMediaSource\n---------------------\n\nFor more customization options, you can create an `RtspMediaSource` and pass it\ndirectly to the player instead of a `MediaItem`. \n\n### Kotlin\n\n```kotlin\n// Create an RTSP media source pointing to an RTSP uri.\nval mediaSource: MediaSource =\nRtspMediaSource.Factory().createMediaSource(MediaItem.fromUri(rtspUri))\n// Create a player instance.\nval player = ExoPlayer.Builder(context).build()\n// Set the media source to be played.\nplayer.setMediaSource(mediaSource)\n// Prepare the player.\nplayer.prepare()\n```\n\n### Java\n\n```java\n// Create an RTSP media source pointing to an RTSP uri.\nMediaSource mediaSource =\n new RtspMediaSource.Factory().createMediaSource(MediaItem.fromUri(rtspUri));\n// Create a player instance.\nExoPlayer player = new ExoPlayer.Builder(context).build();\n// Set the media source to be played.\nplayer.setMediaSource(mediaSource);\n// Prepare the player.\nplayer.prepare();\n```\n\n\u003cbr /\u003e\n\nUsing RTSP behind a NAT (RTP/TCP support)\n-----------------------------------------\n\nExoPlayer uses UDP as the default protocol for RTP transport.\n\nWhen streaming RTSP behind a NAT layer, the NAT might not be able to forward the\nincoming RTP/UDP packets to the device. This occurs if the NAT lacks the\nnecessary UDP port mapping. If ExoPlayer detects there have not been incoming\nRTP packets for a while and the playback has not started yet, ExoPlayer tears\ndown the current RTSP playback session, and retries playback using RTP-over-RTSP\n(transmitting RTP packets using the TCP connection opened for RTSP).\n\nThe timeout for retrying with TCP can be customized by calling the method\n`RtspMediaSource.Factory.setTimeoutMs()`. For example, if the timeout is set to\nfour seconds, the player will retry with TCP after four seconds of UDP\ninactivity.\n\nSetting the timeout also affects the end-of-stream detection logic. That is,\nExoPlayer will report the playback has ended if nothing is received for the\nduration of the set timeout. Setting this value too small may lead to an early\nend-of-stream signal under poor network conditions.\n\nRTP/TCP offers better compatibility under some network setups. You can configure\nExoPlayer to use RTP/TCP by default with\n`RtspMediaSource.Factory.setForceUseRtpTcp()`.\n\n### Passing a custom SocketFactory\n\nCustom `SocketFactory` instances can be useful when particular routing is\nrequired (for example, when RTSP traffic needs to pass a specific interface, or the\nsocket needs additional connectivity flags).\n\nBy default, `RtspMediaSource` will use Java's standard socket factory\n(`SocketFactory.getDefault()`) to create connections to the remote endpoints.\nThis behavior can be overridden using\n`RtspMediaSource.Factory.setSocketFactory()`. \n\n### Kotlin\n\n```kotlin\n// Create an RTSP media source pointing to an RTSP uri and override the socket\n// factory.\nval mediaSource: MediaSource =\nRtspMediaSource.Factory()\n .setSocketFactory(...)\n .createMediaSource(MediaItem.fromUri(rtspUri))\n```\n\n### Java\n\n```java\n// Create an RTSP media source pointing to an RTSP uri and override the socket\n// factory.\nMediaSource mediaSource =\n new RtspMediaSource.Factory()\n .setSocketFactory(...)\n .createMediaSource(MediaItem.fromUri(rtspUri));\n```\n\n\u003cbr /\u003e"]]