diff --git a/README.md b/README.md index a3f75fa7..85e958be 100644 --- a/README.md +++ b/README.md @@ -19,12 +19,12 @@ Features: * Read streams from servers with UDP, TCP or TLS (RTSPS) * Switch protocol automatically (switch to TCP in case of server error or UDP timeout) * Read only selected tracks of a stream - * Pause reading without disconnecting from the server + * Pause or seek without disconnecting from the server * Generate RTCP receiver reports automatically * Publish * Publish streams to servers with UDP, TCP or TLS (RTSPS) * Switch protocol automatically (switch to TCP in case of server error) - * Pause publishing without disconnecting from the server + * Pause without disconnecting from the server * Generate RTCP sender reports automatically * Server * Handle requests from clients diff --git a/client_read_test.go b/client_read_test.go index f3487c2e..326012d9 100644 --- a/client_read_test.go +++ b/client_read_test.go @@ -1826,6 +1826,32 @@ func TestClientReadSeek(t *testing.T) { }.Write(bconn.Writer) require.NoError(t, err) + req, err = readRequest(bconn.Reader) + require.NoError(t, err) + require.Equal(t, base.Pause, req.Method) + + err = base.Response{ + StatusCode: base.StatusOK, + }.Write(bconn.Writer) + require.NoError(t, err) + + req, err = readRequest(bconn.Reader) + require.NoError(t, err) + require.Equal(t, base.Play, req.Method) + + err = ra.Read(req.Header["Range"]) + require.NoError(t, err) + require.Equal(t, headers.Range{ + Value: &headers.RangeNPT{ + Start: headers.RangeNPTTime(6400 * time.Millisecond), + }, + }, ra) + + err = base.Response{ + StatusCode: base.StatusOK, + }.Write(bconn.Writer) + require.NoError(t, err) + req, err = readRequest(bconn.Reader) require.NoError(t, err) require.Equal(t, base.Teardown, req.Method) @@ -1868,5 +1894,10 @@ func TestClientReadSeek(t *testing.T) { }) require.NoError(t, err) - // asdasdasd + _, err = conn.Seek(&headers.Range{ + Value: &headers.RangeNPT{ + Start: headers.RangeNPTTime(6400 * time.Millisecond), + }, + }) + require.NoError(t, err) } diff --git a/clientconn.go b/clientconn.go index 50cb1857..2ef066d0 100644 --- a/clientconn.go +++ b/clientconn.go @@ -1574,6 +1574,16 @@ func (cc *ClientConn) Pause() (*base.Response, error) { } } +// Seek asks the server to re-start the stream from a specific timestamp. +func (cc *ClientConn) Seek(ra *headers.Range) (*base.Response, error) { + _, err := cc.Pause() + if err != nil { + return nil, err + } + + return cc.Play(ra) +} + // ReadFrames starts reading frames. func (cc *ClientConn) ReadFrames(onFrame func(int, StreamType, []byte)) error { cc.readCBMutex.Lock()