Audio multilingue avec l'API Live

Cette rubrique explique comment créer un travail en direct avec plusieurs pistes audio dans différentes langues.

Introduction

Cette fonction permet d'acquérir plusieurs langues audio, des pistes d'expérience audio descriptives ou ambiantes pour être disponibles pour la lecture en direct. Vous pouvez suivre les étapes ici en utilisant l'API Live. Vous pouvez également utiliser Video Cloud Studio. Pour plus de détails, consultez le Audio multilingue avec le module Live document.

Exigences

Quelques conditions sont requises pour les pistes audio multilingues.

Activer votre compte

  • Contactez le service clientèle pour activer l'API Live avec la fonction audio multilingue
  • Assurez-vous que vous disposez d'une clé API pour l'API Live (fournie lors de la création du compte)

Configuration de l'encodeur

  • Utilisez un encodeur qui prend en charge le protocole RTP. La prise en charge audio multilingue est limitée à rtp ou srt protocole.
  • Obtenez les valeurs suivantes à partir de votre encodeur : Pour plus de détails, reportez-vous à la documentation de votre codeur.
    • Définir le PID (Packet Identifier) pour chaque piste audio dans votre encodeur
    • Définir le PID vidéo associé à la vidéo dans votre encodeur

    Si vous ne connaissez pas les valeurs PID de votre encodeur, consultez le Configurez votre encodeur section.

Créez votre emploi en direct

Afin d'ajouter plusieurs pistes audio à votre tâche, une liste de pistes audio doit être fournie dans le corps de la demande lors de la création d'une tâche en direct :

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

Champs pris en charge pour le Track objet

Le tableau ci-dessous contient une description complète des champs pris en charge dans l' track objet.

Suivre les champs
Champ Type Obligatoire Description
language chaîne Oui

Le code de la langue à utiliser ; à l'heure actuelle, il est flexible et peut être dans n'importe lequel des différents formats de langue requis/pris en charge par les spécifications, en particulier le RFC5456/BCP47 qui couvre également la norme ISO-639 conformément aux exigences

HLS > LANGUAGE champ

TABLEAU DE BORD > AdaptationSet:lang champ

video_pid entier Oui L'identifiant de paquet (PID) du flux d'entrée MPEG-TS pour la piste vidéo
pid entier Oui L'identifiant de paquet (PID) du flux d'entrée MPEG-TS pour une piste audio spécifique
default booléen Oui (pour la piste par défaut) La piste audio marquée comme étant DEFAULT dans le EXT-X-MEDIA flux vidéo ainsi que la piste à mixer dans le flux vidéo

Si elle n'est pas présente, la première piste est la piste par défaut.

Si plusieurs listes de lecture sont définies avec des valeurs par défaut différentes, la piste par défaut de premier niveau est celle qui est fusionnée.

label chaîne Une description textuelle à utiliser pour le morceau, à utiliser de préférence par le joueur dans la mesure du possible ; utilisée dans : HLS > NAME champ

Par défaut : language avec un identifiant pour chaque piste, par exemple en-0 si cela n'est pas spécifié

variant énumération Corroge aux valeurs du schéma de rôles DASH :
  • main
  • alternate
  • commentary
  • supplementary
  • dub

HLS > CARACTÉRISTIQUES

DASH > Rôle urn:mpeg:dash:role:2011.

Par défaut : main

streams[] déployer

Cela imite le streams champ du type de sortie de la playlist ; exemple : { “source”: “720p” }- correspond à l'étiquette de la source de sortie

S'il n'est pas présent, il utilise les paramètres audio par défaut.

HLS > GROUP-ID. (Objet)

Exemple

Cet exemple de corps créera un Job avec 2 pistes audio.

Requête

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

Corps de la demande

{
  "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
      }
    ]
  }
}

Exemple de réponse

{
  "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": []
}

Configurer votre encodeur

Configurez votre encodeur pour fournir MPEG-TS sur RTP à stream_url à partir de la réponse de création. Assurez-vous que les pistes audio fournies dans le corps de la demande sont configurées avec le bon PID dans votre encodeur.

Exemple avec ffprobe

Si vous ne connaissez pas les PID de votre encodeur, vous pouvez utiliser un outil tel que ffprobe (inclus avec ffmpeg) pour inspecter les PID dans le flux.

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

Le numéro hexadécimal qui suit le flux indique le PID. Par exemple :

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

Tester la lecture

Chargez le playback_url dans le Lecteur Brightcove ou Safari pour confirmer la lecture.

DRM_Lecture

Actuellement, DRM n'est pris en charge que via le service de rattrapage (timeshift). Ajoutez ces champs à votre corps de demande de demande de création d'emploi :

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

La réponse comprendra des sorties DRM et un timeshift_url à utiliser pour la lecture.