0

我编写了一个简单的 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"""
4

2 回答 2

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 文件编辑器了!

于 2013-02-06T03:15:49.350 回答
0

代替

    mp3File.save()

你能试试:

    mp3File.commit()

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

于 2013-02-05T13:07:43.150 回答