RTSP DVR¶
media.play.rtsp_dvr
Sapsan entrega el archivo grabado mediante RTSP. El cliente obtiene los periodos de grabación disponibles, selecciona una hora UTC y controla la reproducción dentro de una misma sesión. La lectura de un archivo existente no requiere una fuente de entrada activa.
Transporte¶
RTSP 1.0 y RTP/RTCP interleaved comparten una conexión TCP. UDP no es compatible: SETUP con UDP devuelve 461.
Códecs compatibles¶
- H.264
- HEVC / H.265
- AV1
- AAC
- Opus
- PCMA
- PCMU
La lista corresponde a la paquetización RTSP; el cliente debe admitir los códecs seleccionados.
AAC utiliza MPEG4-GENERIC con cabeceras AU; AV1 utiliza fragmentación RTP y un sequence header. Existen declaraciones SDP para MP4A-LATM y MPEG Audio (MPA, MP2/MP3), pero la salida actual no proporciona su paquetización RTP correspondiente completa; no se incluyen en la lista anterior. Si es necesario, convierta el audio a AAC u Opus. El nombre de un códec en SDP no garantiza por sí solo la compatibilidad.
Protocolo y URL¶
El control utiliza RTSP 1.0: RFC 2326. La descripción de las pistas utiliza SDP: RFC 4566. Los medios se transmiten mediante RTP/RTCP: RFC 3550. Para H.264 se utiliza el formato de carga RTP de RFC 6184.
La lista de periodos de archivo en un único atributo SDP y el parámetro position son extensiones de la interfaz de archivo de Sapsan. Sus formatos se describen a continuación. Se indican las capacidades admitidas y las diferencias conocidas; admitir RTSP 1.0 no implica admitir todos los modos de estos RFC.
El acceso requiere un archivo DVR grabado, un listener RTSP configurado y una licencia que permita media.play.rtsp_dvr.
rtsp://sapsan.example.com:554/camera?dvr=true
La URL es estática: el tiempo se indica en la cabecera Range, no en la URL. Se requiere el valor dvr=true; otros valores se rechazan. Una URL normal sin este parámetro sirve la reproducción en directo y no acepta un Range: clock=... de archivo. Si se requiere autorización mediante token, añada &token=<token>.
Licencia¶
La función media.play.rtsp_dvr utiliza el límite de licencia independiente media_play_rtsp_dvr. RTSP en directo utiliza media_play_rtsp; el permiso para reproducir en directo no concede acceso al archivo.
La admisión se comprueba antes de leer el archivo, también en un PLAY directo sin DESCRIBE previo. Un límite de cero prohíbe el acceso y un límite numérico agotado impide crear nuevas sesiones: el servidor responde 453 Not Enough Bandwidth.
La sesión de archivo conserva su admisión por licencia al terminar el intervalo seleccionado. El siguiente PLAY en la misma conexión utiliza esa sesión. Libérela con TEARDOWN o cerrando la conexión; EOF por sí solo no libera la plaza ocupada. Consulte licencias.
Periodos de grabación disponibles¶
El cliente comienza con DESCRIBE:
DESCRIBE rtsp://sapsan.example.com:554/camera?dvr=true RTSP/1.0
CSeq: 1
Accept: application/sdp
La respuesta 200 OK contiene un cuerpo application/sdp. Antes de las descripciones de pistas m=, incluye este atributo de sesión:
a=range:clock=20261019T080000Z-20261019T093000Z;clock=20261019T100000Z-
El ejemplo muestra dos periodos de grabación separados por una interrupción. El formato temporal es YYYYMMDDThhmmssZ, en segundos enteros UTC. La ausencia de hora tras el guion del último periodo indica que la grabación continúa.
- Orden. Los periodos se enumeran en orden cronológico ascendente.
- Unión. Se unen los periodos contiguos; al construir la lista también se unen las interrupciones de hasta 10 segundos inclusive. Un periodo así no garantiza fotogramas en cada segundo que abarca.
- Cantidad. Se anuncian como máximo los 100 periodos más recientes. Las grabaciones anteriores que todavía existan se pueden solicitar con un
PLAYexplícito, aunque no aparezcan en esta lista. - Archivo vacío. Se omite el atributo
a=range. El servidor puede utilizar una fuente en directo disponible para describir las pistas.
Si hay grabaciones, las descripciones de las pistas se obtienen del archivo. Por tanto, DESCRIBE y la reproducción siguen disponibles tras desconectar la fuente de entrada.
Preparación del transporte¶
Envíe SETUP para cada pista necesaria utilizando su identificador del SDP. Se admite RTP/RTCP dentro de la misma conexión TCP que RTSP: interleaved TCP. En el ejemplo, <track-url> representa la URL de la pista seleccionada:
SETUP <track-url> RTSP/1.0
CSeq: 2
Transport: RTP/AVP/TCP;unicast;interleaved=0-1
Cabeceras relevantes de la respuesta:
RTSP/1.0 200 OK
CSeq: 2
Session: example-session;timeout=60
Transport: RTP/AVP/TCP;unicast;interleaved=0-1
Utilice el Session recibido en las solicitudes posteriores. Seleccione otro par de canales interleaved para la siguiente pista. El transporte UDP se rechaza con 461.
Los ejemplos muestran los campos relevantes del intercambio. En la red, las líneas terminan en CRLF, una línea vacía separa las cabeceras del cuerpo y Content-Length indica la longitud del cuerpo en bytes.
Selección temporal y búsqueda¶
Para reproducir un intervalo, envíe PLAY a la URL de toda la sesión:
PLAY rtsp://sapsan.example.com:554/camera?dvr=true RTSP/1.0
CSeq: 3
Session: example-session
Range: clock=20261019T081000Z-20261019T081500Z
Scale: 1
Campos esenciales de la respuesta:
RTSP/1.0 200 OK
CSeq: 3
Session: example-session;timeout=60
Range: clock=20261019T081000Z-20261019T081500Z
Scale: 1
La respuesta RTP-Info contiene seq y rtptime para las pistas preparadas que se entregan, también al iniciar el archivo y después de una búsqueda. Al reanudar tras una pausa, rtptime corresponde al siguiente fotograma real, incluido un salto sobre una interrupción de grabación.
Solicitud PLAY |
Comportamiento de Sapsan |
|---|---|
Range: clock=<from>-<to> |
Comenzar en un fragmento independiente y entregar fotogramas con DTS inferior a <to> |
Range: clock=<from>- |
Seleccionar fragmentos existentes desde la hora indicada, sin límite superior |
Un nuevo Range: clock=... en la misma sesión |
Cambiar inmediatamente la posición; no se necesita otro SETUP |
Range: npt=now- |
Cambiar a la reproducción en directo |
Sin Range, con una fuente ya seleccionada |
Continuar la reproducción, también después de PAUSE |
Sin Range, en el primer inicio |
Seleccionar la fuente en directo |
NPT numérico abierto, como npt=10- |
451 Parameter Not Understood; la reproducción actual continúa |
El Range de respuesta informa de los límites seleccionados. Si <from> está dentro de un fragmento independiente, la reproducción comienza al inicio de ese fragmento, que puede ser anterior a lo solicitado. La búsqueda hacia atrás se limita a 60 segundos; si no hay un inicio adecuado, se selecciona el siguiente fragmento independiente. El final se limita por <to> y por la grabación disponible. No se entregan fotogramas con DTS igual o superior a <to>.
El guion se conserva también con un extremo abierto. Las solicitudes aceptan segundos UTC enteros, pero un límite real de la respuesta puede incluir milisegundos, por ejemplo clock=20261019T081000.250Z-20261019T081500Z.
La reproducción es hacia delante a velocidad normal. Omita Scale o indique 1; una solicitud con Scale: 1 recibe Scale: 1. Otras velocidades y la forma inversa clock=-<to> devuelven 451 Parameter Not Understood y la reproducción actual continúa.
Si hay una interrupción de grabación entre fragmentos seleccionados, el servidor pasa al siguiente fragmento disponible sin esperar toda la duración de la interrupción. Las marcas de tiempo saltan el periodo ausente.
Un intervalo abierto lee la selección de fragmentos disponible al recibir PLAY y termina al agotarla. No incorpora nuevos fragmentos ni cambia al directo automáticamente. Para el directo se necesita un PLAY explícito con npt=now-.
Posición actual¶
Para obtener la posición de entrega, envíe GET_PARAMETER con position en el cuerpo:
GET_PARAMETER rtsp://sapsan.example.com:554/camera?dvr=true RTSP/1.0
CSeq: 4
Session: example-session
Content-Type: text/parameters
Content-Length: 10
position
El cuerpo es position seguido de CRLF, 10 bytes en total. Respuesta:
RTSP/1.0 200 OK
CSeq: 4
Session: example-session;timeout=60
Range: clock=20261019T081012Z
Supported: position
El tiempo aparece en una cabecera, no en el cuerpo de la respuesta. Es una única marca temporal sin guion, a diferencia del intervalo de la respuesta PLAY. El valor corresponde al DTS del último fotograma entregado, truncado a segundos enteros, no al momento en que el cliente lo muestra.
Antes del primer fotograma entregado de la fuente seleccionada, también después de una búsqueda, position devuelve 503 Service Unavailable sin Range, con Supported: position. Durante una pausa y después de EOF del archivo devuelve 200 OK y la última posición confirmada. El código 200 por sí solo no indica si siguen llegando fotogramas. Un parámetro desconocido en un cuerpo no vacío devuelve 200 OK y Supported: position, sin Range.
Pausa y finalización de la sesión¶
PAUSE en la URL de la sesión suspende la entrega conservando la posición dentro del fragmento. El siguiente PLAY sin Range reanuda los fotogramas restantes. Un nuevo Range: clock=... cambia inmediatamente la posición, también al enviar varias solicitudes PLAY en pipeline; no se crea una cola de intervalos.
Durante la pausa, mantenga la sesión activa con un GET_PARAMETER vacío. El servidor anuncia timeout=60; envíe solicitudes keepalive con mayor frecuencia que ese intervalo. Las solicitudes RTSP y los paquetes RTCP entrantes cuentan como actividad.
Cuando un intervalo que ya ha entregado medios RTP llega a su final natural, el servidor envía RTCP BYE para las pistas preparadas y termina la entrega actual. La conexión y la sesión permanecen abiertas: se puede solicitar otro intervalo sin repetir SETUP.
Para liberar la sesión, envíe TEARDOWN con su Session. Después de 200 OK, la conexión se cierra y se libera la plaza de licencia.
Medios y límites de compatibilidad¶
Para H.264, los parámetros del decodificador se transmiten en SDP y los SPS/PPS que falten se insertan antes de los fotogramas clave. Los parámetros se actualizan cuando cambia la configuración de los fragmentos del archivo. Las marcas RTP se calculan a partir del DTS del archivo; RTCP Sender Report las relaciona con el tiempo NTP.
RTCP Sender Report contiene los contadores acumulados de paquetes RTP y octetos de carga útil. Las cabeceras RTP y la envoltura interleaved no se incluyen en los octetos. Una búsqueda con el mismo SSRC no reinicia los contadores.
El perfil admitido tiene los siguientes límites:
- Transporte. Solo interleaved TCP; UDP devuelve
461. - Velocidad. Solo reproducción normal hacia delante; otros valores de
Scaledevuelven451. - Escala temporal. Para buscar en el archivo, utilice
clockcon segundos UTC enteros. No se admiten NPT numérico ni SMPTE. Las fracciones de segundo solo se permiten en las respuestas. - Secuencia de intervalos. Cada nuevo
PLAYde archivo cambia inmediatamente la posición; no hay cola de intervalos. - Grabación en curso. Un intervalo abierto no lee fragmentos creados después del inicio de la reproducción.
Códigos de respuesta¶
| Código | Causa |
|---|---|
400 Bad Request |
dvr o URL incorrectos; falta Transport en SETUP |
403 Forbidden |
Autorización denegada o stream cifrado no disponible para entrega RTSP |
404 Not Found |
No se encuentra el stream, el archivo o la pista |
451 Parameter Not Understood |
Range o Scale no admitidos; archivo solicitado mediante una URL normal de directo |
453 Not Enough Bandwidth |
Función prohibida por la licencia o límite de sesiones alcanzado |
454 Session Not Found |
Falta el contexto de sesión necesario |
457 Invalid Range |
Ventana vacía o inversa; no hay fragmentos de archivo adecuados |
461 Unsupported Transport |
Se ha solicitado un transporte distinto de interleaved TCP |
503 Service Unavailable |
Fuente no disponible; position solicitado antes del primer fotograma de la fuente seleccionada. EOF del archivo por sí solo no provoca 503 para position |
Verificación del cliente¶
Compruebe la integración con una grabación de límites temporales conocidos y una interrupción:
- Obtenga el SDP y compare
a=rangecon los periodos de grabación, teniendo en cuenta la unión de interrupciones cortas. - Envíe
SETUPpara las pistas necesarias. Compruebe los pares de canales interleaved y el identificador de sesión. - Solicite
positionantes del primer fotograma: se espera503sinRange. - Inicie
PLAYdentro de un fragmento conScale: 1. Compruebe elRangeelegido, elScaledevuelto y quertptime/seqcorrespondan al primer paquete RTP. Ningún fotograma debe tener DTS >=<to>. - Pause dentro de un fragmento y reanude con
PLAYsinRange. Compruebe que se conservan los fotogramas restantes y la posición. - Compruebe
451para una velocidad no admitida y NPT numérico: la reproducción actual debe continuar. - Espere EOF y RTCP BYE y solicite otro intervalo en la misma conexión. Compruebe la posición tras EOF y los contadores acumulados de Sender Report.
- Compruebe el rechazo por licencia
453con un límite de cero o agotado y termine conTEARDOWN.