androidx / androidx/media

RTSP missing attribute fmtp

Open
#901 5 comments 0 reactions 1 assignee View on GitHub

@microkatz is already working on this.

Since Dec 15, 2023.

needs triage question
Dominant language
Java
Stars
3k
Forks
955
Avg merge
12d 14h
Merged PRs (30d)
2

Description

Hello,

I'm attempting to play a camera stream using ExoPlayer, but I'm encountering an issue.

My code is very simple :

    val mediaSource: MediaSource = RtspMediaSource.Factory()
        .setDebugLoggingEnabled(true)
        .createMediaSource(MediaItem.fromUri("rtsp://user:password@camera.domain.com:14500"))

    val exoPlayer = ExoPlayer.Builder(context).build()
    exoPlayer.setMediaSource(mediaSource)
    exoPlayer.prepare()
    exoPlayer.playWhenReady = true

I'm facing the same problem with two models of Hikvision cameras.
The connection and authentication work well, but the DESCRIBE operation fails due to the absence of the "fmtp" attribute. I've tested other apps using ExoPlayer, and the stream functions correctly.
So I believe I may have missed something in my configuration.

Debug Log From RtspMediaSource :

OPTIONS rtsp://camera.domain.com:14500 RTSP/1.0
User-Agent: AndroidXMedia3/1.2.0
CSeq: 0

RTSP/1.0 200 OK
CSeq: 0
Public: OPTIONS, DESCRIBE, PLAY, PAUSE, SETUP, TEARDOWN, SET_PARAMETER, GET_PARAMETER
Date:  Sun, Feb 28 1971 00:51:09 GMT

DESCRIBE rtsp://camera.domain.com:14500 RTSP/1.0
User-Agent: AndroidXMedia3/1.2.0
CSeq: 1

RTSP/1.0 401 Unauthorized
CSeq: 1
WWW-Authenticate: Digest realm="IP Camera", nonce="xxxxxxxxxxxxxxxxxxxxxxxx", stale="FALSE"
DESCRIBE rtsp://camera.domain.com:14500 RTSP/1.0
Date:  Sun, Feb 28 1971 00:51:09 GMT

DESCRIBE rtsp://camera.domain.com:14500 RTSP/1.0
User-Agent: AndroidXMedia3/1.2.0
CSeq: 2
Authorization: Digest username="user", realm="IP Camera(F9905)", nonce="xxxxxxxxxxxxxxxxxxxxxxxx", uri="rtsp://camera.domain.com:14500", response="yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"

RTSP/1.0 200 OK
CSeq: 2
Content-Type: application/sdp
Content-Base: rtsp://camera.domain.com:14500/
Content-Length: 447

v=0
o=- 36549693291690 36549693291690 IN IP4 192.168.1.104
s=Media Presentation
e=NONE
b=AS:5050
t=0 0
a=control:rtsp://camera.domain.com:14500/
m=video 0 RTP/AVP 96
c=IN IP4 0.0.0.0
b=AS:5000
a=recvonly
a=x-dimensions:1920,1080
a=control:rtsp://camera.domain.com:14500/trackID=1
a=rtpmap:96 H265/90000
a=Media_header:MEDIAINFO=494D4B48000000000000050000000000000000000000000000000000000000000000000000000000;
a=appversion:1.0

Stack Trace of the ExoPlaybackException

Playback error
androidx.media3.exoplayer.ExoPlaybackException: Source error
  at androidx.media3.exoplayer.ExoPlayerImplInternal.handleIoException(ExoPlayerImplInternal.java:701)
  at androidx.media3.exoplayer.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:677)
  at android.os.Handler.dispatchMessage(Handler.java:102)
  at android.os.Looper.loopOnce(Looper.java:201)
  at android.os.Looper.loop(Looper.java:288)
  at android.os.HandlerThread.run(HandlerThread.java:67)
