TrackAPI : 2 audio tracks, same langage code, main + audiodescription

XAVIER LAFFARGUE 51 Reputation points
2023-01-03T18:42:00.893+00:00

We are trying to add 2 audio tracks via the API.
One main and another audio description

We have 2 issues :
1- When the language code is the same, we don't have 2 tracks in the HLS manifest. Only one. We think that is because the filename is the same
2- To resolve the first issue we "cheat" and use a different language code between 2 tracks, but HLS settings doesn't seems to be applied (HLS Characteristic and other isn't filled/applied)

MediaAssetTrackResource mediaAssetTrackResourceFrDv = mediaAssetResource.GetMediaAssetTracks().CreateOrUpdate(WaitUntil.Completed, "describes-video" ,new MediaAssetTrackData()  
{  
    Track = new AudioTrack()  
    {  
        Mpeg4TrackId = 1,  
        DisplayName = "Français (Description)",  
        DashRole = "alternate",  
        FileName = "describes-video.mp4",  
        LanguageCode = "fre",  
        HlsSettings = new HlsSettings()  
        {  
            Characteristics ="public.accessibility.describes-video",  
            IsDefault = false,  
            IsForced = false  
        }  
    }  
}).Value;  

Before use TrackAPI we edit the ism file like : https://learn.microsoft.com/en-us/azure/media-services/latest/encode-dynamic-packaging-concept#signaling-audio-description-tracks
But is there a way to do it via the API ?

Azure Media Services
Azure Media Services
A group of Azure services that includes encoding, format conversion, on-demand streaming, content protection, and live streaming services.
303 questions
0 comments No comments
{count} votes

4 answers

