CAF: Audio tracks changing issue

601 views Asked by At

We've created a custom CAF receiver. When we try to switch audio tracks, the receiver player works properly just for the first request. If we try to make other requests, we are able to see the correct EDIT_TRACK_INFO_REQUEST (with the correct audio TrackId) on the receiver side, but the audio doesn't change.

We replicate the same behavior on web/IOS/ANDROID senders with different assets.

Does anyone have any suggestion? Thanks in advance.

---Additional details:

Smooth Streaming manifest audio track snippet, notice that Language doesn't follow RFC specification

<StreamIndex Name="audio101_spa" Language="spa" Type="audio" Subtype="AACL" QualityLevels="1" Chunks="0" Url=".../QualityLevels({bitrate})/Fragments(audio101_spa={start time})">
        <QualityLevel Bitrate="96000" Index="0" FourCC="AACL" SamplingRate="22050" Channels="2" BitsPerSample="16" PacketSize="4" AudioTag="255" CodecPrivateData="1390"/>

<StreamIndex Name="audio102_eng" Language="eng" Type="audio" Subtype="AACL" QualityLevels="1" Chunks="0" Url=".../QualityLevels({bitrate})/Fragments(audio102_eng={start time})">
        <QualityLevel Bitrate="96000" Index="0" FourCC="AACL" SamplingRate="22050" Channels="2" BitsPerSample="16" PacketSize="4" AudioTag="255" CodecPrivateData="1390"/>

On receiver side actually on PLAYER_LOAD_COMPLETE we perform custom handling of tracks:

//custom RFC mapping from values that comes from 
const tracksLabelsObj = {
      "spa": { name: "Español", lang: "es" },
      "eng": { name: "Inglés", lang: "en" },
      "ita": { name: "Italiano", lang: "it" }
...}

and we perform mapping and handling of audio track

for (i = 0; i < request.media.tracks.length; i++) {
      trackLanguage = tracksLabelsObj[request.media.tracks[i].language];
      if (((request.media.tracks[i].type == 'AUDIO') || (request.media.tracks[i].type == 'TEXT')) && (trackLanguage != undefined)) {
        //change labels and code 
        request.media.tracks[i].name = trackLanguage.name;
        request.media.tracks[i].language = trackLanguage.lang;

      }
}

We founded on documentation also another way to handle this, using:

playerManager.setMessageInterceptor(
      cast.framework.messages.MessageType.EDIT_AUDIO_TRACKS, request => {...

if (request.media != null) {
        console.log("CHROMECAST: EDIT AUDIO TRACKS - Changing media tracks");
        for (i = 0; i < request.media.tracks.length; i++) {
          trackLanguage = tracksLabelsObj[request.media.tracks[i].language];
          if (((request.media.tracks[i].type == 'AUDIO') || (request.media.tracks[i].type == 'TEXT')) && (trackLanguage != undefined)) {
            //Cambio labels lingua
            request.media.tracks[i].name = trackLanguage.name;
            request.media.tracks[i].language = trackLanguage.lang;
          }
        }
    }
...}

But we can't handle it correctly, any suggestion also on this?

For internal testing, we also used this clear streaming that has the same behavior - http://harmonic.e2e.purpledrm.com.edgesuite.net/Content/SS/VOD/yjO9VXw7-ElephantsDreamH264720p/ElephantsDream.ism/Manifest

Many thanks.

0

There are 0 answers