Caused by: java.io.IOException: java.lang.IllegalArgumentException: missing attribute fmtp
  at androidx.media3.exoplayer.rtsp.RtspMediaPeriod$InternalListener.onSessionTimelineRequestFailed(RtspMediaPeriod.java:699)
  at androidx.media3.exoplayer.rtsp.RtspClient.dispatchRtspError(RtspClient.java:334)
  at androidx.media3.exoplayer.rtsp.RtspClient.access$700(RtspClient.java:76)
  at androidx.media3.exoplayer.rtsp.RtspClient$MessageListener.handleRtspResponse(RtspClient.java:694)
  at androidx.media3.exoplayer.rtsp.RtspClient$MessageListener.handleRtspMessage(RtspClient.java:527)
  at androidx.media3.exoplayer.rtsp.RtspClient$MessageListener.lambda$onRtspMessageReceived$0$androidx-media3-exoplayer-rtsp-RtspClient$MessageListener(RtspClient.java:520)
  at androidx.media3.exoplayer.rtsp.RtspClient$MessageListener$$ExternalSyntheticLambda0.run(Unknown Source:4)
  at android.os.Handler.handleCallback(Handler.java:942)
  at android.os.Handler.dispatchMessage(Handler.java:99)
  at android.os.Looper.loopOnce(Looper.java:201) 
  at android.os.Looper.loop(Looper.java:288) 
  at android.os.HandlerThread.run(HandlerThread.java:67) 
Caused by: androidx.media3.exoplayer.rtsp.RtspMediaSource$RtspPlaybackException: java.lang.IllegalArgumentException: missing attribute fmtp
  at androidx.media3.exoplayer.rtsp.RtspClient$MessageListener.handleRtspResponse(RtspClient.java:694) 
  at androidx.media3.exoplayer.rtsp.RtspClient$MessageListener.handleRtspMessage(RtspClient.java:527) 
  at androidx.media3.exoplayer.rtsp.RtspClient$MessageListener.lambda$onRtspMessageReceived$0$androidx-media3-exoplayer-rtsp-RtspClient$MessageListener(RtspClient.java:520) 
  at androidx.media3.exoplayer.rtsp.RtspClient$MessageListener$$ExternalSyntheticLambda0.run(Unknown Source:4) 
  at android.os.Handler.handleCallback(Handler.java:942) 
  at android.os.Handler.dispatchMessage(Handler.java:99) 
  at android.os.Looper.loopOnce(Looper.java:201) 
  at android.os.Looper.loop(Looper.java:288) 
  at android.os.HandlerThread.run(HandlerThread.java:67) 
Caused by: java.lang.IllegalArgumentException: missing attribute fmtp
  at androidx.media3.common.util.Assertions.checkArgument(Assertions.java:55)
  at androidx.media3.exoplayer.rtsp.RtspMediaTrack.generatePayloadFormat(RtspMediaTrack.java:282)
  at androidx.media3.exoplayer.rtsp.RtspMediaTrack.<init>(RtspMediaTrack.java:176)
  at androidx.media3.exoplayer.rtsp.RtspClient.buildTrackList(RtspClient.java:366)
  at androidx.media3.exoplayer.rtsp.RtspClient.access$1700(RtspClient.java:76)
  at androidx.media3.exoplayer.rtsp.RtspClient$MessageListener.onDescribeResponseReceived(RtspClient.java:728)
  at androidx.media3.exoplayer.rtsp.RtspClient$MessageListener.handleRtspResponse(RtspClient.java:634)
  at androidx.media3.exoplayer.rtsp.RtspClient$MessageListener.handleRtspMessage(RtspClient.java:527) 
  at androidx.media3.exoplayer.rtsp.RtspClient$MessageListener.lambda$onRtspMessageReceived$0$androidx-media3-exoplayer-rtsp-RtspClient$MessageListener(RtspClient.java:520) 
  at androidx.media3.exoplayer.rtsp.RtspClient$MessageListener$$ExternalSyntheticLambda0.run(Unknown Source:4) 
  at android.os.Handler.handleCallback(Handler.java:942) 
  at android.os.Handler.dispatchMessage(Handler.java:99) 
  at android.os.Looper.loopOnce(Looper.java:201) 
  at android.os.Looper.loop(Looper.java:288) 
at android.os.HandlerThread.run(HandlerThread.java:67) 

Could you help me to understand the issue ? I'm not sure fmtp attributes is mandatory.
I tried to look the other app RTSP frame using Wireshark and the stream works well with the same frame so without fmtp.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.