Sort by: Most helpful
  1. John Deutscher (MSFT) 2,126 Reputation points
    2023-01-03T20:36:27.79+00:00

    HI Xavier,

    Are the two audio tracks in separate source files or the same file?

    Are you updating the Mpeg4TrackId for each file that you are setting?

    public static async Task<AssetTrack> PublishAudioTrackAndVerify(AzureMediaServicesClient client, string rgName, string accountName, string assetName, string strFileName, string strTrackName)
    {
    var newTrack = new AssetTrack
    {
    Track = new AudioTrack
    {
    Mpeg4TrackId = (Depending on which track indicates description audio track 1 or 2),
    FileName = strFileName,
    DisplayName = strTrakName,
    HlsSettings = new HlsSettings
    {
    Characteristics = "public.accessibility.describes-video"
    },
    LanguageCode = "fr"
    }
    };

        var t = await client.Tracks.CreateOrUpdateAsync(rgName, accountName, assetName, strTrackName, newTrack);  
        var track = t.Track as AudioTrack;  
        Console.WriteLine($"new audio track with name {track?.DisplayName}, Id: {track?.Mpeg4TrackId} and bitrate {track?.BitRate} published");  
    
        return t;  
        }  
    

    For the second issue, I believe that the properties set using AssetAPI are not being reflected accurately. There might be a bug here that I'll have the team follow up on and check on what's going on.


  2. XAVIER LAFFARGUE 51 Reputation points
    2023-01-05T18:58:34.977+00:00

    ISM Generated :

      <audio src="2022-12-08_19_30_00_INFOMAN_0633_02_1200.mp4" systemBitrate="128000" systemLanguage="fra">  
        <param name="trackIndex" value="2022-12-08_19_30_00_INFOMAN_0633_02_1200_2.mpi" valuetype="data" />  
        <param name="systemLanguage" value="fra" valuetype="data" />  
        <param name="systemBitrate" value="128000" valuetype="data" />  
        <param name="isDefault" value="TRUE" valuetype="data" />  
        <param name="displayName" value="Français" valuetype="data" />  
        <param name="trackID" value="2" valuetype="data" />  
        <param name="trackName" value="audio_fra" valuetype="data" />  
        <param name="armId" value="audio1_fr" valuetype="data" />  
      </audio>  
      <audio src="2022-12-08_19_30_00_INFOMAN_0633_02_1200.mp4" systemBitrate="128000" systemLanguage="fra">  
        <param name="trackIndex" value="2022-12-08_19_30_00_INFOMAN_0633_02_1200_3.mpi" valuetype="data" />  
        <param name="systemLanguage" value="fra" valuetype="data" />  
        <param name="role" value="alternate" valuetype="data" />  
        <param name="systemBitrate" value="128000" valuetype="data" />  
        <param name="isDefault" value="FALSE" valuetype="data" />  
        <param name="displayName" value="Français (Description)" valuetype="data" />  
        <param name="hlsCharacteristic" value="public.accessibility.describes-video" valuetype="data" />  
        <param name="trackID" value="3" valuetype="data" />  
        <param name="trackName" value="audio_fra" valuetype="data" />  
        <param name="armId" value="audio0_frdv" valuetype="data" />  
      </audio>  
    

  3. XAVIER LAFFARGUE 51 Reputation points
    2023-01-05T18:59:16.51+00:00

    HLS Generated :

    #EXTM3U  
    #EXT-X-VERSION:7  
    #EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio",NAME="Français",LANGUAGE="fra",DEFAULT=YES,AUTOSELECT=YES,CHANNELS="2",URI="QualityLevels(128000)/Manifest(audio_fra,format=m3u8-cmaf)"  
    #EXT-X-STREAM-INF:BANDWIDTH=409205,RESOLUTION=384x216,CODECS="avc1.42c01e,mp4a.40.2",AUDIO="audio"  
    QualityLevels(256428)/Manifest(video,format=m3u8-cmaf)  
    #EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=409205,RESOLUTION=384x216,CODECS="avc1.42c01e",URI="QualityLevels(256428)/Manifest(video,format=m3u8-cmaf,type=keyframes)"  
    #EXT-X-STREAM-INF:BANDWIDTH=556458,RESOLUTION=480x270,CODECS="avc1.42c01e,mp4a.40.2",AUDIO="audio"  
    QualityLevels(400511)/Manifest(video,format=m3u8-cmaf)  
    #EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=556458,RESOLUTION=480x270,CODECS="avc1.42c01e",URI="QualityLevels(400511)/Manifest(video,format=m3u8-cmaf,type=keyframes)"  
    #EXT-X-STREAM-INF:BANDWIDTH=658933,RESOLUTION=512x288,CODECS="avc1.42c01e,mp4a.40.2",AUDIO="audio"  
    QualityLevels(500780)/Manifest(video,format=m3u8-cmaf)  
    #EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=658933,RESOLUTION=512x288,CODECS="avc1.42c01e",URI="QualityLevels(500780)/Manifest(video,format=m3u8-cmaf,type=keyframes)"  
    #EXT-X-STREAM-INF:BANDWIDTH=965803,RESOLUTION=640x360,CODECS="avc1.42c01e,mp4a.40.2",AUDIO="audio"  
    QualityLevels(801045)/Manifest(video,format=m3u8-cmaf)  
    #EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=965803,RESOLUTION=640x360,CODECS="avc1.42c01e",URI="QualityLevels(801045)/Manifest(video,format=m3u8-cmaf,type=keyframes)"  
    #EXT-X-STREAM-INF:BANDWIDTH=1374729,RESOLUTION=852x480,CODECS="avc1.4d401f,mp4a.40.2",AUDIO="audio"  
    QualityLevels(1201168)/Manifest(video,format=m3u8-cmaf)  
    #EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=1374729,RESOLUTION=852x480,CODECS="avc1.4d401f",URI="QualityLevels(1201168)/Manifest(video,format=m3u8-cmaf,type=keyframes)"  
    #EXT-X-STREAM-INF:BANDWIDTH=2192851,RESOLUTION=852x480,CODECS="avc1.4d401f,mp4a.40.2",AUDIO="audio"  
    QualityLevels(2001679)/Manifest(video,format=m3u8-cmaf)  
    #EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=2192851,RESOLUTION=852x480,CODECS="avc1.4d401f",URI="QualityLevels(2001679)/Manifest(video,format=m3u8-cmaf,type=keyframes)"  
    #EXT-X-STREAM-INF:BANDWIDTH=3216020,RESOLUTION=1280x720,CODECS="avc1.4d401f,mp4a.40.2",AUDIO="audio"  
    QualityLevels(3002822)/Manifest(video,format=m3u8-cmaf)  
    #EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=3216020,RESOLUTION=1280x720,CODECS="avc1.4d401f",URI="QualityLevels(3002822)/Manifest(video,format=m3u8-cmaf,type=keyframes)"  
    #EXT-X-STREAM-INF:BANDWIDTH=7308487,RESOLUTION=1920x1080,CODECS="avc1.640028,mp4a.40.2",AUDIO="audio"  
    QualityLevels(7007193)/Manifest(video,format=m3u8-cmaf)  
    #EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=7308487,RESOLUTION=1920x1080,CODECS="avc1.640028",URI="QualityLevels(7007193)/Manifest(video,format=m3u8-cmaf,type=keyframes)"  
    
    0 comments No comments

  4. Ning Lin (MSFT) 1 Reputation point Microsoft Employee
    2023-02-01T07:00:41.0033333+00:00

    Are the two audio tracks really in track 2 and track 3 of 2022-12-08_19_30_00_INFOMAN_0633_02_1200.mp4? The .ism doesn’t seem to match your code.

    ‘TrackID property is import as it describes the location of the track within the mp4 file.