javax.sound.sampled
读取音频流,2. 利用第三方库(如JLayer)解析MP3帧数据,3. 使用Tritonus或jaudiotagger处理元数据,需注意标准库对MP3格式支持有限,推荐使用专门库实现高效解码。在Java中读取MP3文件通常涉及两种需求:读取元数据(如歌曲信息) 和 处理音频数据(如解码播放),以下是详细方法,结合标准API和主流第三方库实现:
读取MP3元数据(ID3标签)
MP3的元数据(歌手、专辑等)存储在ID3标签中,推荐使用 jaudiotagger 库:
步骤
-
添加依赖(Maven):
<dependency> <groupId>org</groupId> <artifactId>jaudiotagger</artifactId> <version>2.0.3</version> </dependency>
-
代码示例:
import org.jaudiotagger.audio.AudioFile; import org.jaudiotagger.audio.AudioFileIO; import org.jaudiotagger.tag.FieldKey; public class ReadMP3Metadata { public static void main(String[] args) { try { AudioFile audioFile = AudioFileIO.read(new File("song.mp3")); String title = audioFile.getTag().getFirst(FieldKey.TITLE); // 标题 String artist = audioFile.getTag().getFirst(FieldKey.ARTIST); // 歌手 String album = audioFile.getTag().getFirst(FieldKey.ALBUM); // 专辑 System.out.println("标题: " + title); System.out.println("歌手: " + artist); System.out.println("专辑: " + album); } catch (Exception e) { e.printStackTrace(); } } }
输出:
歌手: Adele 专辑: 25
读取MP3音频数据(解码播放)
Java标准库不支持MP3解码,需用第三方库如 JLayer 或 JavaFX。
方法1:使用JLayer(轻量级)
-
添加依赖:
<dependency> <groupId>javazoom</groupId> <artifactId>jlayer</artifactId> <version>1.0.1</version> </dependency>
-
播放MP3代码:
import javazoom.jl.player.Player; import java.io.FileInputStream; public class PlayMP3 { public static void main(String[] args) { try (FileInputStream fis = new FileInputStream("song.mp3")) { Player player = new Player(fis); player.play(); // 阻塞直到播放结束 } catch (Exception e) { e.printStackTrace(); } } }
方法2:使用JavaFX(支持高级音频操作)
-
代码示例:
import javafx.scene.media.Media; import javafx.scene.media.MediaPlayer; public class JavaFXMP3Player { public static void main(String[] args) { String filePath = new File("song.mp3").toURI().toString(); Media media = new Media(filePath); MediaPlayer player = new MediaPlayer(media); player.play(); // 异步播放 // 避免程序退出,可添加Thread.sleep() } }
注意:JavaFX需配置模块(module-info.java中添加
requires javafx.media;
)。
注意事项
- 文件路径问题:
- 使用绝对路径或正确相对路径,避免
FileNotFoundException
。
- 使用绝对路径或正确相对路径,避免
- 依赖冲突:
确保第三方库版本兼容(如jaudiotagger与Java 11+可能存在模块化问题)。
- 音频解码限制:
JLayer仅支持MPEG 1 Layer 3(不含Layer 2)。
- 异常处理:
- 捕获
IOException
和库特定异常(如CannotReadException
)。
- 捕获
应用场景建议
需求 | 推荐方案 |
---|---|
读取歌曲信息 | jaudiotagger |
简单播放MP3 | JLayer |
复杂音频处理 | JavaFX / JAVE库 |
转换格式 | FFmpeg + Java包装 |
引用说明
提示:生产环境建议使用成熟音频库(如FFmpeg通过JNI调用),或直接使用Android/iOS原生音频API处理移动端需求。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/46213.html