JAudioTagger 删除曲目的前几秒

Posted

技术标签:

【中文标题】JAudioTagger 删除曲目的前几秒【英文标题】:JAudioTagger Deleting First Few Seconds of Track 【发布时间】:2013-02-05 11:38:20 【问题描述】:

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

【问题讨论】:

【参考方案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 文件编辑器了!

【讨论】:

【参考方案2】:

而不是

    mp3File.save()

你可以试试:

    mp3File.commit()

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

【讨论】:

我已经尝试过了,但结果完全一样。我首先尝试了 AudioFileIO 类的 write 方法,但我根本无法让它工作,它一直给出空指针错误 IIRC。我现在正在使用手机,所以无法准确查看。

以上是关于JAudioTagger 删除曲目的前几秒的主要内容,如果未能解决你的问题,请参考以下文章

js获取指定时间的前几秒

批处理如何批量删除当前文件下所有csv文件的前几行

c语言怎么删掉字符串的前几个字符

SQL如何查询表中某一列中的数据的前几位

perl删除文件前几列

C语言中如何截取字符串的前几个字符?