bschultz Posted July 28, 2021 Share Posted July 28, 2021 I've started to dabble with getID3 to write tags for use with a given audio program we use at the radio station I work for. The program uses id3v2.3 tags for frame_name ETCO: Here's the code that getID3 uses for handling ETCO tags: } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'ETCO')) || // 4.5 ETCO Event timing codes (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'ETC'))) { // 4.6 ETC Event timing codes // There may only be one 'ETCO' frame in each tag // <Header for 'Event timing codes', ID: 'ETCO'> // Time stamp format $xx // Where time stamp format is: // $01 (32-bit value) MPEG frames from beginning of file // $02 (32-bit value) milliseconds from beginning of file // Followed by a list of key events in the following format: // Type of event $xx // Time stamp $xx (xx ...) // The 'Time stamp' is set to zero if directly at the beginning of the sound // or after the previous event. All events MUST be sorted in chronological order. $frame_offset = 0; $parsedFrame['timestampformat'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); while ($frame_offset < strlen($parsedFrame['data'])) { $parsedFrame['typeid'] = substr($parsedFrame['data'], $frame_offset++, 1); $parsedFrame['type'] = $this->ETCOEventLookup($parsedFrame['typeid']); $parsedFrame['timestamp'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); $frame_offset += 4; } unset($parsedFrame['data']); This says that I'm to include $parsedFrame['data'] as one of the array items. The standard does not list a data field. Also, the standard says that the value of timestamp should be HEX. So, do I put 0011 in for 3 milliseconds or do I put 3 as the vale of timestamp? The documentation for ETCO tags is pretty scarce...so, what I'm trying to ask is how do I write an 1d3v2.3 ETCO array for getID3? Here's version 50 of what I've tried, and it doesn't work. $TagData['id3v2']['ETCO']['frame_name'] = 'ETCO'; $TagData['id3v2']['ETCO']['data'] = 3; // from the standard at https://id3.org/id3v2.3.0#sec4.6 $TagData['id3v2']['ETCO']['type'] = 3; // type 3 is mainpart start $TagData['id3v2']['ETCO']['timestamp'] = 1000; // milliseconds $TagData['id3v2']['ETCO']['timestampformat'] = 2; // timestamp format #2 which is Absolute time, 32 bit sized, using milliseconds as unit $TagData['id3v2']['ETCO']['data'] = 4; // from the standard at https://id3.org/id3v2.3.0#sec4.6 $TagData['id3v2']['ETCO']['type'] = 4; // type 4 is outro start $TagData['id3v2']['ETCO']['timestamp'] = 1500; // milliseconds $TagData['id3v2']['ETCO']['timestampformat'] = 2; // timestamp format #2 which is Absolute time, 32 bit sized, using milliseconds as unit Thanks! Quote Link to comment Share on other sites More sharing options...
requinix Posted July 28, 2021 Share Posted July 28, 2021 What library are you using to write the tags? Does it actually use arrays with stuff like "timestamp" and "timestampformat"? Because that code sample you have there uses an associative array and thus will only allow a single timing code. If you're supposed to specify a "frame_name" and "data", which is basically the minimum, then the data would be the full frame data. Presumably raw bytes. So "\x02" (format) + "\x03\x00\x00\x03\xE8" (event 3, timestamp 0x000003E8ms) + additional timing codes. Quote Link to comment Share on other sites More sharing options...
bschultz Posted July 28, 2021 Author Share Posted July 28, 2021 The library is from https://github.com/JamesHeinrich/getID3 The documentation for this particular id3 tag in this library is non-existent. I don't know what they want! I'd ask on their message board, but there hasn't been any activity on it for a year. Quote Link to comment Share on other sites More sharing options...
requinix Posted July 28, 2021 Share Posted July 28, 2021 Good thing about PHP is that it's open-source, so you can look at the library to see how it handles ETCO data. Bad news is that it's a bit perverse about the structure of the array. You specify a "timestampformat" key, and potentially "flags", but then everything else is more arrays. Those are where you add the "timestamp" and "typeid" values. $TagData['id3v2']['ETCO'] = [ "timestampformat" => 2, ["typeid" => 3, "timestamp" => 1000], ["typeid" => 4, "timestamp" => 1500], // etc ]; Quote Link to comment Share on other sites More sharing options...
bschultz Posted July 28, 2021 Author Share Posted July 28, 2021 Thanks for the help...I hate that there's no real documentation. The $TagData array that you created did NOT write the tags either. I've tried a lot of different ways to construct this array...with no success. Quote Link to comment Share on other sites More sharing options...
requinix Posted July 28, 2021 Share Posted July 28, 2021 35 minutes ago, bschultz said: Thanks for the help...I hate that there's no real documentation. The $TagData array that you created did NOT write the tags either. I've tried a lot of different ways to construct this array...with no success. Did you check if there were any errors reported by the library? Because I'm pretty sure I see a bug in it. Quote Link to comment Share on other sites More sharing options...
bschultz Posted July 29, 2021 Author Share Posted July 29, 2021 This is the standard getID3 code for submitting the data...which calls the warning and errors reported back...and it reported nothing. $tagwriter->tag_data = $TagData; // write tags if ($tagwriter->WriteTags()) { echo 'Successfully wrote tags<br>'; if (!empty($tagwriter->warnings)) { echo 'There were some warnings:<br>'.implode('<br><br>', $tagwriter->warnings); } } else { echo 'Failed to write tags!<br>'.implode('<br><br>', $tagwriter->errors); } Quote Link to comment Share on other sites More sharing options...
Psycho Posted July 29, 2021 Share Posted July 29, 2021 It's been at least a decade since I played around with the getid3 library. I'll be honest, I have no idea what ETCO tag data is. But, I have a possible solution. Do you have a file with existing ETCO tags or is there a tag editing application that you can use to set such tags? If you have a file with example tag data that you know what it represents, then instead of using getid3 to set the data, use it to get the data. You can then see what the format of the data is that it expects. I remember doing something similar for some other tag information at the time. 1 Quote Link to comment Share on other sites More sharing options...
bschultz Posted July 29, 2021 Author Share Posted July 29, 2021 I won't ever have to GET the tags...once they're set, I don't have to touch the file again. The biggest problem is our radio automation system is a Mac program. The only way to set the tags on our Mac is to play the file...in real time...and press the space bar to set the intro and outro tags. That's how the Mac program works. Not time efficient at all! Here's what getID3 reported back for a file with the tags as written by the Mac: Array ( [GETID3_VERSION] => 1.9.20-202107131440 [filesize] => 258297 [filepath] => /home/brian/Desktop [filename] => 1.mp3 [filenamepath] => /home/brian/Desktop/1.mp3 [avdataoffset] => 4178 [avdataend] => 258297 [fileformat] => mp3 [audio] => Array ( [dataformat] => mp3 [channels] => 2 [sample_rate] => 44100 [bitrate] => 128000 [channelmode] => stereo [bitrate_mode] => cbr [lossless] => [encoder_options] => CBR128 [compression_ratio] => 0.090702947845805 [streams] => Array ( [0] => Array ( [dataformat] => mp3 [channels] => 2 [sample_rate] => 44100 [bitrate] => 128000 [channelmode] => stereo [bitrate_mode] => cbr [lossless] => [encoder_options] => CBR128 [compression_ratio] => 0.090702947845805 ) ) ) [tags] => Array ( [id3v2] => Array ( [title] => Array ( [0] => 1.mp3 ) [genre] => Array ( [0] => Dance ) ) ) [warning] => Array ( [0] => Unknown data before synch (ID3v2 header ends at 4096, then 82 bytes garbage, synch detected at 4178) ) [encoding] => UTF-8 [id3v2] => Array ( [header] => 1 [flags] => Array ( [unsynch] => [exthead] => [experim] => ) [majorversion] => 3 [minorversion] => 0 [headerlength] => 4096 [tag_offset_start] => 0 [tag_offset_end] => 4096 [encoding] => UTF-8 [comments] => Array ( [title] => Array ( [0] => 1.mp3 ) [genre] => Array ( [0] => Dance ) ) [TIT2] => Array ( [0] => Array ( [frame_name] => TIT2 [frame_flags_raw] => 0 [data] => 1.mp3 [datalength] => 7 [dataoffset] => 10 [framenamelong] => Title/songname/content description [framenameshort] => title [flags] => Array ( [TagAlterPreservation] => [FileAlterPreservation] => [ReadOnly] => [compression] => [Encryption] => [GroupingIdentity] => ) [encodingid] => 0 [encoding] => ISO-8859-1 ) ) [TCON] => Array ( [0] => Array ( [frame_name] => TCON [frame_flags_raw] => 0 [data] => 3 [datalength] => 4 [dataoffset] => 27 [framenamelong] => Content type [framenameshort] => genre [flags] => Array ( [TagAlterPreservation] => [FileAlterPreservation] => [ReadOnly] => [compression] => [Encryption] => [GroupingIdentity] => ) [encodingid] => 0 [encoding] => ISO-8859-1 ) ) [ETCO] => Array ( [0] => Array ( [frame_name] => ETCO [frame_flags_raw] => 0 [datalength] => 12 [dataoffset] => 41 [framenamelong] => Event timing codes [framenameshort] => event_timing_codes [flags] => Array ( [TagAlterPreservation] => [FileAlterPreservation] => [ReadOnly] => [compression] => [Encryption] => [GroupingIdentity] => ) [timestampformat] => 2 [typeid] => [type] => [timestamp] => ) ) [PRIV] => Array ( [0] => Array ( [frame_name] => PRIV [frame_flags_raw] => 0 [data] => [datalength] => 4023 [dataoffset] => 63 [framenamelong] => Private frame [framenameshort] => private_frame [flags] => Array ( [TagAlterPreservation] => [FileAlterPreservation] => [ReadOnly] => [compression] => [Encryption] => [GroupingIdentity] => ) [ownerid] => ) ) ) [mime_type] => audio/mpeg [mpeg] => Array ( [audio] => Array ( [raw] => Array ( [synch] => 4094 [version] => 3 [layer] => 1 [protection] => 1 [bitrate] => 9 [sample_rate] => 0 [padding] => 1 [private] => 0 [channelmode] => 0 [modeextension] => 0 [copyright] => 0 [original] => 1 [emphasis] => 0 ) [version] => 1 [layer] => 3 [channelmode] => stereo [channels] => 2 [sample_rate] => 44100 [protection] => [private] => [modeextension] => [copyright] => [original] => 1 [emphasis] => none [padding] => 1 [bitrate] => 128000 [framelength] => 418 [bitrate_mode] => cbr ) ) [playtime_seconds] => 15.8824375 [tags_html] => Array ( [id3v2] => Array ( [title] => Array ( [0] => 1.mp3 ) [genre] => Array ( [0] => Dance ) ) ) [bitrate] => 128000 [playtime_string] => 0:16 ) Oddly enough, there's a warning on line 61...and the tags I'm expecting to see under ETCO are blank! Maybe this library can't even read these tags properly...much less write them! [timestampformat] => 2 [typeid] => [type] => [timestamp] => Quote Link to comment Share on other sites More sharing options...
requinix Posted July 29, 2021 Share Posted July 29, 2021 Try using var_dump() instead of print_r(). That will show more specific information about each value, like whether something is a string and how long it is. Quote Link to comment Share on other sites More sharing options...
bschultz Posted July 29, 2021 Author Share Posted July 29, 2021 If you want to see the raw tags for yourself, the file is at http://brian-schultz.com/1.mp3 Here's the var_dump array(19) { ["GETID3_VERSION"]=> string(19) "1.9.20-202107131440" ["filesize"]=> int(258297) ["filepath"]=> string(19) "/home/brian/Desktop" ["filename"]=> string(5) "1.mp3" ["filenamepath"]=> string(25) "/home/brian/Desktop/1.mp3" ["avdataoffset"]=> int(4178) ["avdataend"]=> int(258297) ["fileformat"]=> string(3) "mp3" ["audio"]=> array(10) { ["dataformat"]=> string(3) "mp3" ["channels"]=> int(2) ["sample_rate"]=> int(44100) ["bitrate"]=> int(128000) ["channelmode"]=> string(6) "stereo" ["bitrate_mode"]=> string(3) "cbr" ["lossless"]=> bool(false) ["encoder_options"]=> string(6) "CBR128" ["compression_ratio"]=> float(0.090702947845805) ["streams"]=> array(1) { [0]=> array(9) { ["dataformat"]=> string(3) "mp3" ["channels"]=> int(2) ["sample_rate"]=> int(44100) ["bitrate"]=> int(128000) ["channelmode"]=> string(6) "stereo" ["bitrate_mode"]=> string(3) "cbr" ["lossless"]=> bool(false) ["encoder_options"]=> string(6) "CBR128" ["compression_ratio"]=> float(0.090702947845805) } } } ["tags"]=> array(1) { ["id3v2"]=> array(2) { ["title"]=> array(1) { [0]=> string(5) "1.mp3" } ["genre"]=> array(1) { [0]=> string(5) "Dance" } } } ["warning"]=> array(1) { [0]=> string(100) "Unknown data before synch (ID3v2 header ends at 4096, then 82 bytes garbage, synch detected at 4178)" } ["encoding"]=> string(5) "UTF-8" ["id3v2"]=> array(13) { ["header"]=> bool(true) ["flags"]=> array(3) { ["unsynch"]=> bool(false) ["exthead"]=> bool(false) ["experim"]=> bool(false) } ["majorversion"]=> int(3) ["minorversion"]=> int(0) ["headerlength"]=> int(4096) ["tag_offset_start"]=> int(0) ["tag_offset_end"]=> int(4096) ["encoding"]=> string(5) "UTF-8" ["comments"]=> array(2) { ["title"]=> array(1) { [0]=> string(5) "1.mp3" } ["genre"]=> array(1) { [0]=> string(5) "Dance" } } ["TIT2"]=> array(1) { [0]=> array(10) { ["frame_name"]=> string(4) "TIT2" ["frame_flags_raw"]=> int(0) ["data"]=> string(5) "1.mp3" ["datalength"]=> int(7) ["dataoffset"]=> int(10) ["framenamelong"]=> string(34) "Title/songname/content description" ["framenameshort"]=> string(5) "title" ["flags"]=> array(6) { ["TagAlterPreservation"]=> bool(false) ["FileAlterPreservation"]=> bool(false) ["ReadOnly"]=> bool(false) ["compression"]=> bool(false) ["Encryption"]=> bool(false) ["GroupingIdentity"]=> bool(false) } ["encodingid"]=> int(0) ["encoding"]=> string(10) "ISO-8859-1" } } ["TCON"]=> array(1) { [0]=> array(10) { ["frame_name"]=> string(4) "TCON" ["frame_flags_raw"]=> int(0) ["data"]=> string(2) " 3" ["datalength"]=> int(4) ["dataoffset"]=> int(27) ["framenamelong"]=> string(12) "Content type" ["framenameshort"]=> string(5) "genre" ["flags"]=> array(6) { ["TagAlterPreservation"]=> bool(false) ["FileAlterPreservation"]=> bool(false) ["ReadOnly"]=> bool(false) ["compression"]=> bool(false) ["Encryption"]=> bool(false) ["GroupingIdentity"]=> bool(false) } ["encodingid"]=> int(0) ["encoding"]=> string(10) "ISO-8859-1" } } ["ETCO"]=> array(1) { [0]=> array(11) { ["frame_name"]=> string(4) "ETCO" ["frame_flags_raw"]=> int(0) ["datalength"]=> int(12) ["dataoffset"]=> int(41) ["framenamelong"]=> string(18) "Event timing codes" ["framenameshort"]=> string(18) "event_timing_codes" ["flags"]=> array(6) { ["TagAlterPreservation"]=> bool(false) ["FileAlterPreservation"]=> bool(false) ["ReadOnly"]=> bool(false) ["compression"]=> bool(false) ["Encryption"]=> bool(false) ["GroupingIdentity"]=> bool(false) } ["timestampformat"]=> int(2) ["typeid"]=> string(1) "" ["type"]=> string(0) "" ["timestamp"]=> bool(false) } } ["PRIV"]=> array(1) { [0]=> array(9) { ["frame_name"]=> string(4) "PRIV" ["frame_flags_raw"]=> int(0) ["data"]=> string(4022) "" ["datalength"]=> int(4023) ["dataoffset"]=> int(63) ["framenamelong"]=> string(13) "Private frame" ["framenameshort"]=> string(13) "private_frame" ["flags"]=> array(6) { ["TagAlterPreservation"]=> bool(false) ["FileAlterPreservation"]=> bool(false) ["ReadOnly"]=> bool(false) ["compression"]=> bool(false) ["Encryption"]=> bool(false) ["GroupingIdentity"]=> bool(false) } ["ownerid"]=> string(0) "" } } } ["mime_type"]=> string(10) "audio/mpeg" ["mpeg"]=> array(1) { ["audio"]=> array(16) { ["raw"]=> array(13) { ["synch"]=> int(4094) ["version"]=> int(3) ["layer"]=> int(1) ["protection"]=> int(1) ["bitrate"]=> int(9) ["sample_rate"]=> int(0) ["padding"]=> int(1) ["private"]=> int(0) ["channelmode"]=> int(0) ["modeextension"]=> int(0) ["copyright"]=> int(0) ["original"]=> int(1) ["emphasis"]=> int(0) } ["version"]=> string(1) "1" ["layer"]=> int(3) ["channelmode"]=> string(6) "stereo" ["channels"]=> int(2) ["sample_rate"]=> int(44100) ["protection"]=> bool(false) ["private"]=> bool(false) ["modeextension"]=> string(0) "" ["copyright"]=> bool(false) ["original"]=> bool(true) ["emphasis"]=> string(4) "none" ["padding"]=> bool(true) ["bitrate"]=> int(128000) ["framelength"]=> int(418) ["bitrate_mode"]=> string(3) "cbr" } } ["playtime_seconds"]=> float(15.8824375) ["tags_html"]=> array(1) { ["id3v2"]=> array(2) { ["title"]=> array(1) { [0]=> string(5) "1.mp3" } ["genre"]=> array(1) { [0]=> string(5) "Dance" } } } ["bitrate"]=> int(128000) ["playtime_string"]=> string(4) "0:16" } Quote Link to comment Share on other sites More sharing options...
requinix Posted July 29, 2021 Share Posted July 29, 2021 Kinda seems like the library is buggy. The code I linked to has a rather noticeable bug, and your var_dump() output shows it knows the data length but apparently can't get the data itself. Quote Link to comment Share on other sites More sharing options...
bschultz Posted July 29, 2021 Author Share Posted July 29, 2021 Not that I want you to fix someone else's problem...but can this be fixed? Quote Link to comment Share on other sites More sharing options...
requinix Posted July 29, 2021 Share Posted July 29, 2021 Unless you need something immediately, I would wait on your issue. Looks like the author is still active. Quote Link to comment Share on other sites More sharing options...
bschultz Posted July 29, 2021 Author Share Posted July 29, 2021 He's not active enough for my liking...but i hear ya! My first post there was over a week ago. I'd like to shave 30 minutes a week off my week! Quote Link to comment Share on other sites More sharing options...
requinix Posted July 29, 2021 Share Posted July 29, 2021 Pull up your local copy of getID3's write.id3v2.php, jump down to the section about ETCO, and edit the first line of if (!$this->ID3v2IsValidETCOevent($val['typeid'])) { $this->errors[] = 'Invalid Event Type byte in '.$frame_name.' ('.$val['typeid'].')'; } elseif (($key != 'timestampformat') && ($key != 'flags')) { to be if (is_array($val) && !$this->ID3v2IsValidETCOevent($val['typeid'])) { You know. For the fun of it. When you say it doesn't write tags, does it not write any tags? Or writes tags except for the ETCO? What if you omit the ETCO tag and try to do everything else? Quote Link to comment Share on other sites More sharing options...
bschultz Posted July 29, 2021 Author Share Posted July 29, 2021 It does write other tags...normal ones like artist, title, year, etc...but not ETCo tags. The change to the write.id3v2.php did NOT write these tags. here's the new var_dump array(19) { ["GETID3_VERSION"]=> string(19) "1.9.20-202107131440" ["filesize"]=> int(181019) ["filepath"]=> string(19) "/home/brian/Desktop" ["filename"]=> string(5) "1.mp3" ["filenamepath"]=> string(25) "/home/brian/Desktop/1.mp3" ["avdataoffset"]=> int(4096) ["avdataend"]=> int(180891) ["fileformat"]=> string(3) "mp3" ["audio"]=> array(12) { ["dataformat"]=> string(3) "mp3" ["channels"]=> int(2) ["sample_rate"]=> int(44100) ["bitrate"]=> int(128000) ["channelmode"]=> string(6) "stereo" ["bitrate_mode"]=> string(3) "cbr" ["codec"]=> string(4) "LAME" ["encoder"]=> string(9) "LAME3.99r" ["lossless"]=> bool(false) ["encoder_options"]=> string(6) "CBR128" ["compression_ratio"]=> float(0.090702947845805) ["streams"]=> array(1) { [0]=> array(11) { ["dataformat"]=> string(3) "mp3" ["channels"]=> int(2) ["sample_rate"]=> int(44100) ["bitrate"]=> int(128000) ["channelmode"]=> string(6) "stereo" ["bitrate_mode"]=> string(3) "cbr" ["codec"]=> string(4) "LAME" ["encoder"]=> string(9) "LAME3.99r" ["lossless"]=> bool(false) ["encoder_options"]=> string(6) "CBR128" ["compression_ratio"]=> float(0.090702947845805) } } } ["tags"]=> array(2) { ["id3v1"]=> array(4) { ["title"]=> array(1) { [0]=> string(7) "My Song" } ["artist"]=> array(1) { [0]=> string(10) "The Artist" } ["album"]=> array(1) { [0]=> string(13) "Greatest Hits" } ["year"]=> array(1) { [0]=> string(4) "2004" } } ["id3v2"]=> array(5) { ["title"]=> array(1) { [0]=> string(7) "My Song" } ["artist"]=> array(1) { [0]=> string(10) "The Artist" } ["album"]=> array(1) { [0]=> string(13) "Greatest Hits" } ["year"]=> array(1) { [0]=> string(4) "2004" } ["genre"]=> array(1) { [0]=> string(5) "Dance" } } } ["encoding"]=> string(5) "UTF-8" ["id3v2"]=> array(15) { ["header"]=> bool(true) ["flags"]=> array(3) { ["unsynch"]=> bool(false) ["exthead"]=> bool(false) ["experim"]=> bool(false) } ["majorversion"]=> int(3) ["minorversion"]=> int(0) ["headerlength"]=> int(4096) ["tag_offset_start"]=> int(0) ["tag_offset_end"]=> int(4096) ["encoding"]=> string(5) "UTF-8" ["comments"]=> array(5) { ["title"]=> array(1) { [0]=> string(7) "My Song" } ["artist"]=> array(1) { [0]=> string(10) "The Artist" } ["album"]=> array(1) { [0]=> string(13) "Greatest Hits" } ["year"]=> array(1) { [0]=> string(4) "2004" } ["genre"]=> array(1) { [0]=> string(5) "Dance" } } ["TIT2"]=> array(1) { [0]=> array(10) { ["frame_name"]=> string(4) "TIT2" ["frame_flags_raw"]=> int(0) ["data"]=> string(7) "My Song" ["datalength"]=> int(8) ["dataoffset"]=> int(10) ["framenamelong"]=> string(34) "Title/songname/content description" ["framenameshort"]=> string(5) "title" ["flags"]=> array(6) { ["TagAlterPreservation"]=> bool(false) ["FileAlterPreservation"]=> bool(false) ["ReadOnly"]=> bool(false) ["compression"]=> bool(false) ["Encryption"]=> bool(false) ["GroupingIdentity"]=> bool(false) } ["encodingid"]=> int(0) ["encoding"]=> string(10) "ISO-8859-1" } } ["TPE1"]=> array(1) { [0]=> array(10) { ["frame_name"]=> string(4) "TPE1" ["frame_flags_raw"]=> int(0) ["data"]=> string(10) "The Artist" ["datalength"]=> int(11) ["dataoffset"]=> int(28) ["framenamelong"]=> string(28) "Lead performer(s)/Soloist(s)" ["framenameshort"]=> string(6) "artist" ["flags"]=> array(6) { ["TagAlterPreservation"]=> bool(false) ["FileAlterPreservation"]=> bool(false) ["ReadOnly"]=> bool(false) ["compression"]=> bool(false) ["Encryption"]=> bool(false) ["GroupingIdentity"]=> bool(false) } ["encodingid"]=> int(0) ["encoding"]=> string(10) "ISO-8859-1" } } ["TALB"]=> array(1) { [0]=> array(10) { ["frame_name"]=> string(4) "TALB" ["frame_flags_raw"]=> int(0) ["data"]=> string(13) "Greatest Hits" ["datalength"]=> int(14) ["dataoffset"]=> int(49) ["framenamelong"]=> string(22) "Album/Movie/Show title" ["framenameshort"]=> string(5) "album" ["flags"]=> array(6) { ["TagAlterPreservation"]=> bool(false) ["FileAlterPreservation"]=> bool(false) ["ReadOnly"]=> bool(false) ["compression"]=> bool(false) ["Encryption"]=> bool(false) ["GroupingIdentity"]=> bool(false) } ["encodingid"]=> int(0) ["encoding"]=> string(10) "ISO-8859-1" } } ["TYER"]=> array(1) { [0]=> array(10) { ["frame_name"]=> string(4) "TYER" ["frame_flags_raw"]=> int(0) ["data"]=> string(4) "2004" ["datalength"]=> int(5) ["dataoffset"]=> int(73) ["framenamelong"]=> string(4) "Year" ["framenameshort"]=> string(4) "year" ["flags"]=> array(6) { ["TagAlterPreservation"]=> bool(false) ["FileAlterPreservation"]=> bool(false) ["ReadOnly"]=> bool(false) ["compression"]=> bool(false) ["Encryption"]=> bool(false) ["GroupingIdentity"]=> bool(false) } ["encodingid"]=> int(0) ["encoding"]=> string(10) "ISO-8859-1" } } ["TCON"]=> array(1) { [0]=> array(10) { ["frame_name"]=> string(4) "TCON" ["frame_flags_raw"]=> int(0) ["data"]=> string(1) "3" ["datalength"]=> int(2) ["dataoffset"]=> int(88) ["framenamelong"]=> string(12) "Content type" ["framenameshort"]=> string(5) "genre" ["flags"]=> array(6) { ["TagAlterPreservation"]=> bool(false) ["FileAlterPreservation"]=> bool(false) ["ReadOnly"]=> bool(false) ["compression"]=> bool(false) ["Encryption"]=> bool(false) ["GroupingIdentity"]=> bool(false) } ["encodingid"]=> int(0) ["encoding"]=> string(10) "ISO-8859-1" } } ["padding"]=> array(3) { ["start"]=> int(100) ["length"]=> int(3996) ["valid"]=> bool(true) } } ["id3v1"]=> array(10) { ["title"]=> string(7) "My Song" ["artist"]=> string(10) "The Artist" ["album"]=> string(13) "Greatest Hits" ["year"]=> string(4) "2004" ["comment"]=> string(0) "" ["comments"]=> array(5) { ["title"]=> array(1) { [0]=> string(7) "My Song" } ["artist"]=> array(1) { [0]=> string(10) "The Artist" } ["album"]=> array(1) { [0]=> string(13) "Greatest Hits" } ["year"]=> array(1) { [0]=> string(4) "2004" } ["comment"]=> array(1) { [0]=> string(0) "" } } ["padding_valid"]=> bool(true) ["tag_offset_end"]=> int(181019) ["tag_offset_start"]=> int(180891) ["encoding"]=> string(10) "ISO-8859-1" } ["mime_type"]=> string(10) "audio/mpeg" ["mpeg"]=> array(1) { ["audio"]=> array(23) { ["raw"]=> array(13) { ["synch"]=> int(4094) ["version"]=> int(3) ["layer"]=> int(1) ["protection"]=> int(1) ["bitrate"]=> int(9) ["sample_rate"]=> int(0) ["padding"]=> int(0) ["private"]=> int(0) ["channelmode"]=> int(0) ["modeextension"]=> int(0) ["copyright"]=> int(0) ["original"]=> int(1) ["emphasis"]=> int(0) } ["version"]=> string(1) "1" ["layer"]=> int(3) ["channelmode"]=> string(6) "stereo" ["channels"]=> int(2) ["sample_rate"]=> int(44100) ["protection"]=> bool(false) ["private"]=> bool(false) ["modeextension"]=> string(0) "" ["copyright"]=> bool(false) ["original"]=> bool(true) ["emphasis"]=> string(4) "none" ["padding"]=> bool(false) ["bitrate"]=> int(128000) ["framelength"]=> float(418) ["bitrate_mode"]=> string(3) "cbr" ["VBR_method"]=> string(4) "Xing" ["xing_flags_raw"]=> int(15) ["xing_flags"]=> array(4) { ["frames"]=> bool(true) ["bytes"]=> bool(true) ["toc"]=> bool(true) ["vbr_scale"]=> bool(true) } ["VBR_frames"]=> int(422) ["VBR_bytes"]=> int(176795) ["toc"]=> array(100) { [0]=> int(0) [1]=> int(3) [2]=> int(6) [3]=> int(8) [4]=> int(10) [5]=> int(13) [6]=> int(15) [7]=> int(18) [8]=> int(20) [9]=> int(23) [10]=> int(26) [11]=> int(29) [12]=> int(31) [13]=> int(33) [14]=> int(36) [15]=> int(38) [16]=> int(41) [17]=> int(43) [18]=> int(46) [19]=> int(49) [20]=> int(52) [21]=> int(54) [22]=> int(57) [23]=> int(59) [24]=> int(61) [25]=> int(64) [26]=> int(66) [27]=> int(69) [28]=> int(72) [29]=> int(75) [30]=> int(77) [31]=> int(80) [32]=> int(82) [33]=> int(84) [34]=> int(87) [35]=> int(89) [36]=> int(92) [37]=> int(95) [38]=> int(98) [39]=> int(100) [40]=> int(103) [41]=> int(105) [42]=> int(107) [43]=> int(110) [44]=> int(112) [45]=> int(115) [46]=> int(118) [47]=> int(121) [48]=> int(123) [49]=> int(126) [50]=> int(128) [51]=> int(131) [52]=> int(133) [53]=> int(135) [54]=> int(138) [55]=> int(141) [56]=> int(144) [57]=> int(146) [58]=> int(149) [59]=> int(151) [60]=> int(154) [61]=> int(156) [62]=> int(158) [63]=> int(161) [64]=> int(165) [65]=> int(167) [66]=> int(169) [67]=> int(172) [68]=> int(174) [69]=> int(177) [70]=> int(179) [71]=> int(181) [72]=> int(184) [73]=> int(188) [74]=> int(190) [75]=> int(192) [76]=> int(195) [77]=> int(197) [78]=> int(200) [79]=> int(202) [80]=> int(205) [81]=> int(207) [82]=> int(211) [83]=> int(213) [84]=> int(215) [85]=> int(218) [86]=> int(220) [87]=> int(223) [88]=> int(225) [89]=> int(228) [90]=> int(230) [91]=> int(234) [92]=> int(236) [93]=> int(239) [94]=> int(241) [95]=> int(243) [96]=> int(246) [97]=> int(248) [98]=> int(251) [99]=> int(253) } ["LAME"]=> array(24) { ["short_version"]=> string(9) "LAME3.99r" ["numeric_version"]=> string(5) "3.99r" ["integer_version"]=> array(2) { [0]=> int(3) [1]=> int(99) } ["raw"]=> array(10) { ["vbr_method"]=> int(1) ["RGAD_track"]=> int(0) ["RGAD_album"]=> int(0) ["abrbitrate_minbitrate"]=> int(128) ["noise_shaping"]=> int(2) ["stereo_mode"]=> int(1) ["not_optimal_quality"]=> int(0) ["source_sample_freq"]=> int(1) ["mp3_gain"]=> int(0) ["surround_info"]=> int(0) } ["vbr_quality"]=> int(57) ["tag_revision"]=> int(0) ["vbr_method"]=> string(3) "cbr" ["lowpass_frequency"]=> int(17000) ["encoding_flags"]=> array(4) { ["nspsytune"]=> bool(true) ["nssafejoint"]=> bool(false) ["nogap_next"]=> bool(false) ["nogap_prev"]=> bool(false) } ["ath_type"]=> int(4) ["encoder_delay"]=> int(576) ["end_padding"]=> int(1088) ["noise_shaping"]=> int(2) ["stereo_mode"]=> string(6) "stereo" ["not_optimal_quality"]=> bool(false) ["source_sample_freq"]=> string(8) "44.1 kHz" ["mp3_gain_db"]=> float(0) ["mp3_gain_factor"]=> float(1) ["surround_info"]=> string(16) "no surround info" ["preset_used_id"]=> int(128) ["preset_used"]=> string(20) "--alt-preset cbr 128" ["audio_bytes"]=> int(176795) ["music_crc"]=> int(33268) ["lame_tag_crc"]=> int(56695) } } } ["playtime_seconds"]=> float(11.0235625) ["tags_html"]=> array(2) { ["id3v1"]=> array(4) { ["title"]=> array(1) { [0]=> string(7) "My Song" } ["artist"]=> array(1) { [0]=> string(10) "The Artist" } ["album"]=> array(1) { [0]=> string(13) "Greatest Hits" } ["year"]=> array(1) { [0]=> string(4) "2004" } } ["id3v2"]=> array(5) { ["title"]=> array(1) { [0]=> string(7) "My Song" } ["artist"]=> array(1) { [0]=> string(10) "The Artist" } ["album"]=> array(1) { [0]=> string(13) "Greatest Hits" } ["year"]=> array(1) { [0]=> string(4) "2004" } ["genre"]=> array(1) { [0]=> string(5) "Dance" } } } ["bitrate"]=> int(128000) ["playtime_string"]=> string(4) "0:11" } Quote Link to comment Share on other sites More sharing options...
requinix Posted July 29, 2021 Share Posted July 29, 2021 3 hours ago, bschultz said: It does write other tags...normal ones like artist, title, year, etc...but not ETCo tags. I don't see how that can be... What's the full code you have, covering the part where you set up the tag data and the part where you use the library to write it, as well as everything in between? Quote Link to comment Share on other sites More sharing options...
bschultz Posted July 29, 2021 Author Share Posted July 29, 2021 <?php ///////////////////////////////////////////////////////////////// /// getID3() by James Heinrich <info@getid3.org> // // available at https://github.com/JamesHeinrich/getID3 // // or https://www.getid3.org // // or http://getid3.sourceforge.net // // // // /demo/demo.simple.write.php - part of getID3() // // Sample script showing basic syntax for writing tags // // see readme.txt for more details // // /// ///////////////////////////////////////////////////////////////// //die('For security reasons, this demo has been disabled. It can be enabled by removing line '.__LINE__.' in demos/'.basename(__FILE__)); $TextEncoding = 'UTF-8'; require_once('/home/brian/getID3/getid3/getid3.php'); // Initialize getID3 engine $getID3 = new getID3; $getID3->setOption(array('encoding'=>$TextEncoding)); require_once('/home/brian/getID3/getid3/write.php'); // Initialize getID3 tag-writing module $tagwriter = new getid3_writetags; $tagwriter->filename = '/home/brian/Desktop/1.mp3'; $tagwriter->tagformats = array('id3v1', 'id3v2.3'); // set various options (optional) $tagwriter->overwrite_tags = true; // if true will erase existing tag data and write only passed data; if false will merge passed data with existing tag data (experimental) $tagwriter->remove_other_tags = true; // if true removes other tag formats (e.g. ID3v1, ID3v2, APE, Lyrics3, etc) that may be present in the file and only write the specified tag format(s). If false leaves any unspecified tag formats as-is. $tagwriter->tag_encoding = $TextEncoding; // populate data array $TagData = array( 'title' => array('My Song'), 'artist' => array('The Artist'), 'album' => array('Greatest Hits'), 'year' => array('2004'), 'genre' => array('3') ); $TagData['id3v2']['ETCO'] = [ "timestampformat" => 2, ["typeid" => 3, "timestamp" => 1000], ["typeid" => 4, "timestamp" => 1500], // etc ]; /* other ways I've tried $TagData['id3v2'][0] = array( 'frame_name' => 'ETCO', 'data' => 3, 'type' => 3, 'timestamp' => 1000, 'framenamelong' => 'Event Timing Codes', 'framenameshort' => 'event timing codes', 'timestampformat' => '2' ); $TagData['id3v2'][0] = array( 'frame_name' => 'ETCO', 'data' => 4, 'type' => 4, 'timestamp' => 1500, 'framenamelong' => 'Event Timing Codes', 'framenameshort' => 'event timing codes', 'timestampformat' => '2' ); $TagData['id3v2']['ETCO']['frame_name'] = 'ETCO'; $TagData['id3v2']['ETCO']['data'] = 3; // from the standard at https://id3.org/id3v2.3.0#sec4.6 $TagData['id3v2']['ETCO']['type'] = 3; // type 3 is mainpart start $TagData['id3v2']['ETCO']['timestamp'] = 1000; // milliseconds $TagData['id3v2']['ETCO']['timestampformat'] = 2; // timestamp format #2 which is Absolute time, 32 bit sized, using milliseconds as unit $TagData['id3v2']['ETCO']['data'] = 4; // from the standard at https://id3.org/id3v2.3.0#sec4.6 $TagData['id3v2']['ETCO']['type'] = 4; // type 4 is outro start $TagData['id3v2']['ETCO']['timestamp'] = 1500; // milliseconds $TagData['id3v2']['ETCO']['timestampformat'] = 2; // timestamp format #2 which is Absolute time, 32 bit sized, using milliseconds as unit $TagData['id3v2'][0]['TCON']['frame_flags_raw'] = 0; $TagData['id3v2'][0]['TCON']['data'] = 3; $TagData['id3v2'][0]['TCON']['datalength'] = 4; $TagData['id3v2'][0]['TCON']['dataoffset'] = 55; $TagData['id3v2'][0]['TCON']['framenameshort'] = 'genre'; */ $tagwriter->tag_data = $TagData; // write tags if ($tagwriter->WriteTags()) { echo 'Successfully wrote tags<br>'; if (!empty($tagwriter->warnings)) { echo 'There were some warnings:<br>'.implode('<br><br>', $tagwriter->warnings); } } else { echo 'Failed to write tags!<br>'.implode('<br><br>', $tagwriter->errors); } ?> Quote Link to comment Share on other sites More sharing options...
requinix Posted July 29, 2021 Share Posted July 29, 2021 Not exactly the best library I've ever seen... Try changing $TagData['id3v2']['ETCO'] = [ to $TagData['id3v2']['event_timing_codes'] = [ Quote Link to comment Share on other sites More sharing options...
bschultz Posted July 29, 2021 Author Share Posted July 29, 2021 NO ETCO tags written...new var dump. This is the only tag writer I've seen that even mentions ETCO tags or I would have tried something else a LONG time ago! Thank you for this! array(19) { ["GETID3_VERSION"]=> string(19) "1.9.20-202107131440" ["filesize"]=> int(262521) ["filepath"]=> string(19) "/home/brian/Desktop" ["filename"]=> string(5) "1.mp3" ["filenamepath"]=> string(25) "/home/brian/Desktop/1.mp3" ["avdataoffset"]=> int(4096) ["avdataend"]=> int(262393) ["fileformat"]=> string(3) "mp3" ["audio"]=> array(12) { ["dataformat"]=> string(3) "mp3" ["channels"]=> int(2) ["sample_rate"]=> int(44100) ["bitrate"]=> int(128000) ["channelmode"]=> string(6) "stereo" ["bitrate_mode"]=> string(3) "cbr" ["codec"]=> string(4) "LAME" ["encoder"]=> string(9) "LAME3.100" ["lossless"]=> bool(false) ["encoder_options"]=> string(6) "CBR128" ["compression_ratio"]=> float(0.090702947845805) ["streams"]=> array(1) { [0]=> array(11) { ["dataformat"]=> string(3) "mp3" ["channels"]=> int(2) ["sample_rate"]=> int(44100) ["bitrate"]=> int(128000) ["channelmode"]=> string(6) "stereo" ["bitrate_mode"]=> string(3) "cbr" ["codec"]=> string(4) "LAME" ["encoder"]=> string(9) "LAME3.100" ["lossless"]=> bool(false) ["encoder_options"]=> string(6) "CBR128" ["compression_ratio"]=> float(0.090702947845805) } } } ["tags"]=> array(2) { ["id3v1"]=> array(4) { ["title"]=> array(1) { [0]=> string(7) "My Song" } ["artist"]=> array(1) { [0]=> string(10) "The Artist" } ["album"]=> array(1) { [0]=> string(13) "Greatest Hits" } ["year"]=> array(1) { [0]=> string(4) "2004" } } ["id3v2"]=> array(5) { ["title"]=> array(1) { [0]=> string(7) "My Song" } ["artist"]=> array(1) { [0]=> string(10) "The Artist" } ["album"]=> array(1) { [0]=> string(13) "Greatest Hits" } ["year"]=> array(1) { [0]=> string(4) "2004" } ["genre"]=> array(1) { [0]=> string(5) "Dance" } } } ["encoding"]=> string(5) "UTF-8" ["id3v2"]=> array(15) { ["header"]=> bool(true) ["flags"]=> array(3) { ["unsynch"]=> bool(false) ["exthead"]=> bool(false) ["experim"]=> bool(false) } ["majorversion"]=> int(3) ["minorversion"]=> int(0) ["headerlength"]=> int(4096) ["tag_offset_start"]=> int(0) ["tag_offset_end"]=> int(4096) ["encoding"]=> string(5) "UTF-8" ["comments"]=> array(5) { ["title"]=> array(1) { [0]=> string(7) "My Song" } ["artist"]=> array(1) { [0]=> string(10) "The Artist" } ["album"]=> array(1) { [0]=> string(13) "Greatest Hits" } ["year"]=> array(1) { [0]=> string(4) "2004" } ["genre"]=> array(1) { [0]=> string(5) "Dance" } } ["TIT2"]=> array(1) { [0]=> array(10) { ["frame_name"]=> string(4) "TIT2" ["frame_flags_raw"]=> int(0) ["data"]=> string(7) "My Song" ["datalength"]=> int(8) ["dataoffset"]=> int(10) ["framenamelong"]=> string(34) "Title/songname/content description" ["framenameshort"]=> string(5) "title" ["flags"]=> array(6) { ["TagAlterPreservation"]=> bool(false) ["FileAlterPreservation"]=> bool(false) ["ReadOnly"]=> bool(false) ["compression"]=> bool(false) ["Encryption"]=> bool(false) ["GroupingIdentity"]=> bool(false) } ["encodingid"]=> int(0) ["encoding"]=> string(10) "ISO-8859-1" } } ["TPE1"]=> array(1) { [0]=> array(10) { ["frame_name"]=> string(4) "TPE1" ["frame_flags_raw"]=> int(0) ["data"]=> string(10) "The Artist" ["datalength"]=> int(11) ["dataoffset"]=> int(28) ["framenamelong"]=> string(28) "Lead performer(s)/Soloist(s)" ["framenameshort"]=> string(6) "artist" ["flags"]=> array(6) { ["TagAlterPreservation"]=> bool(false) ["FileAlterPreservation"]=> bool(false) ["ReadOnly"]=> bool(false) ["compression"]=> bool(false) ["Encryption"]=> bool(false) ["GroupingIdentity"]=> bool(false) } ["encodingid"]=> int(0) ["encoding"]=> string(10) "ISO-8859-1" } } ["TALB"]=> array(1) { [0]=> array(10) { ["frame_name"]=> string(4) "TALB" ["frame_flags_raw"]=> int(0) ["data"]=> string(13) "Greatest Hits" ["datalength"]=> int(14) ["dataoffset"]=> int(49) ["framenamelong"]=> string(22) "Album/Movie/Show title" ["framenameshort"]=> string(5) "album" ["flags"]=> array(6) { ["TagAlterPreservation"]=> bool(false) ["FileAlterPreservation"]=> bool(false) ["ReadOnly"]=> bool(false) ["compression"]=> bool(false) ["Encryption"]=> bool(false) ["GroupingIdentity"]=> bool(false) } ["encodingid"]=> int(0) ["encoding"]=> string(10) "ISO-8859-1" } } ["TYER"]=> array(1) { [0]=> array(10) { ["frame_name"]=> string(4) "TYER" ["frame_flags_raw"]=> int(0) ["data"]=> string(4) "2004" ["datalength"]=> int(5) ["dataoffset"]=> int(73) ["framenamelong"]=> string(4) "Year" ["framenameshort"]=> string(4) "year" ["flags"]=> array(6) { ["TagAlterPreservation"]=> bool(false) ["FileAlterPreservation"]=> bool(false) ["ReadOnly"]=> bool(false) ["compression"]=> bool(false) ["Encryption"]=> bool(false) ["GroupingIdentity"]=> bool(false) } ["encodingid"]=> int(0) ["encoding"]=> string(10) "ISO-8859-1" } } ["TCON"]=> array(1) { [0]=> array(10) { ["frame_name"]=> string(4) "TCON" ["frame_flags_raw"]=> int(0) ["data"]=> string(1) "3" ["datalength"]=> int(2) ["dataoffset"]=> int(88) ["framenamelong"]=> string(12) "Content type" ["framenameshort"]=> string(5) "genre" ["flags"]=> array(6) { ["TagAlterPreservation"]=> bool(false) ["FileAlterPreservation"]=> bool(false) ["ReadOnly"]=> bool(false) ["compression"]=> bool(false) ["Encryption"]=> bool(false) ["GroupingIdentity"]=> bool(false) } ["encodingid"]=> int(0) ["encoding"]=> string(10) "ISO-8859-1" } } ["padding"]=> array(3) { ["start"]=> int(100) ["length"]=> int(3996) ["valid"]=> bool(true) } } ["id3v1"]=> array(10) { ["title"]=> string(7) "My Song" ["artist"]=> string(10) "The Artist" ["album"]=> string(13) "Greatest Hits" ["year"]=> string(4) "2004" ["comment"]=> string(0) "" ["comments"]=> array(5) { ["title"]=> array(1) { [0]=> string(7) "My Song" } ["artist"]=> array(1) { [0]=> string(10) "The Artist" } ["album"]=> array(1) { [0]=> string(13) "Greatest Hits" } ["year"]=> array(1) { [0]=> string(4) "2004" } ["comment"]=> array(1) { [0]=> string(0) "" } } ["padding_valid"]=> bool(true) ["tag_offset_end"]=> int(262521) ["tag_offset_start"]=> int(262393) ["encoding"]=> string(10) "ISO-8859-1" } ["mime_type"]=> string(10) "audio/mpeg" ["mpeg"]=> array(1) { ["audio"]=> array(23) { ["raw"]=> array(13) { ["synch"]=> int(4094) ["version"]=> int(3) ["layer"]=> int(1) ["protection"]=> int(1) ["bitrate"]=> int(9) ["sample_rate"]=> int(0) ["padding"]=> int(0) ["private"]=> int(0) ["channelmode"]=> int(0) ["modeextension"]=> int(0) ["copyright"]=> int(0) ["original"]=> int(1) ["emphasis"]=> int(0) } ["version"]=> string(1) "1" ["layer"]=> int(3) ["channelmode"]=> string(6) "stereo" ["channels"]=> int(2) ["sample_rate"]=> int(44100) ["protection"]=> bool(false) ["private"]=> bool(false) ["modeextension"]=> string(0) "" ["copyright"]=> bool(false) ["original"]=> bool(true) ["emphasis"]=> string(4) "none" ["padding"]=> bool(false) ["bitrate"]=> int(128000) ["framelength"]=> float(418) ["bitrate_mode"]=> string(3) "cbr" ["VBR_method"]=> string(4) "Xing" ["xing_flags_raw"]=> int(15) ["xing_flags"]=> array(4) { ["frames"]=> bool(true) ["bytes"]=> bool(true) ["toc"]=> bool(true) ["vbr_scale"]=> bool(true) } ["VBR_frames"]=> int(617) ["VBR_bytes"]=> int(258297) ["toc"]=> array(100) { [0]=> int(0) [1]=> int(3) [2]=> int(5) [3]=> int(8) [4]=> int(10) [5]=> int(13) [6]=> int(15) [7]=> int(18) [8]=> int(20) [9]=> int(23) [10]=> int(25) [11]=> int(28) [12]=> int(30) [13]=> int(34) [14]=> int(36) [15]=> int(39) [16]=> int(41) [17]=> int(43) [18]=> int(46) [19]=> int(48) [20]=> int(51) [21]=> int(53) [22]=> int(56) [23]=> int(58) [24]=> int(61) [25]=> int(64) [26]=> int(67) [27]=> int(69) [28]=> int(72) [29]=> int(74) [30]=> int(77) [31]=> int(79) [32]=> int(82) [33]=> int(84) [34]=> int(87) [35]=> int(89) [36]=> int(92) [37]=> int(94) [38]=> int(97) [39]=> int(100) [40]=> int(102) [41]=> int(105) [42]=> int(107) [43]=> int(110) [44]=> int(112) [45]=> int(115) [46]=> int(117) [47]=> int(120) [48]=> int(122) [49]=> int(125) [50]=> int(128) [51]=> int(131) [52]=> int(133) [53]=> int(136) [54]=> int(138) [55]=> int(141) [56]=> int(143) [57]=> int(146) [58]=> int(148) [59]=> int(151) [60]=> int(153) [61]=> int(156) [62]=> int(158) [63]=> int(161) [64]=> int(164) [65]=> int(166) [66]=> int(169) [67]=> int(171) [68]=> int(174) [69]=> int(176) [70]=> int(179) [71]=> int(181) [72]=> int(184) [73]=> int(186) [74]=> int(189) [75]=> int(192) [76]=> int(195) [77]=> int(197) [78]=> int(199) [79]=> int(202) [80]=> int(204) [81]=> int(207) [82]=> int(209) [83]=> int(212) [84]=> int(214) [85]=> int(217) [86]=> int(219) [87]=> int(222) [88]=> int(225) [89]=> int(228) [90]=> int(230) [91]=> int(233) [92]=> int(235) [93]=> int(238) [94]=> int(240) [95]=> int(243) [96]=> int(245) [97]=> int(248) [98]=> int(250) [99]=> int(253) } ["LAME"]=> array(24) { ["short_version"]=> string(9) "LAME3.100" ["numeric_version"]=> string(5) "3.100" ["integer_version"]=> array(2) { [0]=> int(3) [1]=> int(100) } ["raw"]=> array(10) { ["vbr_method"]=> int(1) ["RGAD_track"]=> int(0) ["RGAD_album"]=> int(0) ["abrbitrate_minbitrate"]=> int(128) ["noise_shaping"]=> int(2) ["stereo_mode"]=> int(1) ["not_optimal_quality"]=> int(0) ["source_sample_freq"]=> int(1) ["mp3_gain"]=> int(0) ["surround_info"]=> int(0) } ["vbr_quality"]=> int(57) ["tag_revision"]=> int(0) ["vbr_method"]=> string(3) "cbr" ["lowpass_frequency"]=> int(17000) ["encoding_flags"]=> array(4) { ["nspsytune"]=> bool(true) ["nssafejoint"]=> bool(false) ["nogap_next"]=> bool(false) ["nogap_prev"]=> bool(false) } ["ath_type"]=> int(4) ["encoder_delay"]=> int(576) ["end_padding"]=> int(1600) ["noise_shaping"]=> int(2) ["stereo_mode"]=> string(6) "stereo" ["not_optimal_quality"]=> bool(false) ["source_sample_freq"]=> string(8) "44.1 kHz" ["mp3_gain_db"]=> float(0) ["mp3_gain_factor"]=> float(1) ["surround_info"]=> string(16) "no surround info" ["preset_used_id"]=> int(128) ["preset_used"]=> string(20) "--alt-preset cbr 128" ["audio_bytes"]=> int(258297) ["music_crc"]=> int(14435) ["lame_tag_crc"]=> int(57321) } } } ["playtime_seconds"]=> float(16.1174375) ["tags_html"]=> array(2) { ["id3v1"]=> array(4) { ["title"]=> array(1) { [0]=> string(7) "My Song" } ["artist"]=> array(1) { [0]=> string(10) "The Artist" } ["album"]=> array(1) { [0]=> string(13) "Greatest Hits" } ["year"]=> array(1) { [0]=> string(4) "2004" } } ["id3v2"]=> array(5) { ["title"]=> array(1) { [0]=> string(7) "My Song" } ["artist"]=> array(1) { [0]=> string(10) "The Artist" } ["album"]=> array(1) { [0]=> string(13) "Greatest Hits" } ["year"]=> array(1) { [0]=> string(4) "2004" } ["genre"]=> array(1) { [0]=> string(5) "Dance" } } } ["bitrate"]=> int(128000) ["playtime_string"]=> string(4) "0:16" } Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.