Audio en varios idiomas con Live API

Este tema explica cómo crear un trabajo en vivo con múltiples pistas de audio en diferentes idiomas.

Introducción

Esta función permite la ingesta de múltiples idiomas de audio, pistas de experiencia de audio descriptivas o ambientales para estar disponibles para reproducción en vivo. Puede seguir los pasos aquí usando Live API. También puede utilizar Video Cloud Studio. Para más detalles, consulte el Audio en varios idiomas con el módulo en vivo documento.

Requisitos

Existen algunos requisitos para las pistas de audio en varios idiomas.

Habilita tu cuenta

  • Póngase en contacto con el servicio de atención al cliente para habilitar Live API con la función de audio en varios idiomas
  • Asegúrese de tener una clave de API para Live API (que se le proporciona cuando se configura la cuenta)

Configura tu codificador

  • Utilice un codificador que admita el protocolo RTP. La compatibilidad con audio en varios idiomas se limita a rtp o srt protocolo.
  • Obtenga los siguientes valores de su codificador: Para obtener más información, consulte la documentación de su codificador.
    • Defina el PID (Identificador de paquete) para cada pista de audio en su codificador
    • Defina el PID de video asociado con el video en su codificador

    Si no conoce los valores PID de su codificador, consulte la Configura tu codificador sección.

Crea tu trabajo en vivo

Para agregar varias pistas de audio a su trabajo, se debe proporcionar una lista de pistas de audio en el cuerpo de la solicitud al crear un trabajo en vivo:

{
  "live_stream": true,
  "region": "us-west-2",
  "protocol": "rtp",
  "cidr_whitelist": [ /* omitted… */ ],
  "outputs": [ /* omitted… */ ],
  "alternate_audio": {
    "tracks": [ { Track Details } ]
  }
}

Campos admitidos para Track objeto

La siguiente tabla contiene una descripción completa de los campos admitidos en el track objeto.

Campos de seguimiento
Campo Tipo Requerido Descripción
language cuerda

El código del idioma a utilizar; en la actualidad esto es flexible y podría estar en cualquiera de los diversos formatos de idioma requeridos/admitidos por las especificaciones, específicamente RFC5456/BCP47 que también cubre ISO-639 según los requisitos

HLS> LANGUAGE campo

DASH> AdaptationSet:lang campo

video_pid entero El identificador de paquete (PID) del flujo de entrada MPEG-TS para la pista de video
pid entero El identificador de paquete (PID) del flujo de entrada MPEG-TS para una pista de audio específica
default booleano Sí (para la pista predeterminada) La pista de audio marcada como DEFAULT en el EXT-X-MEDIA así como la pista que se muxará en la transmisión de video

Si no está presente, la primera pista es la predeterminada.

Si se definen varias listas de reproducción con diferentes valores predeterminados, la pista predeterminada de nivel superior es la multiplexada.

label cuerda Una descripción de texto que se usará para la pista, preferida para que la use el jugador cuando sea posible; utilizada en: HLS> NAME campo

Predeterminado: el language con una ID para cada pista, por ejemplo en-0 si no se especifica

variant enumeración Se asigna a los valores del esquema de roles de DASH:
  • main
  • alternate
  • commentary
  • supplementary
  • dub

HLS > CARACTERÍSTICAS

GUIÓN > Rol urn:mpeg:dash:role:2011.

Por defecto: main

streams[] gama

Esto imita el streams campo del tipo de salida de la lista de reproducción; ejemplo: { “source”: “720p” } - coincide con la etiqueta de la fuente de salida

Si no está presente, utiliza la configuración de audio predeterminada.

HLS> GROUP-ID. (Objeto)

Ejemplo

Este cuerpo de ejemplo creará un trabajo con 2 pistas de audio.

Solicitud

POST https://api.bcovlive.io/v1/jobs
  Content-Type: application/json
  X-API-KEY: your_API_key

Cuerpo de la solicitud

{
  "live_stream": true,
  "region": "us-west-2",
  "protocol": "rtp",
  "cidr_whitelist": [
    "0.0.0.0/0"
  ],
  "outputs": [
    {
      "label": "hls720p",
      "live_stream": true,
      "height": 720,
      "video_bitrate": 2400,
      "segment_seconds": 6,
      "keyframe_interval": 90
    },
    {
      "label": "hls540p",
      "live_stream": true,
      "height": 540,
      "video_bitrate": 1200,
      "segment_seconds": 6,
      "keyframe_interval": 90
    }
  ],
  "alternate_audio": {
    "tracks": [
      {
        "label": "English",
        "language": "en",
        "variant": "main",
        "video_pid": 256,
        "pid": 257,
        "default": true
      },
      {
        "label": "Spanish",
        "language": "es",
        "variant": "main",
        "video_pid": 256,
        "pid": 258
      }
    ]
  }
}

Respuesta de muestra

{
  "id": "76f814fbcd7840e99ebf0e335c933730",
  "outputs": [
      {
          "id": "0-76f814fbcd7840e99ebf0e335c933730",
          "playback_url": "https://playback-qa.a-live.io/76f814fbcd7840e99ebf0e335c933730/us-west-2/NA/profile_0/chunklist.m3u8",
          "playback_url_dvr": "https://playback-qa.a-live.io/76f814fbcd7840e99ebf0e335c933730/us-west-2/NA/profile_0/chunklist_dvr.m3u8",
          "playback_url_vod": "https://playback-qa.a-live.io/76f814fbcd7840e99ebf0e335c933730/us-west-2/NA/profile_0/chunklist_vod.m3u8",
          "playback_added_cdns": [],
          "label": "hls720p"
      },
      {
          "id": "1-76f814fbcd7840e99ebf0e335c933730",
          "playback_url": "https://playback-qa.a-live.io/76f814fbcd7840e99ebf0e335c933730/us-west-2/NA/profile_1/chunklist.m3u8",
          "playback_url_dvr": "https://playback-qa.a-live.io/76f814fbcd7840e99ebf0e335c933730/us-west-2/NA/profile_1/chunklist_dvr.m3u8",
          "playback_url_vod": "https://playback-qa.a-live.io/76f814fbcd7840e99ebf0e335c933730/us-west-2/NA/profile_1/chunklist_vod.m3u8",
          "playback_added_cdns": [],
          "label": "hls540p"
      },
      {
          "id": "2-76f814fbcd7840e99ebf0e335c933730",
          "playlist_type": "defaultS3",
          "type": "playlist",
          "alternate_audio": {
              "tracks": [
                  {
                      "label": "English",
                      "language": "en",
                      "name": "Alt0",
                      
                      "pid": 257,
                      "playlistDefault": true,
                      "default": true,
                      "variant": "main",
                      "profile_sources": [
                          "profile_0"
                      ]
                  },
                  {
                      "label": "Spanish",
                      "language": "es",
                      "name": "Alt1",
                      
                      "pid": 258,
                      "playlistDefault": false,
                      "default": false,
                      "variant": "main",
                      "profile_sources": [
                          "profile_0"
                      ]
                  }
              ]
          },
          "filename": "playlist.m3u8",
          "dvr_filename": "playlist_dvr.m3u8",
          "playback_url": "https://playback-qa.a-live.io/76f814fbcd7840e99ebf0e335c933730/us-west-2/NA/playlist.m3u8",
          "playback_url_dvr": "https://playback-qa.a-live.io/76f814fbcd7840e99ebf0e335c933730/us-west-2/NA/playlist_dvr.m3u8",
          "playback_added_cdns": []
      }
  ],
  "stream_url": "rtp://ep3-usw2.a-live.io:11780",
  "stream_name": "76f814fbcd7840e99ebf0e335c933730.stream",
  "static": false,
  "alternate_audio": {
      "tracks": [
          {
              "label": "English",
              "language": "en",
              "pid": 257,
              "default": true,
              "variant": "main",
              "name": "Alt0"
          },
          {
              "label": "Spanish",
              "language": "es",
              "pid": 258,
              "default": false,
              "variant": "main",
              "name": "Alt1"
          }
      ]
  },
  "event_length": 93600,
  "encryption": {},
  "playback_url": "https://playback-qa.a-live.io/76f814fbcd7840e99ebf0e335c933730/us-west-2/NA/playlist.m3u8",
  "playback_url_dvr": "https://playback-qa.a-live.io/76f814fbcd7840e99ebf0e335c933730/us-west-2/NA/playlist_dvr.m3u8",
  "playback_added_cdns": []
}

Configura tu codificador

Configure su codificador para entregar MPEG-TS a través de RTP a stream_url desde la respuesta de creación. Asegúrese de que las pistas de audio proporcionadas en el cuerpo de la solicitud estén configuradas con el PID correcto en su codificador.

Ejemplo con ffprobe

Si no conoce los PID de su codificador, puede usar una herramienta como ffprobe (incluida con ffmpeg) para inspeccionar los PID en la transmisión.

ffprobe /tmp/ma.ts
ffprobe version 5.0.1 Copyright (c) 2007-2022 the FFmpeg developers
  built with Apple clang version 13.0.0 (clang-1300.0.29.3)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/5.0.1-with-options_1 --enable-shared --cc=clang --host-cflags= --host-ldflags= --enable-gpl --enable-libaom --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-libsnappy --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-demuxer=dash --enable-opencl --enable-audiotoolbox --enable-videotoolbox --disable-htmlpages --enable-libvmaf --enable-version3
  libavutil      57. 17.100 / 57. 17.100
  libavcodec     59. 18.100 / 59. 18.100
  libavformat    59. 16.100 / 59. 16.100
  libavdevice    59.  4.100 / 59.  4.100
  libavfilter     8. 24.100 /  8. 24.100
  libswscale      6.  4.100 /  6.  4.100
  libswresample   4.  3.100 /  4.  3.100
  libpostproc    56.  3.100 / 56.  3.100
Input #0, mpegts, from '/tmp/ma.ts':
  Duration: 00:00:04.86, start: 1.400000, bitrate: 502 kb/s
  Program 1
    Metadata:
      service_name    : Service01
      service_provider: FFmpeg
  Stream #0:0[0xff]: Video: h264 (Constrained Baseline) ([27][0][0][0] / 0x001B), yuv420p(progressive), 360x240 [SAR 1:1 DAR 3:2], 30 fps, 30 tbr, 90k tbn
  Stream #0:1[0x100]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 44100 Hz, mono, fltp, 98 kb/s
  Stream #0:2[0x102]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 44100 Hz, mono, fltp, 98 kb/s

El número hexadecimal después de la transmisión indicará el PID. Por ejemplo:

  • 0xff == 255
  • 0x100 == 256
  • 0x101 == 257

Prueba de reproducción

Cargue la URL de reproducción en el Jugador de Brightcove o Safari para confirmar la reproducción.

DRM_Playback

Actualmente, DRM solo se admite a través del servicio Catch-up (Timeshift). Agregue estos campos al cuerpo de la solicitud de Crear trabajo:

{
  "drm": {
    "modes": [
      "all"
    ]
  },
  "timeshift": {
    "type": "single",
    "startover_duration": 36000,
    "skip_live_output": true
  }
}

La respuesta incluirá salidas DRM y un timeshift_url utilizar para la reproducción.