JAudioTagger删除了前几秒的曲目

时间:2013-02-05 11:38:21

标签: audio groovy id3

我编写了一个简单的Groovy脚本(下面),使用JAudioTagger库设置mp3文件中四个ID3v1和ID3v2标记字段的值。该脚本成功进行了更改,但它也删除了某些文件的前5到10秒,其他文件不受影响。这不是一个大问题,但如果有人知道一个简单的解决方案,我将不胜感激。所有文件来自同一个源,都有v1和v2标签,我发现源文件没有明显区别来解释它。

import org.jaudiotagger.*

java.util.logging.Logger.getLogger("org.jaudiotagger").setLevel(java.util.logging.Level.OFF)

Integer trackNum = 0
Integer totalFiles = 0
Integer invalidFiles = 0
validMP3File = true

def dir = new File(/D:\Users\Jeremy\Music\Speech Radio\Unlistened\Z Temp Files to MP3 Tagged/)

dir.eachFile({curFile ->
    totalFiles ++
    try {
    mp3File = org.jaudiotagger.audio.AudioFileIO.read(curFile)
    } catch (org.jaudiotagger.audio.exceptions.CannotReadException e) {
        validMP3File = false
        invalidFiles ++
    }

    // Get the file name excluding the extension
    baseFilename = org.jaudiotagger.audio.AudioFile.getBaseFilename(curFile)

    // Check that it is an MP3 file
    if (validMP3File) {
        if (mp3File.getAudioHeader().getEncodingType() != 'mp3') {
            validMP3File = false
            invalidFiles ++
        }
    }

    if (validMP3File) {

        trackNum ++

        if (mp3File.hasID3v1Tag()) {
            curTagv1 = mp3File.getID3v1Tag()
        } else {
            curTagv1 = new org.jaudiotagger.tag.id3.ID3v1Tag()
        }
        if (mp3File.hasID3v2Tag()) {
            curTagv2 = mp3File.getID3v2TagAsv24()
        } else {
            curTagv2 = new org.jaudiotagger.tag.id3.ID3v23Tag()
        }

        curTagv1.setField(org.jaudiotagger.tag.FieldKey.TITLE, baseFilename)
        curTagv2.setField(org.jaudiotagger.tag.FieldKey.TITLE, baseFilename)
        curTagv1.setField(org.jaudiotagger.tag.FieldKey.ARTIST, "BBC Radio")
        curTagv2.setField(org.jaudiotagger.tag.FieldKey.ARTIST, "BBC Radio")
        curTagv1.setField(org.jaudiotagger.tag.FieldKey.ALBUM, "BBC Radio - 20130205")
        curTagv2.setField(org.jaudiotagger.tag.FieldKey.ALBUM, "BBC Radio - 20130205")
        curTagv1.setField(org.jaudiotagger.tag.FieldKey.TRACK, trackNum.toString())
        curTagv2.setField(org.jaudiotagger.tag.FieldKey.TRACK, trackNum.toString())

        mp3File.setID3v1Tag(curTagv1)
        mp3File.setID3v2Tag(curTagv2)

        mp3File.save()
    }
})

println """$trackNum tracks created from $totalFiles files with $invalidFiles invalid files"""

2 个答案:

答案 0 :(得分:1)

我还在调查,似乎JAudioTagger没有问题。在设置标签之前,我使用Total Recorder将下载质量从128kbps,44,100Hz降低到56kbps,22,050Hz。这样可以将文件大小减少到不到一半,语音无线电的质量也很好。

如果我在原始文件上运行脚本,则不会删除任何音轨。删除音轨的第一部分仅发生在Total Recorder处理过的文件中。

查看这些文件的JAudioTagger日志记录,标题似乎确实存在问题:

Checking further because the ID3 Tag ends at 0x23f9 but the mp3 audio doesnt start until 0x7a77
Confirmed audio starts at 0x7a77 whether searching from start or from end of ID3 tag

对于Total Recorder尚未处理的文件,不会执行此检查。

标题读取操作的日志也会显示(对于27分钟的曲目):

trackLength:06:52

看起来好像我必须找到一个新的MP3文件编辑器!

答案 1 :(得分:0)

而不是

    mp3File.save()
你可以尝试一下:

    mp3File.commit()

不知道它是否会有所帮助,但这似乎是记录在案的方法?