史萊姆論壇

返回   史萊姆論壇 > 教學文件資料庫 > 多媒體影音轉檔燒錄技術文件
忘記密碼?
論壇說明 標記討論區已讀

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


 
 
主題工具 顯示模式
舊 2004-03-28, 09:26 PM   #1
psac
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設 ID3v1.1, ID3v2.2, ID3v2.3 and ID3v2.4 tags各有什麼區別?

ID3v1.1, ID3v2.2, ID3v2.3 and ID3v2.4 tags各有什麼區別?

Q:
誰詳細說哈子

A:
http://www.id3.org/


●ID3v1 & ID3v1.1

  MP3格式標準裡並沒有特別定義儲存曲目相關訊息的結構,於是1996年有人提出了一種解決辦法,即在mp3檔案末尾新增一些額外的資料(128 byte)來儲存曲名、演唱者、專輯名等訊息,這就是ID3(v1)。

  ID3v1的字列(field)名稱和每個字列的大小都是固定的,如下所示

Song title——30 characters
Artist——30 characters
Album——30 characters
Year——4 characters
Comment——30 characters
Genre—— byte

  ID3v1.1和ID3v1唯一區別就是多了個Album track字列,實際上是從上面說的Comment字列末尾抽出兩個字元用來存放Album track訊息。ID3v1(v1.1)大家一定很熟悉,因為MP3中早已經廣泛的使用ID3,甚至很多人誤以為這是mp3自帶的標準(事實上mp3格式標準裡並不包含ID3)。雖然廣為使用,但ID3v1,ID3v1.1有明顯缺陷。字列名和字列長度都是固定死的,不可擴展,缺乏靈活性。而且30個字元實在十分有限,想必很多人碰到過title或者artist太長被截斷的情況吧。所以有人提出新的ID3v2格式,試圖解決這些問題,擴展ID3的功能。

