Android Question Exoplayer update to support MP3 tags

Discussion in 'Android Questions' started by wimpie3, May 7, 2019.

  1. wimpie3

    wimpie3 Well-Known Member Licensed User

    Would it be possible to update the Exoplayer for B4A? In the mean while, the original library supports reading MP3 tags, which is interesting for displaying info (like the title of the current song playing) on radio streams. I desperately need this for one of my applications and I cannot find a library that does this (the AAC decoder that is often mentioned, does not work with the latest API).

    See https://medium.com/google-exoplayer/exoplayer-2-1-whats-new-2832c09fedab
    ExoPlayer 2.1 - What’s new
    ID3 metadata and album art
    ExoPlayer now parses ID3 metadata from the headers of MP3 and MP4 files.


    Code:
    @Override
    public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {
    for (int i = 0; i < trackGroups.length; i++) {
    TrackGroup trackGroup = trackGroups.get(i);
    for (int j = 0; j < trackGroup.length; j++) {
    Metadata trackMetadata = trackGroup.getFormat(j).metadata;
    if (trackMetadata != null) {
    // We found metadata. 
    Do something with it here!
    }
    }
    }
    }
     
    Last edited: May 7, 2019
    Almora and PdeG like this.
  2. Erel

    Erel Administrator Staff Member Licensed User

    Moved to the questions forum.
    It is quite simple to implement this code with JavaObject:
    Code:
    Sub Player_TrackChanged
       
    Dim jo As JavaObject = player1
       
    Dim TrackGroups As JavaObject = jo.GetFieldJO("player").RunMethod("getCurrentTrackGroups"Null)
       
    For i = 0 To TrackGroups.GetField("length") - 1
           
    Dim TrackGroup As JavaObject = TrackGroups.RunMethod("get"Array(i))
           
    For j = 0 To TrackGroup.GetField("length") - 1
               
    Dim Format As JavaObject = TrackGroup.RunMethodJO("getFormat"Array(j))
               
    Log(Format)
               
    Dim Metadata As JavaObject = Format.GetField("metadata")
               
    If Metadata.IsInitialized Then
                   
    Log("Metadata: " & Metadata)
               
    End If
           
    Next
       
    Next
    End Sub
     
    Almora, MarcoRome and DonManfred like this.
  3. moster67

    moster67 Expert Licensed User

    if you want to get the actual metadata related to the songs/videos, you need to dive deeper into the layers available since
    Code:
    Log("Metadata: " & Metadata)
    will not show any useful information.

    Below I am posting some quick code to get artist, album, and title of an mp3-song. It is based on Erel's code snippet above plus I added some inline java code to get the missing information. Useful information about tags can be found here:
    http://id3.org/id3v2.4.0-frames

    upload_2019-5-7_18-13-3.png



    Code:
    Sub Player_TrackChanged
        
    Dim jo As JavaObject = player1
        
    Dim TrackGroups As JavaObject = jo.GetFieldJO("player").RunMethod("getCurrentTrackGroups"Null)
        
    For i = 0 To TrackGroups.GetField("length") - 1
            
    Dim TrackGroup As JavaObject = TrackGroups.RunMethod("get"Array(i))
            
    For j = 0 To TrackGroup.GetField("length") - 1
                
    Dim Format As JavaObject = TrackGroup.RunMethodJO("getFormat"Array(j))
                
    Log(Format)
                
    Dim Metadata As JavaObject = Format.GetField("metadata")
                
    If Metadata.IsInitialized Then
                    
    Log("Metadata: " & Metadata) 'will not show you anything
                    
                    
    'use below inline java method or use it with JavaObject
                    Dim jo As JavaObject
                    jo.InitializeContext
                    
    Log(jo.RunMethod("GetMetaData",Array(Metadata)))
                
    End If
            
    Next
        
    Next
    End Sub

    #if java

    import com.google.android.exoplayer2.metadata.Metadata;
    import com.google.android.exoplayer2.metadata.id3.TextInformationFrame;

        //for tags, see this: http://id3.org/id3v2.4.0-frames
        
        public String GetMetaData(Metadata trackMetadata){
            String album = null;
            String title = null;
            String artist = null;
            for (int k = 0;k < trackMetadata.length();k++){
                Metadata.Entry entry = trackMetadata.get(k);
                if (entry instanceof TextInformationFrame){
                    TextInformationFrame textInformationFrame = (TextInformationFrame) entry;
                    String id = textInformationFrame.id;
                    if (id != null && id.equals("TALB")){
                        album = textInformationFrame.value;
                    } else if (id != null && id.equals(("TIT2"))) {
                        title = textInformationFrame.value;
                    } else if (id != null && id.equals(("TPE1"))) {
                        artist = textInformationFrame.value;
                    }
                }
            }

            if (album != null && title != null && artist != null){
                return album + "-" + title + "-" + artist;
            } else {
                return "no data";
            }

        }

    #End If
     
    DonManfred, Erel and Almora like this.
  4. Almora

    Almora Active Member Licensed User

    While listening to the radio over the Internet, the track did not show its name.
     
  5. wimpie3

    wimpie3 Well-Known Member Licensed User

    @Almora I was under the impression it would work for MP3 radio stations, but unfortunately tags are only read when MP3 files are played locally.

    Thanks anyway to all those who have helped!
     
Loading...
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice