Java为MP3文件嵌入封面图片

问题背景:现在有一个没有封面的mp3文件,和封面jpg图片文件,将图片嵌入到mp3文件中作为封面。

直接上代码示例

/**
  * 为 MP3 写入封面图片
  *
  * @param sourcePath
  * @param img
  * @return
  */
 public static void writeMP3Image(String sourcePath, BufferedImage img) throws IOException, InvalidDataException, UnsupportedTagException, NotSupportedException {
     // 图片读取成 byte 数组
     ByteOutputStream baos = new ByteOutputStream();
     ImageIO.write(img, "jpg", baos);
     // 创建临时文件
     File destFile = new File(sourcePath);
     File tempFile = new File(destFile.getParent() + File.separator + "temp - " + destFile.getName());
     FileUtils.copy(sourcePath, tempFile.getAbsolutePath());
     // 将 tag 设置进 MP3 并保存文件
     com.mpatric.mp3agic.Mp3File mp3file = new com.mpatric.mp3agic.Mp3File(tempFile.getAbsolutePath());
     ID3v2 tag = mp3file.getId3v2Tag();
     tag.setAlbumImage(baos.getBytes(), "image/jpeg");
     mp3file.save(destFile.getAbsolutePath());
     System.gc();
     tempFile.delete();
 }

mp3agic依赖

<dependency>
    <groupId>com.mpatric</groupId>
    <artifactId>mp3agic</artifactId>
    <version>0.9.1</version>
</dependency>

思路:先将专辑图片(BufferedImage)转为byte数组,然后创建原来mp3文件的临时文件,通过调用Mp3File读取临时文件的Id3v2Tag,再将byte数组写进去,保存文件即可,最后删除临时文件。

有几个注意的地方:

  • jaudiotagger虽然好用,但是仅仅建议只拿来读取mp3信息,如果是修改信息也只建议修改文本信息,像嵌入图片这种“力气活”还是建议交给mp3agic来负责,因为之前踩了不少jaudiotagger的坑,依旧在处理嵌入图片上报异常。而且,jaudiotagger处理这件事也比较繁琐:先读取Id3v2Tag,再创建APICframe,还要创建APICbody,即便是这样处理还是异常;而mp3agic只需要读取Id3v2Tag写入bytes就可以了

  • 为什么要创建临时文件处理再覆盖源文件? 因为直接处理源文件,当你需要保存时是不支持直接覆盖源文件的,此文件已被占用

  • 为什么调用gc后再删除临时文件? Mp3File对象创建后,此文件被占用,而且没有close相关的方法,删除不了;通过调用gc可以释放Mp3File对象,才能成功删除

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java有很多方法可以将MP3文件转换为PCM文件,其中一个比较简单的方法是使用第三方库如"JLayer"和"javazoom". 下面是一个使用"JLayer"的示例代码: ```java import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import javazoom.jl.decoder.Decoder; import javazoom.jl.decoder.JavaLayerException; import javazoom.jl.decoder.OutputBuffer; public class Mp3ToPcmConverter { // 将MP3文件转换为PCM文件 public static void convert(String mp3Path, String pcmPath) throws FileNotFoundException, JavaLayerException, IOException { FileInputStream fis = new FileInputStream(mp3Path); BufferedInputStream bis = new BufferedInputStream(fis); FileOutputStream fos = new FileOutputStream(pcmPath); OutputStream os = fos; Decoder decoder = new Decoder(); OutputBuffer outputBuffer = new OutputBuffer(); byte[] buffer = new byte[4096]; while (true) { int bytesRead = bis.read(buffer, 0, buffer.length); if (bytesRead == -1) { break; } int bytesConsumed = decoder.decodeBuffer(buffer, 0, bytesRead, outputBuffer); os.write(outputBuffer.getBuffer(), 0, bytesConsumed); } decoder.drain(outputBuffer); os.close(); fos.close(); bis.close(); fis.close(); } public static void main(String[] args) throws FileNotFoundException, JavaLayerException, IOException { convert("test.mp3", "test.pcm"); } } ``` 在这个例子中,我们使用了JLayer库的Decoder类来解码MP3文件,然后将解码后的数据写入PCM文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值