●ID3v2

  雖然從名稱上ID3v2好像只是ID3v1的一個昇級,實際在格式定義上ID3v2和ID3v1完全不同,ID3v2應該算一個全新的tag系統。如果用過WINAMP的ID3 tag editor,就知道ID3v2和ID3v1最直觀的區別是新增加了一些文本字列,譬如composer、conductor、media type、copyright message等等。但這不是重點,相較於ID3v1,ID3v2最大的改進應該是極大的增強了靈活性和可括展性,不僅每個字列的長度是可擴展的(再也不必為ID3v1 30個字元的限制而煩惱了),而且用戶還可以很容易的新增自定義字列。

  ID3v2 tag支持unicode,可以包含歌詞(包括同步訊息),曲目的volume、balance、equalizer、reverb設置訊息,甚至可以插入圖片,支持鏈接外部訊息和網頁……還有很多,有興趣的可以看這裡(http://www.id3.org/frames.html)。

  看上去ID3v2功能強大,真是不錯,不過凡事都有兩面性,ID3v2繁多的功能也帶來一個負面問題,就是使得ID3v2太過複雜,實現起來比較困難,一個單純實現所有ID3v2標準功能的程序就得100多K(FB2K主程式也就200多K)。而且有些功能也並不十分合適,譬如把圖片嵌入到音頻檔案中就不是一個好主意,你需要另外編寫程序從音頻檔案中提取圖片,而且也造成播放音頻檔案時更容易出現錯誤。

  還有一點值得注意的,ID3v2不像ID3v1存儲在檔案末尾,而是插入到音頻檔案的最開頭。原本的初衷是考慮網路上播放檔案時可以先接收到相應tag訊息。實際應用時卻發現這麼處理是弊大於利。

  1、相容性變差。時常看到有人反映因為插入ID3v2 tag而造成音頻檔案不能正常播放的。
  2、寫入tag速度慢。由於tag放在檔案開頭,所以第一次插入tag必須得重寫整個檔案,嚴重影響速度,雖然ID3v2採取了的一些方法,避免每次修改tag都必須重寫整個檔案(大多數情況下不會,某些情況下還是有可能),但同時也增加了程序處理的複雜度。
  3、耗費臨時空間。由於插入tag得重寫整個檔案,如果你向一個大檔案新增ID3v2 tag,必須得有充足的磁碟空間,否則就會寫入失敗,甚至會造成原始檔案的損壞。
  (註:最新的ID3v2.4標準已經可以選擇把tag存放在檔案末尾。)

  所以,ID3v2雖然初看起來不錯,但並不受歡迎,在Hydrogenaudio Forums上用ID3v2做關鍵詞搜索一下就知道了,很多人毫不吝惜的把「SHIT」的光榮稱號授予了ID3v2。事實上目前流行的音頻格式(無論有損無損),只要有自己的tag標準定義的,沒有一個選擇ID3v2;標準版Foobar2000也不支持ID3v2,不過倒是有個第三方插件可以讀寫MP3和AAC的ID3v2 tag。

  儘管如此,ID3v2在硬體支持上還是頗具優勢,目前絕大多數MP3隨身聽只支持ID3v1和ID3v2,如果你有這樣的便攜式硬體設備,那ID3v2幾乎是你的唯一選擇。
目前tag格式沒有一個統一標準,不同音頻格式使用的tag也不盡相同。現在比較流行的tag格式有ID3和APE(這個APE和平常說的無損音頻格式APE可不一樣),它們各自也還有不同的版本,下面分別做簡要介紹。

●APEv1 & APEv2

  APE也是一種tag格式,如果我沒搞錯,應該是Monkey's Audio的APE最先採用,是不是因此而得名我就不太清楚了。APE用的是APEv1,後來在APEv1基礎上改進又有了APEv2,主要區別就是兩點:

  1、APEv2標準裡增加了一個APE Tags Header
  2、APEv2採用UTF-8編碼,使得可以實現unicode支持

  APE tag具有與ID3v2一樣的靈活性和可括展性,字列名可自定義,字列長度可擴展,同時格式定義又不像ID3v2那麼繁瑣。APE tag的格式很簡單,實現起來也很方便,tag存放位置是可選的,既可以在檔案頭也可以在檔案尾(推薦在檔案尾),所以有不少人對APEv2比較傾瞇。譬如,MPC(MusePack)把ID3v1和APEv2作為標準支持的tag,Foobar2000也把APEv2作為標準的tag系統。

順便說一下:Ogg有自定義的tag格式,叫Vorbis Comment。而MP4/AAC很長一段時間也沒有自己的tag標準,現在好像是MP4已經有了,AAC還沒有,我不是很清楚
WMA的tag系統當然是用微軟自己定義的一套東西
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
有 2 位會員向 psac 送花:
qdenise (2008-10-08),RobertGem (2017-09-04)
感謝您發表一篇好文章
舊 2006-02-24, 09:13 AM   #2 (permalink)
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設

軟體簡介
是一套多功能的MP3標籤資訊編輯管理軟體。其功能有:自動重新命名及組織MP3、MP3標籤名稱取代、簡單快速地清除MP3標籤資訊、MP3標籤資訊群組編輯、快速瀏覽/編輯MP3標籤資訊、增修VBR資訊(用以修正Winamp及其他播放軟體對於歌曲資訊的顯示問題)、MP3剪輯。
Tag&Rename 是被設計來作一個便利的管理MP3和VQF文件的工具,
借由 Tag&Rename您能很容易地能使用植入的標籤訊息(ID3)來重新命名
集的音樂,就是說使用 MP3/VQF 的 Tag Info 批量為文件改名。而且來
的您收能搜尋CDDB來源正確的修改您文件裡的標籤訊息!1.VolX 說明 修正了「自動填充音軌 #」功能無效的問題。
2.Unicode 字串長度修正。
3.匯出範本的修正。
4.部分翻譯內容的修正。
5.部分控件的修正。
http://www.softpointer.com/images/tr_main.png
Tag&Rename is a handy utility designed for music files management. With Tag&Rename you can quickly and easily rename your music collection using the embedded tag data, write new or edit existing tag information, create tags based on file names, get songs information from freedb/amazon.com servers and mach more. Tag&Rename now support: mp3 (ID3v1, ID3v2.2, ID3v2.3 and ID3v2.4 tags), MusePack mpc/mp+ (APEv1, APEv2 and ID3v1 tags), Windows Media - wma, asf and wmv files, Ogg Vorbis/Flac/Speex (vorbis comments), Apple iTunes and iPod aac (m4a) files including mp4, lossless m4a and protected m4p files, most popular lossless codecs including Monkey』s Audio, Flac, Wav Pack, Optim Frog, True Audio, Apple and Windows Media lossless formats. Tag&Rename include full Unicode support.
Tag&Rename - features
http://www.softpointer.com/downloads/TagRename32.exe
Tag&Rename 是一個功能強大且容易使用的音樂文件檔系統管理工具,支援 MP3 及 VQF 兩種格式。方便快速的更改檔案名稱及更改文件內的標籤資料,可編輯 ID3v1 及 ID3v2。讓您不用再浪費太多的時間修改 MP3 標籤,也可以透過 CDDB 資料庫或其他站台來自動更改/寫入 MP3 標籤。 功能強大!


or Tag & Rename v3.20 Final:


Name: Bernd Blomberg
Serial: TR-HstGUsanys-BdgacGjJLH-YdQKXDTpjK

- YAG -



Setup:
http://www.softpointer.com/downloads/TagRename32.exe

語言文件
http://rapidshare.de/files/8809835/T...S_lng.rar.html


Renamer for .mp3 .ogg .wma .m4a .mp4 .flac and .ape files: easily rename files individually or whole directories at a time, preview changes before renaming or undo the last renaming process, rename the folder (including sub folders) containing your music files, and manually edit files and folders names.
Multi-file or manual tag editors: edit tags for multiple or single mp3/wma/ogg/m4a/mp4/ flac/ape files, fill-in tag fields using the file name.
Freedb support: Gets tag information for full music albums in seconds using the freedb Internet server.
Amazon.com support: search and import album information and cover art from the amazon.com, amazon.co.uk and amazon.de servers to files tags.
Text case conversion functions: convert case or capitalize the first letter of each word within file names or tags.
Support for: mp3 (ID3v1, ID3v2.2, ID3v2.3 and ID3v2.4 tags), MusePack mpc/mp+ (APEv1, APEv2 and ID3v1 tags), Windows Media wma, asf and wmv files, Ogg Vorbis/Flac/Speex (vorbis comments), Apple iTunes and iPod aac (m4a) files including mp4, lossless m4a and protected m4p files, most popular lossless codecs including Monkey's Audio, Flac, Wav Pack, Optim Frog, True Audio, Apple and Windows Media lossless.
Rename music files folder according to it files tag information.
Tags synchronization wizard: you can synchronize ID3v1 and ID3v2 tag data.
Export wizard can export your music information into any format (csv, xml, html and tab delimited text).
M3u playlists: create m3u play lists using the unique Quick Save Playlist feature.
Play music files: listen to your music files using your favorite music player.
Full support for files drag and drop.
Full Unicode support.
Explorer shell extensions: Tag&Rename can be added to the context menu of MS Explorer so that you can access T&R faster (right-click mouse) from the MS File Manager.
__________________
http://bbsimg.qianlong.com/upload/01/08/29/68/1082968_1136014649812.gif
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
向 psac 送花的會員:
Jerrybribe (2017-09-06)
感謝您發表一篇好文章
舊 2006-02-24, 09:18 AM   #3 (permalink)
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設

趣談 MP3 和 Perl
MP3 標籤的簡單介紹
首先有音樂。然後出現電腦。電腦速度很慢且只能發出蜂鳴聲。即使使用諸如 PC 揚聲器這種很令人悲傷的工具(噢,我真希望成為 Apple 和 Amiga 用戶),我們也編寫程序產生音樂,在遊戲和娛樂中使用。之後,音效卡越來越好,辦公室裡到處發出環繞音響和 THX 認證的揚聲器所發出的震耳欲聾的聲音。

在硬體發展的同時,也產生了很多聲音格式。.mid 適用於 MIDI 音調、.voc、.mod、.wav 等。專有的 MP3 格式(涉及到德國 Fraunhofer 學院擁有的很多專利)隨著時間的推移流行開來 —— 它提供很好的壓縮和效能。除 MP3 外還有許多格式,著名的有 Ogg Vorbis,但當今 MP3 似乎仍是音樂儲存於格式的最佳選項。

MP3 文件的一個優點是可以使用 ID3 標籤來加注標籤。文件內部是有關它的訊息 —— 通常稱為元資料。唱片集、藝術家、曲目名稱、註釋(使用 ID3 版本 1.1)甚至曲目數量都可以儲存於在 ID3 標籤中,只要不超過特定字元數限制即可。

ID3 版本 1.1 的後續版本是 ID3 版本 2(簡稱為 ID3v2),除簡單性外,後者幾乎在所有方面都超過了前者。ID3v2 可以處理多種語言,在每個標籤元素中儲存於任意長的資料,甚至將圖片儲存於為標籤的一部分。但不幸的是,使用 ID3v2 要瞭解到 TALB 是唱片集的名稱,TIT2 是曲目數量。Ogg Vorbis 格式要花費很長時間才能識別,其中藝術家元素被稱為...等等它吧...ARTIST!(公平地說,這僅僅是一個慣例 —— Ogg Vorbis 註釋是無格式的)。不幸的是,現存的數十億首 MP3 文件都不能在不損失品質的情況下轉換為 Ogg Vorbis 格式或任何其他格式,因此,至少在接下來的 5 年裡,您可能發現,我們不僅會使用下個「熱門」格式,還要使用 MP3 文件。

我已非常努力地從實際的 ID3 標籤中抽取標籤作為內容。當時機來臨時,修改 autotag.pl 會很容易,因此除 ID3 外,它還處理其他加注標籤的格式。


一位自我陶醉的電腦和音樂愛好者都需要能夠操縱 MP3 —— 娛樂性數位音樂的事實標準。在本文中,Ted 介紹了幾種使用autotag.pl 應用程式管理和操縱(搜尋、標記、重新命名和註釋,等等)MP3 的方法。Ted 向讀者詳細介紹了此應用程式,描述了 CPAN模組如何啟用該應用程式。
對於現在瞭解電腦的音樂愛好者而言,操縱 MP3 文件是一項必須具備的技能。雖然其他音樂文件格式已存在並在蓬勃發展著,但本文還是主要討論 MP3 格式,因為眾所周知,它是當今最流行的格式。但是,本文所講述的一般方法也可用於處理其他允許使用標籤(tag)的音樂文件格式。實際上,很多使用標籤的文件格式都可以從類似本文中的 autotag.pl 程序中受益。歡迎您提出建議。

本文將一般性地討論有關 Perl 的問題 ,特別關注 MP3 文件的操縱,並詳細介紹了 autotag.pl 應用程式。

儘管已經有了 MP3::Info 、 MP3::ID3Lib 、 MusicBrainz::Client 和 AudioFile::Identify::MusicBrainz 模組,而且這些模組可能很有用,但我只使用 MP3::ID3Lib 的主要理由是因為它需要 id31ib 軟體(請參閱 參考資料)。雖然 MP3::Info 是純 Perl 語言編寫的而且安裝也很簡單,但我發現 MP3::Tag 功能更強大。之所以沒有使用 MusicBrainz::Client 和 AudioFile::Identify::MusicBrainz ,是因為 MusicBrainz 似乎是比 FreeDB 更不全面的已發行 CD 的資料庫。在本文的結尾,將向讀者介紹 ID3 標籤加注模組和曲目訊息模組的選項。我經過試驗和失敗而艱難獲得的經驗表明, MP3::Tag 和 WebService::FreeDB 是最佳的模組。

雖然 CDDB (Gracenote) 磁牒庫非常全面,但我還是沒有選項使用它。Gracenote 是一家擁有 CD 曲目列表的專有資料庫(只允許對資料庫執行搜尋,不能大量下載)的公司。在 Gracenote 只擁有 CDDB 的早期,志願者貢獻了這些資料庫的相當一部分內容。而 FreeDB 是一個志願者經過有組織的努力提供的免費、無限制的 CD 曲目資料庫。FreeDB 資料庫的整個內容都可以下載,無版權限制 —— 因此,如果您願意,可以建立自己的 FreeDB 伺服器。

我不使用的模組並不是因為這些模組一定不好,因此,如果您喜歡,您可以使用它們。關於個人經驗和上述原因,我只是更喜歡 MP3::Tag 和 WebService::FreeDB 。實際的讀寫標籤在函數中進行了抽像,因此,如果使用不同的模組讀寫 MP3 標籤,就不需要更改很多內容。

我還應提一下,在 Linux 內部的 xterm 和 Eterm 終端模擬器中, Term::ReadLine::Gnu 模組比預設模組 Term::ReadLine::Perl 能更好地工作。如果您注意到在提示輸入期望的文本時出現一些奇怪的行為,那麼可能要將其安裝在 Term::ReadLine 之上。
基本的 autotag.pl 函数
我把 autotag.pl 几个功能放在了不同的函数中。首先, contains_word_char() 是一个判断某些文本中是否包含某个词(在 Perl 中是 \w in Perl)中的字符的函数。该函数也会正确地处理未定义的值,尽管在警告打开时,常规表达式在匹配未定义的值时会输出警告信息。该函数是极为有用的,因为它不显示警告信息;为了不使用函数而又达到这个目的,您必须检查是否每次都定义了字符串。
清單 1. contains_word_char() 函數

# {{{ contains_word_char: return 1 if the text contains a word character
sub contains_word_char
{
my $text = shift @_;
return $text && length $text && $text =~ m/\w/;
}
# }}}



接下來是輸入例程。這些程序相當長,它們試圖處理程序所需要的用戶交互的大多數情況。

清單 2. get_tag() 函數


# {{{ get_tag: get a ID3 V2 tag, using V1 if necessary
sub get_tag
{
my $file = shift @_;
my $upgrade = shift @_;
my $mp3 = MP3::Tag->new($file);

return undef unless defined $mp3;

$mp3->get_tags();

my $tag = {};

if (exists $mp3->{ID3v2})
{
my $id3v2 = $mp3->{ID3v2};
my $frames = $id3v2->supported_frames();
while (my ($fname, $longname) = each %$frames)
{
# only grab the frames we know
next unless exists $supported_frames{$fname};

$tag->{$fname} = $id3v2->get_frame($fname);
delete $tag->{$fname} unless defined $tag->{$fname};
$tag->{$fname} = $tag->{$fname}->{Text} if $fname eq 'COMM';
$tag->{$fname} = $tag->{$fname}->{URL} if $fname eq 'WXXX';
$tag->{$fname} = '' unless defined $tag->{$fname};
}
}
elsif (exists $mp3->{ID3v1})
{
warn "No ID3 v2 TAG info in $file, using the v1 tag";
my $id3v1 = $mp3->{ID3v1};
$tag->{COMM} = $id3v1->comment();
$tag->{TIT2} = $id3v1->song();
$tag->{TPE1} = $id3v1->artist();
$tag->{TALB} = $id3v1->album();
$tag->{TYER} = $id3v1->year();
$tag->{TRCK} = $id3v1->track();
$tag->{TIT1} = $id3v1->genre();

if ($upgrade && read_yes_no("Upgrade ID3v1 tag to ID3v2 for $file?", 1))
{
set_tag($file, $tag);
}
}
else
{
warn "No ID3 TAG info in $file, creating it";
$tag = {
TIT2 => '',
TPE1 => '',
TALB => '',
TYER => 9999,
COMM => '',
};
}
print "Got tag ", Dumper $tag
if $config->DEBUG();
return $tag;
}
# }}}



惟一一個稍微與眾不同的函數是 read_yes_no() ,可以給它一個 Y 或 1 的預設參數來使預設值為真,任何其他的參數都會使預設值為假。這樣,當用戶按下Enter鍵鍵或者空格鍵時,我可以讓 read_yes_no() 函數接受不同的預設值。另外,Backspace 鍵或 Delete 鍵將使預設值反轉。這段程式碼不華麗,但很實用。

autotag.pl 的開頭部分
應用程式 autotag.pl 以一些啟始化例程開始。

清單 3. 啟始化

use constant SEARCH_ALL => 'all';

my %freedb_searches = (
artist => { keywords => [], abbrev => 'I', tagequiv => 'TPE1' },
title => { keywords => [], abbrev => 'T', tagequiv => 'TALB' },
track => { keywords => [], abbrev => 'K', tagequiv => 'TIT2' },
rest => { keywords => [], abbrev => 'R', tagequiv => 'COMM' },
);

# maps ID3 v2 tag info to WebService::FreeDB info
my %info2freedb = (
TALB => 'cdname',
TPE1 => 'artist',
);

my %supported_frames = (
TIT1 => 1,
TIT2 => 1,
TRCK => 1,
TALB => 1,
TPE1 => 1,
COMM => 1,
WXXX => 1,
TYER => 1,
);

my @supported_frames = keys %supported_frames;

my $term = new Term::ReadLine 'Input> '; # global input



EARCH_ALL 是一個常數,當用戶想在任何地方搜尋一個詞的時候,比如曲目名、藝術家名等,就會使用它。為了防止有人想把它改為另外某個值,我把它設定為常數,但它也可能已經被硬編碼為「all」。

%freedb_searches 散列將 FreeDB 字段映射到有關它們的訊息上,包括 ID3v2 標籤元素。例如,它說明 FreeDB 怎樣稱呼那些在 MP3 標籤中被稱為「TPE1」的「artist」。在該散列 列項中的「abbrev」字段被用來定義指令行開關,這樣,隨後我可以關於 %freedb_searches 訊息定義一個 -artist 開關,它可以被簡寫為 -i 。

%info2freedb 散列將光碟中的所有曲目的 FreeDB 字段都映射到 ID3v2 字段。它們不是 %freedb_searches 中的字段,這是一種不同的映射,它表明,對於一個光碟集的所有曲目而言,「cdname」和 「artists」(也分別被稱為「TALB」和「TPE1」)是相同的。

我將用 %supported_frames 散列和 @supported_frames 列表來表示我支持哪些 ID3v2 標籤元素。我是從該列表產生了這個散列,而不是從該散列中獲得這個列表(解釋兩者之間的差別離題太遠,所以不再贅述)。大規模加注標籤時,以及在編寫 ID3v2 標籤時,都要用到已獲支持的框架(我只是修改已獲支持的框架而已)。

最後,為了讓用戶在整個應用程式中輸入資料,我新增了一個 Term::ReadLine 對象。

下面,我啟始化 AppConfig 選項,這樣做雖然加重了我的負擔,但是有益的。

清單 4. AppConfig 的啟始化

# {{{ set up AppConfig and process -help

my $config = AppConfig->new();

$config->define(
DEBUG =>
{ ARGCOUNT => ARGCOUNT_ONE, DEFAULT => 0, ALIAS => 'D' },

CONFIG_FILE =>
{ ARGCOUNT => ARGCOUNT_ONE, DEFAULT => 0, ALIAS => 'F' },

HELP =>
{ ARGCOUNT => ARGCOUNT_NONE, DEFAULT => 0, ALIAS => 'H' },

DUMP =>
{ ARGCOUNT => ARGCOUNT_NONE, DEFAULT => 0 },

ACCEPT_ALL =>
{ ARGCOUNT => ARGCOUNT_NONE, DEFAULT => 0, ALIAS => 'C' },

DRYRUN =>
{ ARGCOUNT => ARGCOUNT_NONE, DEFAULT => 0, ALIAS => 'N' },

GUESS_TRACK_NUMBERS_ONLY =>
{ ARGCOUNT => ARGCOUNT_NONE, DEFAULT => 0, ALIAS => 'G' },

STRIP_COMMENT_ONLY =>
{ ARGCOUNT => ARGCOUNT_NONE, DEFAULT => 0, ALIAS => 'SC' },

MASS_TAG_ONLY =>
{ ARGCOUNT => ARGCOUNT_HASH, ALIAS => 'M' },

RENAME_ONLY =>
{ ARGCOUNT => ARGCOUNT_NONE, DEFAULT => 0, ALIAS => 'RO' },

RENAME_MAX_CHARS =>
{ ARGCOUNT => ARGCOUNT_ONE, DEFAULT => 30},

RENAME_FORMAT =>
{ ARGCOUNT => ARGCOUNT_ONE, DEFAULT => '%a-%t-%n-%c-%s.mp3'},

RENAME_BADCHARS =>
{ ARGCOUNT => ARGCOUNT_LIST, ALIAS => 'RB' },

RENAME_REPLACECHARS =>
{ ARGCOUNT => ARGCOUNT_LIST, ALIAS => 'RR' },

RENAME_REPLACEMENT =>
{ ARGCOUNT => ARGCOUNT_ONE, DEFAULT => '_' },

FREEDB_HOST =>
{ ARGCOUNT => ARGCOUNT_ONE, DEFAULT => 'http://www.freedb.org', },

OR =>
{ ARGCOUNT => ARGCOUNT_NONE, DEFAULT => '0', },

SEARCH_ALL() =>
{ ARGCOUNT => ARGCOUNT_LIST, ALIAS => 'A' },
);

foreach my $search (keys %freedb_searches)
{
$config->define($search => {
ARGCOUNT => ARGCOUNT_LIST,
ALIAS => $freedb_searches{$search}->{abbrev},
});
}
$config->args();

$config->file($config->CONFIG_FILE())
if $config->CONFIG_FILE();

unless (scalar @{$config->RENAME_BADCHARS()})
{
push @{$config->RENAME_BADCHARS()}, split(//, "\"`!'?&[]()/;\n\t");
}

unless (scalar @{$config->RENAME_REPLACECHARS()})
{
push @{$config->RENAME_REPLACECHARS()}, split(//, " ");
}

if ($config->HELP())
{
print <<EOHIPPUS;
$0 [options] File1.mp3 File2.mp3 ...

Options:
-help (-h) : print this help
-config_file (-f) N : use this config file, see AppConfig module docs for format
-debug (-d) N : print debugging information (level N, 0 is lowest)
-dump : just dump the list of albums and tracks within them
-dryrun (-n) : do everything but modify the MP3 files
-freedb_host H : set the FreeDB host, default "www.freedb.org"
-or : search for keyword A or keyword B, not A and B as usual

-accept_all (c) : accept all search results for consideration for each file,
also accept all renames without asking

-rename_badchars (-rb) A -rb B : characters A and B to remove when renaming

-rename_replacechars (-rr) A -rr B : characters A and B to replace
when renaming

-rename_maxchars N : use at most this many characters from a tag
element when renaming, default: ${\$config->RENAME_MAX_CHARS()}

-rename_replacement X : character to use when replacing,
default: [${\$config->RENAME_REPLACEMENT()}]

-rename_format (-f) F : format for renaming; default "${\$config->RENAME_FORMAT()}"
%a -> Artist
%t -> Track number
%n -> Album name
%c -> Comment
%s -> Song title

-guess_track_numbers_only (-g) : guess track numbers using the file
name, then exit

-rename_only (-ro) : rename tracks using the given format (see
-rename_format), then exit

-mass_tag_only (-m) A=X -m B=Y : mass-tag files (tag element A is X,
B is Y), then exit (tag elements
available: @supported_frames)

-strip_comment_only (-sc) : strip comments and URLs, then exit

Repeatable options (you can specify them more than once, K is the keyword):

-all (-a) K : search everywhere
-artist (-i) K : search for these artists
-title (-t) K : search for these titles
-track (-k) K : search for these tracks
-rest (-r) K : search for these keywords everywhere else

Note that the repeatable options are cumulative, so artist A and title
B will produce matches for A and B, not A or B. In the same way,
artist A and artist B will produce matches for A and B, not A or B.
If you want to match A or B terms, use -or, for instance:

$0 -or -artist "pink floyd" -artist "fred flintstone"

EOHIPPUS

exit;
}

# }}}



是的,所有這些程式碼都是啟始化指令行選項的。通過使用 AppConfig ,可以在整個程序中使用和修改這些選項。使用 AppConfig 還有很多好處,不過這些內容超出了本文的範圍(有關 AppConfig 的更多訊息,請參閱 參考資料)。

另外,我還使用 %freedb_searches 散列中的 列項來新增合適的組態選項,這樣可以使用戶和程序員更輕鬆一些。

在載入組態文件以後,如果用戶指定了它,那麼就用有意義的預設值來植入字元置換陣列和不良字元陣列。

最後,處理 -help 開關。注意,通過變數插入不同選項的預設值是如何在說明 文本內列印出來大的。這樣就形成了可讀性非常強的說明 訊息。我總是在增加新的特性之後(但有時候是在之前)立即更新說明 訊息。我認為,說明 文本應該和程序的功能同步,否則人們將不理解程序,也不知道說明 文本說了些什麼。autotag.pl 程序特別需要更多的我的文件說明,POD 風格的我的文件應該比較合適。在您閱讀本文時,這樣的我的文件可能已經有了。POD 我的文件是指令碼的一部分,因此下載的 autotag.pl(請參閱 參考資料)將包括 POD 我的文件(如果我已經將它寫入的話)。

與 ID3v2 標籤相關的函數
get_tag() 函數是 autotag.pl 的基本函數。指出一個 MP3 檔案名,它就會根據該檔案構建一個散列標籤。如果標籤只是 ID3v1 標籤, get_tag() 函數將會免費把它昇級為 ID3 標籤(多麼好的交易!)。如果沒有 ID3 標籤, get_tag() 函數將新增一個。而且, get_tag() 知道分別檢視 COMM 和 WXXX 元素的 Text 和 URL 子元素。

清單 5. get_tag() 函數

# {{{ get_tag: get a ID3 V2 tag, using V1 if necessary
sub get_tag
{
my $file = shift @_;
my $upgrade = shift @_;
my $mp3 = MP3::Tag->new($file);

return undef unless defined $mp3;

$mp3->get_tags();

my $tag = {};

if (exists $mp3->{ID3v2})
{
my $id3v2 = $mp3->{ID3v2};
my $frames = $id3v2->supported_frames();
while (my ($fname, $longname) = each %$frames)
{
# only grab the frames we know
next unless exists $supported_frames{$fname};

$tag->{$fname} = $id3v2->get_frame($fname);
delete $tag->{$fname} unless defined $tag->{$fname};
$tag->{$fname} = $tag->{$fname}->{Text} if $fname eq 'COMM';
$tag->{$fname} = $tag->{$fname}->{URL} if $fname eq 'WXXX';
$tag->{$fname} = '' unless defined $tag->{$fname};
}
}
elsif (exists $mp3->{ID3v1})
{
warn "No ID3 v2 TAG info in $file, using the v1 tag";
my $id3v1 = $mp3->{ID3v1};
$tag->{COMM} = $id3v1->comment();
$tag->{TIT2} = $id3v1->song();
$tag->{TPE1} = $id3v1->artist();
$tag->{TALB} = $id3v1->album();
$tag->{TYER} = $id3v1->year();
$tag->{TRCK} = $id3v1->track();
$tag->{TIT1} = $id3v1->genre();

if ($upgrade && read_yes_no("Upgrade ID3v1 tag to ID3v2 for $file?", 1))
{
set_tag($file, $tag);
}
}
else
{
warn "No ID3 TAG info in $file, creating it";
$tag = {
TIT2 => '',
TPE1 => '',
TALB => '',
TYER => 9999,
COMM => '',
};
}
print "Got tag ", Dumper $tag
if $config->DEBUG();
return $tag;
}
# }}}



set_tag() 函數是 get_tag() 函數的兄弟。它編寫 ID3v2 標籤,檢視 COMM 和 WXXX 框架的子元素。它接受散列引用,比如 get_tag() 函數可能產生的那些散列引用。

清單 6. set_tag() 函數

# {{{ set_tag: set a ID3 V2 tag on a file
sub set_tag
{
my $file = shift @_;
my $tag = shift @_;
my $mp3 = MP3::Tag->new($file);
print Dumper $tag;
my $tags = $mp3->get_tags();
my $id3v2;

if (ref $tags eq 'HASH' && exists $tags->{ID3v2})
{
$id3v2 = $tags->{ID3v2};
}
else
{
$id3v2 = $mp3->new_tag("ID3v2");
}

my %old_frames = %{$id3v2->get_frame_ids()};

foreach my $fname (keys %$tag)
{
$id3v2->remove_frame($fname)
if exists $old_frames{$fname};

if ($fname eq 'WXXX')
{
$id3v2->add_frame('WXXX', 'ENG', 'FreeDB URL', $tag->{WXXX}) ;
}
elsif ($fname eq 'COMM')
{
$id3v2->add_frame('COMM', 'ENG', 'Comment', $tag->{COMM}) ;
}
else
{
$id3v2->add_frame($fname, $tag->{$fname});
}
}

$id3v2->write_tag();
return 0;
}
# }}}



print_tag_info() 函數簡單地列印輸出標籤的摘要。不像我在 autotag.pl 程序中的其他地方使用的 Data:umper 函數(必須指出,有時沒有必要使用), print_tag_info() 函數可以提供漂亮的、面向用戶的散列標籤元素的列印輸出。注意,該函數接受散列引用,而不是實際的檔案名。

指出檔案名和某些可能的 ID3 標籤訊息, guess_track_number() 函數和 guess_artist_and_track() 函數會盡力工作。注意, guess_track_number() 函數知道曲目的數量很少大於 30。

清單 7. print_tag_info()、 guess_track_number()、和 guess_artist_and_track() 函數

# {{{ print_tag_info: print the tag info

sub print_tag_info
{
my $filename = shift @_;
my $tag = shift @_;
my $extra = shift @_ || 'Track info';

# argument checking
return unless ref $tag eq 'HASH';

print "$extra for '$filename':\n";

foreach (keys %$tag)
{
printf "%10s : %s\n", $_, $tag->{$_};
}
}

# }}}

# {{{ guess_track_number: guess track number from ID3 tag and file name
sub guess_track_number
{
my $filename = shift @_;
my $tag = shift @_ || return undef;

$filename = basename($filename); # directories can contain confusing data

# first try to guess the track number from the old tag
if (exists $tag->{TRCK} && contains_word_char($tag->{TRCK}))
{
my $n = $tag->{TRCK} + 0; # fix tracks like 1/10
return $n;
}
elsif ($filename =~ m/([012]?\d).*\.[^.]+$/)
# now look for numbers in the filename (0 through 29)
{
print "Guessed track number $1 from filename '$filename'\n"
if $config->DEBUG();
return $1;
}

return undef; # if all else fails, return undef
}
# }}}

# {{{ guess_artist_and_track: guess artist and track from file name
sub guess_artist_and_track
{
my $filename = shift @_;
my $artist;
my $track;

$filename = basename($filename); # directories can contain confusing data

if ($filename =~ m/([^-_]{3,})\s*-\s*(.{3,})\s*\.[^.]+$/)
{
print "Guessed artist $1 from filename '$filename'\n"
if $config->DEBUG();
$artist = $1;
$track = $2;
}

return ($artist, $track);
}
# }}}



我使用從 FreeDB 搜尋中返回的資料來產生帶有適當元素的匿名散列。雖然 WebService::FreeDB 字段和 ID3v2 標籤元素之間的映射是試驗性的,但它工作得很好。

清單 8. make_tag_from_freedb() 函數

# {{{ make_tag_from_freedb: make the ID3 tag info from a FreeDB entry
sub make_tag_from_freedb
{
my $disc = shift @_;
my $track = shift @_;

# argument checking
return undef unless $track =~ m/^\d+$/;

# note that the user inputs track "1" but WebService::FreeDB gives us that
# track at position 0, so we decrement $track
$track--;

return undef unless exists $disc->{trackinfo};

return undef unless exists $disc->{trackinfo}->[$track];

my $track_data = $disc->{trackinfo}->[$track];

return {
TIT1 => $disc->{genre},
TIT2 => $track_data->[0],
TRCK => $track+1,
TPE1 => $disc->{artist},
TALB => $disc->{cdname},
TYER => $disc->{year},
WXXX => $disc->{url},
COMM => $disc->{rest}||'',
};

}
# }}}



大規模加注標籤、大規模重新命名、剝離註釋和猜測曲目數量
autotag.pl 的主要功能是識別 MP3 文件。但在這個程序中,往往需要對很多組文件進行小的調整。輸入 Four Autotagging Horsemen。

剝離註釋是非常簡單的程序。我使用 get_tag() 獲得散列標籤,清空 COMM 和 WXXX 字段,以及使用 set_tag() 將該標籤寫回。實際上,註釋剝離可能已經通過大規模標籤加注完成了,但這個函數使用得非常頻繁,以至於使我感到有必要為它設定一個獨立的選項。

猜測曲目數量也使相當簡單的。獲取散列標籤,在該檔案和散列標籤上使用 guess_track_number() 函數,請求驗證,然後將該標籤寫回到文件中。

在一系列文件上對多個鍵(例如 TALB)進行大規模標籤加注操作。例如:

autotag.pl -mt "TALB=Best" *.mp3

於是,所有具有 mp3 副檔名的文件都在其 ID3v2 標籤中指定了 TALB 值。當您擁有某個藝術家的全部樂曲的目錄時,以及希望用該藝術家的名字標記所有這些樂曲時,採用大規模標籤加注的方式是非常合適的。只有受支持的標籤元素才可以大規模加注標籤。再一次進行這樣的程序:獲取散列標籤、進行修改,然後將它寫回。這樣做目的是使它的維護簡單便利。

清單 9. 大規模加注標籤、註釋剝離和猜測曲目數量

# {{{ handle the one-shot options
if ($config->GUESS_TRACK_NUMBERS_ONLY() ||
$config->STRIP_COMMENT_ONLY() ||
scalar keys %{$config->MASS_TAG_ONLY()})
{
foreach my $file (@ARGV)
{
my $tag = get_tag($file, 1);
unless (defined $tag)
{
warn "No ID3 TAG info in '$file', skipping";
next;
}

next if $config->DRYRUN();

# delegate stripping comments to the mass tagging function
if ($config->STRIP_COMMENT_ONLY())
{
$config->MASS_TAG_ONLY()->{COMM} = '';
$config->MASS_TAG_ONLY()->{WXXX} = '';
}

if (scalar keys %{$config->MASS_TAG_ONLY()})
{
foreach (keys %{$config->MASS_TAG_ONLY()})
{
unless (exists $supported_frames{$_})
{
warn "Unsupported tag element $_ requested for mass tagging, skipping";
next;
}
$tag->{$_} = $config->MASS_TAG_ONLY()->{$_};
}
set_tag($file, $tag);
}
else
{
my $track_number_guess = guess_track_number($file, $tag);

next if $config->DRYRUN();

if (defined $track_number_guess &&
read_yes_no("Is track number $track_number_guess OK for '$file'?", 1))
{
$tag->{TRCK} = $track_number_guess;
set_tag ($file, $tag);
}
else
{
warn "Could not guess a track number for file $file, sorry";
}
}
}

exit 0;
}
# }}}



噢,該介紹大規模重新命名選項了。我之所以將這個問題留在最後,是因為這個問題最複雜。對於每個重新命名參數而言,我將標籤值中的每個「%」都表示為「{{{%}}}」,因為不這樣的話,當後面跟隨一個特殊的重新命名參數時,「%」字元就可能被曲解。例如,用「100%true」作為曲目名,我們來看一看它如何變成「100%TRACKNAMErue」的,這裡 TRACKNAME 是我從該散列標籤中獲取的曲目名。

大規模重新命名也可消除不良的字元,代之以某些帶有「_」的字元,以確保檔案名合理。最後,除非通過指令行指出 -c ( accept_all )選項,否則 autotag.pl 將詢問是否可以對文件重新命名。

清單 10. 大規模重新命名

# {{{ handle the -rename_only option
if ($config->RENAME_ONLY())
{
foreach my $file (@ARGV)
{
my $tag = get_tag($file, 1);
# the extra parameter will ask us about upgrading V1 to V2
unless (defined $tag)
{
warn "No ID3 TAG info in '$file', skipping";
next;
}

my %map = (
'%c' => 'COMM',
'%s' => 'TIT2',
'%a' => 'TPE1',
'%t' => 'TALB',
'%n' => 'TRCK',
);

my $name = $config->RENAME_FORMAT();

foreach my $key (keys %map)
{
my $tagkey = $map{$key};
my $replacement = '';
if (exists $tag->{$tagkey})
{
$replacement = substr $tag->{$tagkey}, 0, $config->RENAME_MAX_CHARS();
# limit to N characters
if ($tagkey eq 'TRCK' && $replacement =~ m/^\d$/)
{
$replacement = "0$replacement";
}
}

$replacement =~ s/%/{{{%}}}/g;
# this is how we preserve %a in the fields, for example

$name =~ s/$key/$replacement/;
}

$name =~ s/{{{%}}}/%/g; # turn the {{{%}}} back into % in the fields

print "The name after % expansion is $name\n" if $config->DEBUG();

foreach my $char (map { quotemeta } @{$config->RENAME_BADCHARS()})
{
$name =~ s/$char//g;
}

print "The name after character removals is $name\n" if $config->DEBUG();

my $newchar = quotemeta $config->RENAME_REPLACEMENT();

foreach my $char (map { quotemeta } @{$config->RENAME_REPLACECHARS()})
{
$name =~ s/$char/$newchar/eg;
}

print "The name after character replacements is $name\n" if $config->DEBUG();


if ($name eq $file)
{
# do nothing
print "Renaming $file is unnecessary, it already answers to our high standards\n"
if $config->DEBUG();
}
elsif (-e $name)
{
warn "Could not use name $name, it's already taken by an existing
file or directory $file";
}
elsif ($config->ACCEPT_ALL() || read_yes_no("Is name $name OK for '$file'?", 1))
{
next if $config->DRYRUN();
print "Renaming $file -> $name\n";
rename($file, $name);
}
else
{
# do nothing
}
}

exit 0;
}
# }}}



結束語
本文的第 2 部分將討論 autotag.pl 的主循環,介紹該程序的一般用法。

參考資料

您可以參閱本文在 developerWorks 全球站點上的 英文原文.


閱讀 Ted 在 developerWorks 上的「功能豐富的 Perl」系列中的所有 Perl 文章。


下載 autotag application(為了執行該檔案,請重新命名為 autotag.pl)。


The CPAN module archive包含很多有用的 Perl 程序。


Ted 在專有的 CDDB / Gracenote上選項免費的 FreeDB project作為後端資料庫。


可以在 Open Directory 中找到有關很多不同 音瀕格式 (包括 MIDI、MP3 和 Ogg Vorbis)的資源。


如果您在使用 Term:Readline:Perl 時曾經遇到過麻煩,請嘗試使用 Term:Readline:GNU 。


id3lib library是用於讀、寫和操縱 ID3v1 和 ID3v2 標籤的。


MP3::Tag CPAN module 是用於讀 MP3 音瀕文件的標籤的。


Webservice::FreeDB CPAN module 通過搜尋關鍵字從 FreeDB 中獲取 列項。


MP3::ID3Lib CPAN module 使得您可以在 MP3 文件中編輯和增加 ID3 標籤 。


CPAN bundle安裝 MusicBrainz 客戶端機和所要求的模組。


AudioFile-Identify-MusicBrainz 是 MusicBrainz 服務的另一種 CPAN 接頭,是純 Perl 的 MusicBrainz 客戶端機實現。


IBM developerWorks 的文章「 Thinking XML: Manage metadata with MusicBrainz」討論了 MusicBrainz 服務的元資料問題。


AppConfig 是用於管理應用程式配置資訊的 Perl5 模組。


在 Ted 的專欄「 Application configuration with Perl」中可以瞭解更多有關 AppConfig 的訊息。


喜歡玩音響嗎?在 IBM developerWorks 的文章「 Introducing XHTML + Voice -- IBM's proposal to the W3C on developing multimodal UIs」和「 Multimodal applications」中,可以瞭解更多有關啟動聲音設備的內容。


您可能希望閱讀 IBM alphaWorks 上的文章 Voice Toolkit Preview。


噢,試一下 Music Sketcher吧,這是一個圖形化的作曲工具,它是由 IBM Research的多媒體專家編寫的。


關於作者
Teodor Zlatanov 於 1999 年獲取了波士頓大學電腦工程系碩士學位。他從 1992 年就開始做程序員,使用 Perl、Java、C 和 C++。他的興趣在於開放來源碼工作,致力於文本解析、3 層客戶端機-伺服器資料庫體系結構、UNIX 系統管理、CORBA 和專案目管理。可以通過 tzz@bu.edu 與他聯繫。
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
有 2 位會員向 psac 送花:
Jerrybribe (2017-09-06),qdenise (2008-10-08)
感謝您發表一篇好文章
舊 2006-02-24, 09:20 AM   #4 (permalink)
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設

用ASP實現對MP3曲目訊息的操作.
先簡單說一下MP3的ID3 標記,因為主要是操作這個玩意。

MP3最開始的時候沒有我們今天看到的那樣,有歌手、年代,專集等等訊息。只有一些簡單的參數如yes/no來表示是不是privated或者copyrighted等訊息,這樣對MP3的相關工作帶來了很多不便,1996年的時候有個老外提出來在每個MP3後面追加一段資料,用以存放上述的那些訊息,後來就發展成為id3 v1 據我所知的現在已經到1.1了,具體的還是自己去查一下吧。

用metadata來引入DLL

<!--METADATA TYPE="typelib"
UUID="00000205-0000-0010-8000-00AA006D2EA4"
NAME="ADODB Type Library"
-->

<%
Function ConvertBin(Binary)
'This function converts a binary byte into an ASCII byte.
for i = 1 to LenB(Binary)
strChar = chr(AscB(MidB(Binary,i,1)))
ConvertBin = ConvertBin & strChar
Next
End Function

dim objStream
dim strTag, strSongName, strArtist, strAlbum, strYear, _
strComment, strGenre, strFile

'Specify the folder to iterate through, displaying all the MP3s
Const folder = "C:mp3s"

'Grab the folder information

Dim objFSO, objFolder, objFile
Set objFSO = Server.CreateObject("Scripting.FileSYstemObject")
Set objFolder = objFSO.GetFolder(folder)

'Create the Stream object
set objStream = Server.CreateObject("ADODB.Stream")
objStream.Type = adTypeBinary

'Loop through the files in the folder
For Each objFile in objFolder.Files
'Open the stream
objStream.Open
objStream.LoadFromFile objFile.Path

'Read the last 128 bytes
objStream.Position = objStream.size - 128

'Read the ID3 v1 <b style="color:black;background-color:#a0ffff">tag</b> <b style="color:black;background-color:#99ff99">info
</b> strTag = ConvertBin(objStream.Read(3))
if ucase(strTag) = "<b style="color:black;background-color:#a0ffff">TAG</b>" then
strSongName = ConvertBin(objStream.Read(30))
strArtist = ConvertBin(objStream.Read(30))
strAlbum = ConvertBin(objStream.Read(30))
strYear = ConvertBin(objStream.Read(4))
strComment = ConvertBin(objStream.Read(30))
end if

'Display the results
response.write "<table><tr><td colspan=2><h3>" & _
"ID3 <b style="color:black;background-color:#a0ffff">Tag</b> <b style="color:black;background-color:#99ff99">info</b> for:</td></tr><tr>" & _
"<td colspan=2>" & objFile.Name & "</td></tr>"
response.write "<tr><td><b>Artist: </b></td>" & _
"<td>" & strArtist & "</td></tr>"
response.write "<tr><td><b>Track: </b></td>" & _
"<td>" & strSongName & "</td></tr>"
response.write "<tr><td><b>Album: </b></td>" & _
<td>" & strAlbum & "</td></tr>"
response.write "<tr><td><b>Year: </b></td>" & _
"<td>" & strYear & "</td></tr>"
response.write "<tr><td><b>Comment: </b>" & _
"</td><td>" & strComment & "</td></tr>"
response.write "</table>"

objStream.Close

Response.Write "<p><hr><p>"
Next

Set objStream = Nothing 'Clean up...
%>
修改了一下:

<!--METADATA TYPE="typelib"
UUID="00000205-0000-0010-8000-00AA006D2EA4"
NAME="ADODB Type Library"
-->

<%
Response.Buffer = false
Function ConvertBin(Binary)
'This function converts a binary byte into an ASCII byte.
for i = 1 to LenB(Binary)
strChar = chr(AscB(MidB(Binary,i,1)))
ConvertBin = ConvertBin & strChar
Next
End Function

dim objStream
dim strTag, strSongName, strArtist, strAlbum, strYear, _
strComment, strGenre, strFile

'Specify the folder to iterate through, displaying all the MP3s
Const folder = "F:\MUSIC"

'Grab the folder information

Dim objFSO, objFolder, objFile
Set objFSO = Server.CreateObject("Scripting.FileSYstemObject")
Set objFolder = objFSO.GetFolder(folder)

'Create the Stream object
set objStream = Server.CreateObject("ADODB.Stream")
objStream.Type = adTypeBinary

'Loop through the files in the folder
For Each objFile in objFolder.Files
if lcase(objFSO.GetExtensionName(objFile)) = "<b style="color:black;background-color:#ffff66">mp3</b>" then
Response.Write objFile.Type
'Open the stream
objStream.Open
objStream.LoadFromFile objFile.Path

'Read the last 128 bytes
objStream.Position = objStream.Size - 128

'Read the ID3 v1 <b style="color:black;background-color:#a0ffff">tag</b> <b style="color:black;background-color:#99ff99">info
</b>strTag = ConvertBin(objStream.Read(3))
if ucase(strTag) = "<b style="color:black;background-color:#a0ffff">TAG</b>" then
strSongName = ConvertBin(objStream.Read(30))
strArtist = ConvertBin(objStream.Read(30))
strAlbum = ConvertBin(objStream.Read(30))
strYear = ConvertBin(objStream.Read(4))
strComment = ConvertBin(objStream.Read(30))
end if

'Display the results
response.write "<table><tr><td colspan=2><h3>" & _
"ID3 <b style="color:black;background-color:#a0ffff">Tag</b> <b style="color:black;background-color:#99ff99">info</b> for:</td></tr><tr>" & _
"<td colspan=2>" & objFile.Name & "</td></tr>"
response.write "<tr><td><b>Artist: </b></td>" & _
"<td>" & strArtist & "</td></tr>"
response.write "<tr><td><b>Track: </b></td>" & _
"<td>" & strSongName & "</td></tr>"
response.write "<tr><td><b>Album: </b></td>" & _
"<td>" & strAlbum & "</td></tr>"
response.write "<tr><td><b>Year: </b></td>" & _
"<td>" & strYear & "</td></tr>"
response.write "<tr><td><b>Comment: </b>" & _
"</td><td>" & strComment & "</td></tr>"
response.write "</table>"

objStream.Close

Response.Write "<p><hr><p>"

end if
Next

Set objStream = Nothing 'Clean up...
%>
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
向 psac 送花的會員:
Jerrybribe (2017-09-06)
感謝您發表一篇好文章
舊 2006-02-24, 09:25 AM   #5 (permalink)
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設

艾利和MP3一般問題教學




1 有些文件無法播放
iriver絕大部分系列支持mp3、wma、asf、ogg格式(ifp100系列不支持)而且有頻率範圍
具體範圍不在此一一詳述了
對於mp3 首先確定是不是mp3 有的可能是mp2 這個可以用winamp檢視看文件內容看到
對於wma 要確定不是有版權保護的 有的話是不能播放的
還有 有些mp3 如果播放時開啟id3 tag無法播放 請關掉(在display功能表中的tag info中修改)
大部分不能播放的文件 只要在電腦上能播放 就用相關軟體轉換成普通格式(128k的mp3)應該就沒有問題了

2 昇級以後 電腦不能連接機器
類似情況很多種
a 您從有驅昇級到無驅 那麼確實不能用imm(iriver music manager)軟體連接
您現在的ifp已經是移動盤了 你可以直接在我的電腦裡看見一個可移動盤
如果你還使用98(含)一下的windows系統 還會需要驅動
b 昇級失敗 如ifp180變成120等類似情況 這時要重新裝驅動以及imm
一次不行 換個次序再重裝 驅動可以換為手動安裝(windows操作就不詳述了)
一般只要多試幾遍 有一點電腦知識就沒有問題 如果實在不行 就只有找客服了
c 昇級失敗 你的一些錯誤操作導致昇級失敗 比如過早點擊確定
電池電源不足 中途觸碰了機器等 這樣一般就需要送修了 由專業人員幫您刷回固件

3 社區使用問題

新的社區很多實用和安排都不一樣了,耳目一新,請看這裡的詳細說明
http://www.iriver.com.cn/community/f...8966&RoomID=16

4 播放器容量變小
最新無驅固件昇級以後聽說容量有很大減少 您可以刷回原來的有驅固件
格式化一遍 再昇級無驅 有人說這樣可以恢復容量
如果還不行 那就是固件本身原因了 等待下一次固件昇級吧
僅針對早期iFP系列

5 怎麼從無驅刷回有驅固件
copy 有驅固件到 ifp根目錄 保證電池充足 容量有2m以上剩餘
用gerenal功能表下的firmware upgrade昇級
按提示操作即可 較新固件昇級後會自動格式化

6 什麼是有驅 無驅 有什麼區別
有驅是官方說的管理器版 需要用imm進行 移除 下載等操作
現在還有其他方式進行操作 比如用WMP的同步
還有Total Commander的iFP插件等等

無驅 也叫ums版 昇級以後ifp就成了USB碟 所有操作和操作u盤一樣
有驅的傳輸速度較快 是無驅的一倍以上 並可以配合imm編輯fm名稱 文件排序等等
無驅主要好處就是方便 即插即用 可以上傳任意文件 直接修改ifp內文件等等

7 XX軟體在哪兒下載
這裡應該有你要的所有官方軟體
http://www.iriverchina.com/support/download.asp
其他軟體建議去 以下網站
http://www.crsky.com/
http://www.9down.com/
http://soft.winzheng.com/
http://www.fixdown.com/

8 怎麼讓我的iFP支持歌詞顯示
首先需要固件支持 300和500系列出廠就已經支持 100系列固件1.17以後的才支持
其他後系產品均已完全支持
iFP顯示歌詞並不像Winamp等軟體那樣 指定lyric的目錄 配合顯示軟體顯示
而是將lrc格式歌詞轉換成snc格式合併 產生新的文件給iFP播放
熱心網友孤星天地編寫了直接將lrc歌詞合併到mp3的軟體
下載位址
http://user.iriverchina.com/371/Lrc%...er%20V1_6a.zip

9 98的usb驅動(無驅用)
http://download.iriverchina.com/iriv...rUmsDriver.zip
簡單解釋一下 iFP昇級無驅後 可以在windows me以上系統即插即用 無需驅動
但win98以下則不行 以上這個驅動是從winme和win2k抽取的通用版本 適合多種usb設備

10 ogg支持問題
ifp300 和500系列已經很好的支持(300系列必須捨棄對WMA的支持)
100系列因為硬體原因可能相對困難 但iriver仍在努力
imp系列 好像250 350 400 550應該沒問題了
其他系列均已經支持


11 我的電池怎麼一下就沒有了
對於ifp系列
FM收音 拷貝文件 背景燈 啟用EQ 音量大 這幾項都相對比較耗電
ifp300的20小時播放時間和ifp500的26小時播放時間是在以下特定情況下測得的
使用128k的mp3 用20音量 EQ為NORMAL 不進行任何拷貝 不聽收音機 靜態播放
電量顯示也不是很精確 頭兩格電一般很經用 後兩格就差多了 這個正常
對於imp系列
引用Kel的imp550測試結果
55小時的播放時間是使用原配電池加上外接電池筒裝上全新的鹼性電池,播放128kbps的MP3,SORT選項PHYSICAL ADDR,關閉TAG INFOMATION,選項順序循環播放模式,關閉背光燈,音量20,EQ模式為NORMAL下,在平整安穩,室溫20-25攝氏度的環境下測得的
播放普通CD的播放時間按照這樣的設定可以達到接近11小時的播放時間:
單單使用原配電池,SORT選項PHYSICAL ADDR,關閉TAG INFOMATION,選項順序循環播放模式,關閉背光燈,音量20,EQ模式為NORMAL下,在平整安穩,室溫20-25攝氏度的環境
按照這個設定,再加上外接電池筒裝上全新的鹼性電池,播放普通CD的播放時間可以達到24小時是沒有問題的
新買回來的電池最好經過反覆的幾次放電充電,以消除電池的記憶效應

12 能不能加個時間顯示(不是播放時間 是指的北京時間)
500系列以前的不行 這個沒有硬體支持 雖然看起來很簡單
以後的系列都支持了

13 昇級無驅後顯示 fat support only 無法格式化 昇級空間不足
無驅格式化必須用fat格式 不能用fat32 且必須是 快速格式化
出現這種情況 試著重新用fat格式格式化
windows下不行就在在command模式下 FORMAT x:(IFP的磁碟代號)/FS:FAT /Q
(部分新的無驅固件會自動格式化 無需用電腦格式化了)

14 什麼時候出新固件
一般情況是一到三個月一次(不是每種產品都更新) 也有特殊情況 不能保證

15 我的耳機不是MX300嗎?
原先iRiver的產品是配備MX300 現在是OEM 英國Cresyn公司的耳機 效果好於MX300

16 EAC和LAME在哪兒下載
EAC http://www.exactaudiocopy.de/
LAME http://lame.sourceforge.net/
EAC抓音軌常用的軟體 本論壇的幾乎都用這個 中文軟體 有使用嚮導

17 什麼是ogg
http://www.xiph.org/ogg/
這個是英文的頁面

18 MP3相關常識(閒雲孤鶴總結)
mp3:MPEG 1 Layer3 的縮寫,有損壓縮的音瀕格式。我們用的都是這個。
wav:波形文件,直接紀錄聲音的波形,從CD抓取的音軌就是wav文件,體積大。
wma:Windows Media
Audio的縮寫,有有損壓縮和無損壓縮兩種格式。無損壓縮體積比較大。常用的是有損壓縮格式,在低bit率時,效果好過mp3,如果從同樣音源製作,64K的
wma效果近似128K的mp3,96K的wma略好於128K的mp3。在高碼率時,wma作用不大。
ASF:微軟流媒體檔案類型。Windows Media Player的核心。可以包括音瀕和視瀕。純音瀕的ASF就和wma一樣。
MPEG:Moving Pictures Experts Group,動態圖像專家組的英文縮寫。
mp2:MPEG 1 Layer2文件。超級解霸預設壓縮就是mp3後面名,mp2格式的文件,所以普通mp3機基本不能正常播放。
rm:Real公司的流媒體文件。壓縮比高,在非常低的bit率下效果較好,但是在高bit時效果很差。
APE:無損壓縮格式,大小只有wav文件的一半,但是音質沒有絲毫降低。有時也採用MAC的後面名。
mp3pro:mp3pro是由Thomson Multimedia
,一個製作mp3編碼格式的公司現推出的一個MP3格式的昇級格式,可以在mp3文件一半的大小實現比mp3更好的音質。
swa:Shockwave Audio文件。Authorware的聲音文件。屬於MPEG 2 level3壓縮格式,在低頻下較mp3優秀。把後面名直接改為mp3就可以播放。
AAC:Advanced Audio Coding進階音瀕編碼的縮寫,就是以前常說的mp4文件。屬於MPEG 2壓縮。效果比mp3更好。
VBR:Variable Bitrate,動態比特率。編碼時,對人耳不敏感的部分用低碼率,敏感的部分用高碼率,在保持音質的情況下可以減小體積。
CBR:Constant Bitrate,常數比特率。採用一個恆定的編碼率編碼。
ABR:Average
Bitrate,平均比特率,是VBR的一種插值參數。LAME針對CBR不佳的文件體積比和VBR產生文件大小不定的特點獨創了這種編碼模式。ABR在指定的文件大小
內,以每50畫格(30畫格約1秒)為一段,低頻和不敏感頻率使用相對低的流量,高頻和大動態表現時使用高流量,可以做為VBR和CBR的一種折衷選項。
LAME:最好的mp3壓縮引擎(192Kbps以下沒有優勢)。本身是DOS下的文件,需要加外殼程序才比較容易使用,也可以在別的軟體(比如EAC)中間使用。

19 iFP是否支持各種擴充卡
所有已上市的所有系列 均不支持

20 iMP怎麼昇級
Kel寫的昇級指南
http://www.iriverchina.com/forum/dis....asp?idx=83739
sorry 已經不能瀏覽…… ==|

21 2.xx固件可以昇級1.xx嗎(類似問題)
所有固件之間都可以轉換昇級 無論從新到舊或從舊到新

22 IMM3.0太大了,下載經常失敗
3.0的官方版本有19m之巨!這裡有一個2.0簡化版,只有幾百K,保留主要文件,解壓就可以用(改後面為7z)
不過不能保證所有98,me可以用,最好裝了office等軟體,這樣會安裝一些執行庫文件
http://user.iriverchina.com/2875/20050808142140.rar
現在最新版本 3.16已經提供下載 提供了抓取音軌並壓縮成ogg的功能 30m 比較大
http://download.iriverchina.com/iriv...nager_V316.zip

23 怎麼申請個人資料夾
當你的點券到了150,就可以申請500k的空間用於自己放文件
申請位址 http://www.iriverchina.com/community/
現在用點數申請增加空間 哈哈

24 RM格式(Realplayer)怎麼轉MP3
用Streambox Ripper 這裡下載
http://gz.onlinedown.net/soft/7191.htm

25 WMA怎麼轉MP3,MP3怎麼轉WMA
Power MP3 WMA Converter 3 漢化版
http://www.crsky.com/soft/5650.html
還有很多類似軟體 有個叫4U WMA MP3 Converter的也不錯

26 iFP系列昇級全集和固件全集
http://www.imp3.net/bbs/index.php?showtopic=61032
介紹很詳細 收集了所有的老版本固件

27 怎麼使用個人資料夾
以圖片為例 進入你的社區 http://www.iriverchina.com/community/
點瀏覽按鈕 瀏覽一個文件 選 再點上傳
完成後會有視窗提示你 再點 檢視所有文件按鈕
跳出的視窗 顯示你上傳的文件 拷貝文件的位址
再用發帖裡的 圖片功能 貼上你的圖片位址

28 iFP支持txt、rm、ape……文件嗎
暫時不支持 ifp500以及ihp系列 已經支持ogg格式了
ifp300和imp系列也將陸續支持
對於rm和ape格式 支持可能很小 rm是流體文件 一般比特率都不高 沒有支持的必要
ape是無損壓縮 體積還是很大 ifp容量不行

29 iFP裡的文件怎麼排序
有驅固件:可以使用拖放,上下移動文件,就是選一個文件,按住滑鼠左鍵不放,上下移動
到你想要的位子,放開滑鼠左鍵
無驅固件:按照你拷貝的順序排序,第一個考進去就是第一個,依此類推
排列方式還有很多 具體看技術區牧風的置頂貼
還有一個軟體 名字我忘了 等找到貼上位址

30 關於加記憶體的問題 加記憶體是因為小艾還留有一個可以焊接FlashRom的位置,但是兩個FlashRom必須是同樣大小,意思就是128可以加128但是不能加個256的,最終的記憶體大小也只能是128、256、512三種,這樣系統才能認出這是什麼型號。加FlashRom是有一點風險的,焊接程序中也許有小問題,所以最好還是專業點的人士來做,同時,沒有過品質保證期的朋友慎重考慮,因為對小艾做如此大的手術,你以後是否能享受到品質保證就難說了。


31 關於耳機的問題,首先,新配的耳機還是相對來說不錯的耳機,它和森海系的MX系列最大的差別就我個人來看是森海系解析度高,聲音很乾淨,標配的聲音比較厚。這種差別不能說優劣,因為厚或者脆一點都有它適合的音樂。但是不管怎麼說,其實300和500之間的差別,聽起來遠沒有標配和MX500之間這種風格的差別來的明顯。至於PX系列,他們的發音單元都是不錯的,只不過PX100開放式的設計導致漏音比較大,而且好像只剩下重音了,所以大家推薦PX200比較多。PX200較於MX500,優勢就是音場好,空間感加強了,但是你要說能把街邊琴行裡賣的小提琴聽成斯特拉迪瓦利,我看也夠戧,哈哈。最主要,耳機到底對耳朵是個保護,我就是感覺到自己的耳朵對耳塞有點承受不住所以忍痛買的PX200。

32 APE格式的轉換問題 APE格式是Monkey Audio的編碼方式,大小是wav的一半,約摸又是320Kbps的mp3的一倍,卻是無損編碼,也就是說由APE轉換的mp3品質和原盤抓規是沒有區別的。一般來說,當然你可以由Monkey Audio來解碼成wav,然後壓縮成mp3(就在M.A.裡面外掛LAME或者用其他軟體壓縮Wav)。最簡單的辦法就是用Foobar2000(完全安裝),它轉換同樣是用Monkey Audio和Lame的解碼編碼器,所以應該在音質上沒什麼區別的。喜歡古典音樂的朋友大可以走這條路,www.imagegarden.net/bt裡面有很多APE古典音樂的資源。

33 關於耳機組態問題
iFP-180TC是配MX300的
其他FlashRomMP3 容量 512M以上的 都是MX400
H10,H100,H300,iMP-1100 等也是 MX400
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
有 2 位會員向 psac 送花:
Jerrybribe (2017-09-06),LouisShimi (2017-10-05)
感謝您發表一篇好文章
 


主題工具
顯示模式

發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用


所有時間均為台北時間。現在的時間是 11:19 PM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1