Pregunta

Me gustaría cambiar dinámicamente la fuente de video en una aplicación de transmisión de video. Sin embargo, las diferentes fuentes de video tienen dimensiones de imagen únicas. Puedo generar archivos SDP individuales para cada fuente de video, pero me gustaría combinarlos en un solo archivo SDP para que el cliente de visualización pueda cambiar automáticamente el tamaño de la ventana de visualización a medida que cambia la fuente de video. Aquí hay dos archivos SDP de ejemplo:

640x480.sdp:

v=0
o=VideoServer 305419896 9876543210 IN IP4 192.168.0.2
s=VideoStream640x480
t=0 0
c=IN IP4 192.168.0.2
m=video 8000/2 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=0; profile-level-id=4D4033; sprop-parameter-sets=Z01AM5ZkBQHtCAAAAwAIAAADAYR4wZU=,aO48gJ==
a=control:trackID=1

960x480.sdp:

v=0
o=VideoServer 305419896 9876543210 IN IP4 192.168.0.2
s=VideoStream960x480
t=0 0
c=IN IP4 192.168.0.2
m=video 8000/2 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=0; profile-level-id=4D4033; sprop-parameter-sets=J01AM5WwPA9sBAIA,KO4G8gA=
a=control:trackID=1

¿Cómo se pueden combinar estos archivos individuales en un solo archivo SDP?

¿Fue útil?

Solución

Los parámetros en sus dos ejemplos de sdp están muy cerca: el nombre de la secuencia y los conjuntos de parámetros sprop difieren. Supongo que no te importa el nombre de la transmisión. Si necesita conjuntos de parámetros sprop separados y los clientes admiten bien el estándar, puede usar tipos de carga útil dinámica separados para cada resolución y tener un solo SDP de la siguiente manera:

    v=0
    o=VideoServer 305419896 9876543210 IN IP4 192.168.0.2
    s=VideoStream640x480
    t=0 0
    c=IN IP4 192.168.0.2
    m=video 8000/2 RTP/AVP 96 97
    a=rtpmap:96 H264/90000
    a=fmtp:96 packetization-mode=0; profile-level-id=4D4033; sprop-parameter-sets=Z01AM5ZkBQHtCAAAAwAIAAADAYR4wZU=,aO48gJ==
    a=rtpmap:97 H264/90000
    a=fmtp:97 packetization-mode=0; profile-level-id=4D4033; sprop-parameter-sets=J01AM5WwPA9sBAIA,KO4G8gA=
    a=control:trackID=1

Similar a otras respuestas si en realidad no necesita los diferentes nombres de flujo o los diferentes conjuntos de parámetros sprop, debería poder usar su primer SDP y cambiar el formato a medio flujo. No conozco la carga útil real de H.264 o su decodificador particular lo suficientemente bien como para garantizar que esto funcione en sus aplicaciones, pero es muy común en las aplicaciones de videoconferencia para permitir cambiar dinámicamente entre resoluciones sin señalar un cambio o requerir una dinámica separada tipo de carga útil.

Aunque puede concatenar dos documentos SDP como se menciona en otra respuesta, no creo que ayude en este caso. Los decodificadores H.264 solo pueden funcionar con un único parámetro sprop-parameter-sets en un momento que creo. Dado que ambos SDP tendrían el mismo tipo de carga útil, puerto de origen, etc., el receptor no sabría cuándo usar qué parámetro sprop-parameter-sets. ACTUALIZACIÓN: Tenga en cuenta que algunas implementaciones obtienen sus sprops en banda y no del SDP (o solo inicialmente del SDP). Si eso se aplica en su entorno, los conjuntos de parámetros SDP sprop se pueden actualizar en banda

Referencias:

  1. Formato de carga útil RFC 3984 RTP para video H.264
  2. Nuevo formato de carga útil RTP H.264 RFC 6184
  3. RFC 4566 SDP: Protocolo de descripción de sesión

[Perdón por no dar la cita completa - siéntete libre de corregir]

Otros consejos

He revisado el RFC ( RFC2327 - SDP: Protocolo de descripción de sesión ) y parece que puede concatenar los dos documentos SDP. El documento establece explícitamente:

  

Cuando SAP transmite SDP, solo se permite una descripción de sesión por paquete. Cuando SDP se transmite por otros medios, muchas descripciones de sesión de SDP se pueden concatenar juntas (la línea `v = 'que indica el inicio de una descripción de sesión termina la descripción anterior) .

Creo que depende de tu decodificador. Si admite cambios de parámetros dentro de la secuencia, entonces si puede decirle al codificador que coloque el encabezado correspondiente al cambiar la resolución, su decodificador debería cambiar automáticamente.

¿Cuál es su pregunta exactamente? ¿Es así: cómo puedo cambiar la resolución sin detener / reiniciar la transmisión?

No creo que pueda decirle de antemano a un decodificador, aquí están las posibles resoluciones que verá con algo de magia SDP. O su decodificador puede entender el cambio de parámetros H264, y luego está bien, o tiene que detener el reinicio de todo, y luego el sdp dinámico es suficiente.

Sé que, por ejemplo, VLC puede detectar cambios en la codificación MP4 (por ejemplo, pasar de una velocidad de bits variable a una velocidad de bits constante), pero se bloqueará si cambia la resolución Lo único que puede hacer con sdp es combinar diferentes descripciones de medios, por ejemplo, con diferentes tipos de carga útil dinámica y diferentes atributos de id de control.

Puede hacer el cambio dinámico de la carga útil o el cambio del conjunto de parámetros in-stream, o SIP re-INVITE.

Los cambios en la carga útil tienen el problema de que si no controlas el codificador y el decodificador, debes asegurarte de que el otro extremo acepte ambas cargas útiles y que cambien las cargas correctamente (y lo suficientemente rápido para ti; no hay ningún requisito sobre eso).

los cambios en el flujo tienen un problema si se pierden los paquetes del conjunto de parámetros. Puede usar un conjunto diferente de conjuntos de parámetros (cambie del conjunto de parámetros 1 a 2 cuando cambie) para evitar la decodificación incorrecta: si los conjuntos se pierden, debería obtener una imagen congelada o en blanco. Aconsejaría retransmitirlos varias veces (no en una sucesión demasiado rápida).

SIP re-INVITE está fuera de banda y se da la mano, y por lo tanto es seguro, pero agrega retraso a cualquier cambio y puede fallar dependiendo del receptor, y podría ser rechazado.

(Nota: soy autor de RFC 3984bis, la actualización a RFC 3984)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top