`
i2534
  • 浏览: 182842 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

mp3文件的tag查看程序

    博客分类:
  • util
阅读更多

闲着无聊,想分类我本机的mp3文件,先写个查看程序,分类慢慢写.

无图无真相,还是上图吧,简易的,很多问题没有处理.

 

程序界面

 

 

package com.javaeye.i2534;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.Rectangle;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;

import javax.swing.BorderFactory;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.border.TitledBorder;
import javax.swing.filechooser.FileFilter;
import javax.swing.filechooser.FileSystemView;

/**
 * 
 * @author lan
 * 
 */
public class MP3TagViewer extends JFrame {

	private static final long serialVersionUID = 1L;
	private JPanel jContentPane = null;
	private JPanel jPanel = null;
	private JLabel pathLabel = null;
	private JTextField pathTextField = null;
	private JButton browseButton = null;
	private JScrollPane jScrollPane = null;
	private JPanel jPanel1 = null;
	private JList fileList = null;
	private JLabel nameLabel = null;
	private JLabel artistLabel = null;
	private JLabel albumLabel = null;
	private JLabel yearLabel = null;
	private JLabel commentLabel = null;
	private JTextField nameTextField = null;
	private JTextField artistTextField = null;
	private JTextField albumTextField = null;
	private JTextField yearTextField = null;
	private JTextArea commentTextArea = null;

	/**
	 * This is the default constructor
	 */
	public MP3TagViewer() {
		super();
		initialize();
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setSize(560, 396);
		this.setContentPane(getJContentPane());
		this.setTitle("MP3管理工具");
	}

	/**
	 * This method initializes jContentPane
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jContentPane = new JPanel();
			jContentPane.setLayout(new BorderLayout());
			jContentPane.add(getJPanel(), BorderLayout.CENTER);
		}
		return jContentPane;
	}

	/**
	 * This method initializes jPanel
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJPanel() {
		if (jPanel == null) {
			pathLabel = new JLabel();
			pathLabel.setBounds(new Rectangle(36, 21, 54, 24));
			pathLabel.setHorizontalAlignment(SwingConstants.RIGHT);
			pathLabel.setText("文件夹");
			jPanel = new JPanel();
			jPanel.setLayout(null);
			jPanel.add(pathLabel, null);
			jPanel.add(getPathTextField(), null);
			jPanel.add(getBrowseButton(), null);
			jPanel.add(getJScrollPane(), null);
			jPanel.add(getJPanel1(), null);
		}
		return jPanel;
	}

	/**
	 * This method initializes pathTextField
	 * 
	 * @return javax.swing.JTextField
	 */
	private JTextField getPathTextField() {
		if (pathTextField == null) {
			pathTextField = new JTextField();
			pathTextField.setBounds(new Rectangle(112, 20, 311, 26));
		}
		return pathTextField;
	}

	/**
	 * This method initializes browseButton
	 * 
	 * @return javax.swing.JButton
	 */
	private JButton getBrowseButton() {
		if (browseButton == null) {
			browseButton = new JButton();
			browseButton.setBounds(new Rectangle(438, 21, 62, 22));
			browseButton.setText("浏览");
			browseButton.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					JFileChooser chooser = new JFileChooser(FileSystemView
							.getFileSystemView());
					chooser
							.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
					chooser.addChoosableFileFilter(new FileFilter() {

						@Override
						public boolean accept(File f) {
							if (f.isDirectory()) {
								return true;
							} else if (f.isFile()) {
								return f.getName().toLowerCase().endsWith(
										".mp3");
							}
							return false;
						}

						@Override
						public String getDescription() {
							return "MP3 (.mp3)";
						}

					});
					if (chooser.showOpenDialog(MP3TagViewer.this) == JFileChooser.APPROVE_OPTION) {
						File dir = chooser.getSelectedFile();
						getPathTextField().setText(dir.getAbsolutePath());
						Set<File> set = new HashSet<File>();
						walk(dir, set);
						DefaultListModel model = (DefaultListModel) getFileList()
								.getModel();
						model.clear();
						for (File f : set) {
							model.addElement(new FileWrapper(f));
						}
					}
				}
			});
		}
		return browseButton;
	}

	private class FileWrapper {
		File file;

		public FileWrapper(File file) {
			this.file = file;
		}

		@Override
		public String toString() {
			return file.getName();
		}
	}

	private class Info {

		private final Charset GBK = Charset.forName("GBK");
		// 应该是128位
		private byte[] tag;

		public Info(byte[] tag) throws IllegalArgumentException {
			this.tag = tag;
			if (this.tag.length != 128) {
				throw new IllegalArgumentException();
			}
			if (!isValid()) {
				throw new IllegalArgumentException();
			}
		}

		private boolean isValid() {
			byte[] array = Arrays.copyOfRange(this.tag, 0, 3);
			String s = new String(array, GBK);
			return "TAG".equals(s);
		}

		public String getArtist() {
			return getString(33, 63);
		}

		public String getAlbum() {
			return getString(63, 93);
		}

		public String getName() {
			return getString(3, 33);
		}

		public String getYear() {
			return getString(93, 97);
		}

		public String getComment() {
			return getString(97, 125);
		}

		private String getString(int from, int to) {
			byte[] array = Arrays.copyOfRange(this.tag, from, to);
			int length = 0;
			for (byte b : array) {
				if (b != 0) {
					length++;
				} else {
					break;
				}
			}
			return new String(array, 0, length, GBK);
		}
	}

	private void walk(File file, Collection<File> files) {
		if (file.isHidden()) {
			return;
		}
		if (file.isDirectory()) {
			for (File f : file.listFiles()) {
				this.walk(f, files);
			}
		} else if (file.isFile()) {
			if (file.getName().toLowerCase().endsWith(".mp3")) {
				files.add(file);
			}
		}
	}

	/**
	 * This method initializes jScrollPane
	 * 
	 * @return javax.swing.JScrollPane
	 */
	private JScrollPane getJScrollPane() {
		if (jScrollPane == null) {
			jScrollPane = new JScrollPane();
			jScrollPane.setBounds(new Rectangle(23, 75, 197, 265));
			jScrollPane.setViewportView(getFileList());
			jScrollPane.setBorder(BorderFactory.createTitledBorder(null,
					"MP3\u5217\u8868", TitledBorder.DEFAULT_JUSTIFICATION,
					TitledBorder.DEFAULT_POSITION, new Font("Dialog",
							Font.BOLD, 12), new Color(51, 51, 51)));
		}
		return jScrollPane;
	}

	/**
	 * This method initializes jPanel1
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJPanel1() {
		if (jPanel1 == null) {
			commentLabel = new JLabel();
			commentLabel.setBounds(new Rectangle(25, 190, 50, 20));
			commentLabel.setText("信息");
			yearLabel = new JLabel();
			yearLabel.setBounds(new Rectangle(25, 150, 50, 20));
			yearLabel.setText("年代");
			albumLabel = new JLabel();
			albumLabel.setBounds(new Rectangle(25, 110, 50, 20));
			albumLabel.setText("专辑");
			artistLabel = new JLabel();
			artistLabel.setBounds(new Rectangle(25, 70, 50, 20));
			artistLabel.setText("演唱");
			nameLabel = new JLabel();
			nameLabel.setBounds(new Rectangle(25, 30, 50, 20));
			nameLabel.setText("名称");
			jPanel1 = new JPanel();
			jPanel1.setLayout(null);
			jPanel1.setBounds(new Rectangle(257, 75, 256, 264));
			jPanel1.setBorder(BorderFactory.createTitledBorder(null,
					"MP3\u4fe1\u606f", TitledBorder.DEFAULT_JUSTIFICATION,
					TitledBorder.DEFAULT_POSITION, new Font("Dialog",
							Font.BOLD, 12), new Color(51, 51, 51)));
			jPanel1.add(nameLabel, null);
			jPanel1.add(artistLabel, null);
			jPanel1.add(albumLabel, null);
			jPanel1.add(yearLabel, null);
			jPanel1.add(commentLabel, null);
			jPanel1.add(getNameTextField(), null);
			jPanel1.add(getArtistTextField(), null);
			jPanel1.add(getAlbumTextField(), null);
			jPanel1.add(getYearTextField(), null);
			jPanel1.add(getCommentTextArea(), null);
		}
		return jPanel1;
	}

	/**
	 * This method initializes fileList
	 * 
	 * @return javax.swing.JList
	 */
	private JList getFileList() {
		if (fileList == null) {
			fileList = new JList(new DefaultListModel());
			fileList
					.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
						public void valueChanged(
								javax.swing.event.ListSelectionEvent e) {
							if (e.getValueIsAdjusting()) {
								Object o = fileList.getSelectedValue();
								if (o instanceof FileWrapper) {
									File f = ((FileWrapper) o).file;
									RandomAccessFile raf = null;
									try {
										raf = new RandomAccessFile(f, "r");
										byte[] array = new byte[128];
										raf.seek(raf.length() - 128);
										raf.read(array);
										Info info = new Info(array);

										getNameTextField().setText(
												info.getName());
										getArtistTextField().setText(
												info.getArtist());
										getAlbumTextField().setText(
												info.getAlbum());
										getYearTextField().setText(
												info.getYear());
										getCommentTextArea().setText(
												info.getComment());
									} catch (FileNotFoundException e1) {
										e1.printStackTrace();
									} catch (IOException e1) {
										e1.printStackTrace();
									} catch (IllegalArgumentException e1) {
										e1.printStackTrace();
									} finally {
										if (raf != null) {
											try {
												raf.close();
											} catch (IOException e1) {
												e1.printStackTrace();
											}
										}
									}
								}
							}
						}
					});
		}
		return fileList;
	}

	/**
	 * This method initializes nameTextField
	 * 
	 * @return javax.swing.JTextField
	 */
	private JTextField getNameTextField() {
		if (nameTextField == null) {
			nameTextField = new JTextField();
			nameTextField.setBounds(new Rectangle(95, 30, 130, 20));
			nameTextField.setEditable(false);
		}
		return nameTextField;
	}

	/**
	 * This method initializes artistTextField
	 * 
	 * @return javax.swing.JTextField
	 */
	private JTextField getArtistTextField() {
		if (artistTextField == null) {
			artistTextField = new JTextField();
			artistTextField.setBounds(new Rectangle(95, 70, 130, 20));
			artistTextField.setEditable(false);
		}
		return artistTextField;
	}

	/**
	 * This method initializes albumTextField
	 * 
	 * @return javax.swing.JTextField
	 */
	private JTextField getAlbumTextField() {
		if (albumTextField == null) {
			albumTextField = new JTextField();
			albumTextField.setBounds(new Rectangle(95, 110, 130, 20));
			albumTextField.setEditable(false);
		}
		return albumTextField;
	}

	/**
	 * This method initializes yearTextField
	 * 
	 * @return javax.swing.JTextField
	 */
	private JTextField getYearTextField() {
		if (yearTextField == null) {
			yearTextField = new JTextField();
			yearTextField.setBounds(new Rectangle(95, 150, 130, 20));
			yearTextField.setEditable(false);
		}
		return yearTextField;
	}

	/**
	 * This method initializes commentTextArea
	 * 
	 * @return javax.swing.JTextArea
	 */
	private JTextArea getCommentTextArea() {
		if (commentTextArea == null) {
			commentTextArea = new JTextArea();
			commentTextArea.setBounds(new Rectangle(95, 190, 130, 60));
			commentTextArea.setEditable(false);
			commentTextArea.setEnabled(true);
			commentTextArea.setLineWrap(true);
		}
		return commentTextArea;
	}

	public static void main(String[] args) {
		MP3TagViewer m = new MP3TagViewer();
		m.setLocationRelativeTo(null);
		m.setVisible(true);
	}

} // @jve:decl-index=0:visual-constraint="10,10"
分享到:
评论

相关推荐

    批量修改mp3文件tag信息歌手名专辑名等

    发现mp3文件的tag信息(歌手、专辑等)都被修改成了一个网站域名,导致不能自动匹配到歌曲歌词,但mp3文件名中含有歌手信息如“爱(小虎队).mp3”,于是用Java写了这个小程序,批量修改了这500首mp3文件的tag信息,...

    批量修改MP3 Tag

    通过以上知识点,我们可以构建一个C#程序,该程序能够读取指定目录下的所有MP3文件,根据用户需求更新其TAG信息,从而实现批量修改MP3的元数据。这样的工具对于音乐爱好者和数字音频管理者来说非常实用。

    MP3 Tag 修改器

    在MP3文件中,这些信息以Tag的形式存在,便于播放器识别和排序音乐。 批量修改MP3 Tag信息是这款软件的核心功能。用户可以一次性处理大量MP3文件,统一修改它们的Tag内容,极大地提高了整理音乐库的效率。这对于...

    MP3文件信息批量修改

    3. **查看与编辑标签**:描述如何查看当前MP3文件的元数据,并提供界面元素来修改这些信息。 4. **批量编辑**:说明如何一次性更改多个文件的标签,可能有预设模板或自定义搜索替换功能。 5. **保存与应用**:指导...

    查看mp3文件的信息

    在VC++环境中,我们可以编写程序来查看MP3文件的信息,这涉及到对文件头的理解和二进制数据的处理。 首先,MP3文件的头部包含关键的元信息,如帧头、ID3标签等。帧头是MP3文件的起始部分,用于标识帧的类型、位率、...

    读取mp3文件的ID3信息

    ID3标签是MP3文件的标准元数据容器,用于存储关于歌曲的各种信息,便于播放器和其他应用程序识别和展示。本文将详细介绍如何使用JavaScript来读取MP3文件的ID3信息,并介绍一个名为"JavaScript-ID3-Reader"的插件。 ...

    获取MP3中的ID3V1、ID3V2信息.rar_MP3 ID3_id3_id3v2_mp3 tag_mp3 信息

    在C程序"获取MP3中的ID3V1、ID3V2信息.c"中,可能包含了这样的实现,包括打开MP3文件、解析ID3标签、提取元数据信息并显示给用户的过程。 在处理ID3标签时,需要注意以下几点: 1. 文件指针定位:由于ID3标签通常...

    Mp3tag (MP3信息修改器)V2.43b 绿色多国语言版.

    而《Mp3tag (MP3信息修改器) V2.43b 绿色多国语言版》就是这样一款高效、便捷的工具,它可以帮助用户轻松地批量修改和整理MP3文件的元数据。 首先,我们要理解《Mp3tag》的核心功能。这是一款轻量级的应用程序,专...

    MP3_Tag_Viewer.rar_tag mp3

    在MP3标签查看器中,用户需要能够浏览并选择要查看或编辑的MP3文件,这个模块可能包含了文件选择对话框的实现以及打开文件的操作。 2. **mMain.bas**:这是主要的业务逻辑模块,包含了程序的核心功能,如读取和写入...

    asp.net C# MP3文件重命名为(演唱-歌曲名.mp3).rar

    "asp.net C# MP3文件重命名为(演唱-歌曲名.mp3).rar"这个标题暗示我们需要将MP3文件按照一种特定的格式进行重命名,即"演唱者-曲目名.mp3"。这种格式在音乐管理中很常见,因为它提供了清晰的歌手和歌曲名称信息,...

    音频文件tag统一批量设置

    从压缩包子文件的文件名称“MP3文件TAG批量设置.exe”来看,这应该就是我们要找的工具的执行文件,用于执行上述的音频文件元数据批量设置操作。 在实际使用中,这样的工具通常会有以下步骤: 1. 用户选择要处理的...

    c#版读取MP3详细信息

    总的来说,通过C#和WinForm,我们可以轻松地创建一个应用程序来读取MP3文件的元数据。`taglib-sharp`库提供了方便的接口,使得处理音频文件的元数据变得简单。这个项目的实现不仅可以用于显示基本信息,还可以扩展到...

    Mp3标签DLL获取

    【标签】:“Mp3 Tag”即MP3标签,是指存储在MP3文件中关于音频内容的信息,如艺术家、专辑、歌曲名、年份、流派等。这些元数据有助于用户组织和识别音乐库,是数字音乐管理的重要部分。 【压缩包子文件的文件名称...

    VisualC#读取MP3文件曲目标签信息.pdf

    ### Visual C# 读取 MP3 文件曲目标签信息 #### 摘要与背景介绍 本文档主要探讨了如何利用 Visual C# 来读取 MP3 文件中的曲目标签信息,具体包括歌曲的标题、歌手、专辑等内容。在介绍过程中,首先概述了 MP3 ...

    C语言实现mp3信息的读取

    MP3文件是MPEG-1 Audio Layer 3的缩写,它使用有损压缩技术将音频数据压缩到较小的文件大小,同时保持可接受的音质。在C语言中读取MP3信息,我们需要理解MP3文件的结构以及如何使用库来解析这些信息。 首先,MP3...

    MP3tag MP3加专辑封面 让你的播放器更炫

    首先,让我们详细了解一下如何使用MP3tag为MP3文件添加专辑封面。专辑封面是音乐文件的重要组成部分,它不仅使你的音乐库看起来更专业,而且在许多现代设备上,如智能手机和平板电脑,专辑封面会作为视觉标识在播放...

    wmamp3文件标题艺术家等tag属性读写类

    总的来说,这个类库是一个实用的工具,帮助开发者轻松地处理WMA和MP3文件的元数据,使得在C++或C语言环境中开发音乐相关的应用程序变得更加便捷。对于那些希望自定义音乐播放器或媒体管理软件的人来说,这样的类库是...

    读取mp3信息 c++ 源代码

    而libid3tag则是针对ID3标签的库,专注于MP3文件。 以下是一个简单的步骤概述,展示如何使用这些库来读取MP3信息: 1. **安装库**:确保你的开发环境中已经安装了taglib或libid3tag库。通常,你可以通过包管理器...

    Mp3Tag-2.73d中文版.zip

    mp3Tag该程序支持通过编辑标签信息实现文件重命名,Mp3tag(MP3信息修改器)可替换标签或文件名中的部分文字,标签导入/导出,以及创建播放列表功能。 此外,Mp3tag(MP3信息修改器)下载程序本身的设计也可圈可点,如...

Global site tag (gtag.js) - Google Analytics