MP3文件格式
一.概述:
MP3文件是由幀(frame)構(gòu)成的,幀是MP3文件最小的組成單位。MP3的全稱應(yīng)為MPEG1 Layer-3音頻文件,MPEG(Moving Picture Experts Group)在漢語中譯為活動(dòng)圖像專家組,特指活動(dòng)影音壓縮標(biāo)準(zhǔn),MPEG音頻文件是MPEG1標(biāo)準(zhǔn)中的聲音部分,也叫MPEG音頻層,它根據(jù)壓縮質(zhì)量和編碼復(fù)雜程度劃分為三層,即Layer-1、Layer2、Layer3,且分別對(duì)應(yīng)MP1、MP2、MP3這三種聲音文件,并根據(jù)不同的用途,使用不同層次的編碼。MPEG音頻編碼的層次越高,編碼器越復(fù)雜,壓縮率也越高,MP1和MP2的壓縮率分別為4:1和6:1-8:1,而MP3的壓縮率則高達(dá)10:1-12:1,也就是說,一分鐘CD音質(zhì)的音樂,未經(jīng)壓縮需要10MB的存儲(chǔ)空間,而經(jīng)過MP3壓縮編碼后只有1MB左右。不過MP3對(duì)音頻信號(hào)采用的是有損壓縮方式,為了降低聲音失真度,MP3采取了“感官編碼技術(shù)”,即編碼時(shí)先對(duì)音頻文件進(jìn)行頻譜分析,然后用過濾器濾掉噪音電平,接著通過量化的方式將剩下的每一位打散排列,最后形成具有較高壓縮比的MP3文件,并使壓縮后的文件在回放時(shí)能夠達(dá)到比較接近原音源的聲音效果。
二.整個(gè)MP3文件結(jié)構(gòu):
MP3文件大體分為三部分:TAG_V2(ID3V2),F(xiàn)rame, TAG_V1(ID3V1)
ID3V2
包含了作者,作曲,專輯等信息,長度不固定,擴(kuò)展了ID3V1的信息量。
Frame
.
.
.
Frame
一系列的幀,個(gè)數(shù)由文件大小和幀長決定
每個(gè)FRAME的長度可能不固定,也可能固定,由位率bitrate決定
每個(gè)FRAME又分為幀頭和數(shù)據(jù)實(shí)體兩部分
幀頭記錄了mp3的位率,采樣率,版本等信息,每個(gè)幀之間相互獨(dú)立
ID3V1
包含了作者,作曲,專輯等信息,長度為128BYTE。
三.MP3的FRAME格式:
每個(gè)FRAME都有一個(gè)幀頭FRAMEHEADER,長度是4BYTE(32bit),幀頭后面可能有兩個(gè)字節(jié)的CRC校驗(yàn),這兩個(gè)字節(jié)的是否存在決定于FRAMEHEADER信息的第16bit,為0則幀頭后面無校驗(yàn),為1則有校驗(yàn),校驗(yàn)值長度為2個(gè)字節(jié),緊跟在FRAMEHEADER后面,接著就是幀的實(shí)體數(shù)據(jù)了,格式如下:
FRAMEHEADER
CRC(free)
MAIN_DATA
4 BYTE
0 OR 2 BYTE
長度由幀頭計(jì)算得出
1.幀頭FRAMEHEADER格式如下:
AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM
13個(gè)幀頭字符的含義如下:
Sign
Length
(bits)
Position
(bits)
Description
A
11
(31-21)
Frame sync (all bits set)
B
2
(20,19)
MPEG Audio version
00 - MPEG Version 2.5
01 - reserved
10 - MPEG Version 2
11 - MPEG Version 1
C
2
(18,17)
Layer description
00 - reserved
01 - Layer III
10 - Layer II
11 - Layer I
D
1
(16)
Protection bit
0 - Protected by CRC (16bit crc follows header)
1 - Not protected
E
4
(15,12)
Bitrate index
bits
V1,L1
V1,L2
V1,L3
V2,L1
V2,L2
V2,L3
0000
free
free
free
free
free
free
0001
32
32
32
32
32
8 (8)
0010
64
48
40
64
48
16 (16)
0011
96
56
48
96
56
24 (24)
0100
128
64
56
128
64
32 (32)
0101
160
80
64
160
80
64 (40)
0110
192
96
80
192
96
80 (48)
0111
224
112
96
224
112
56 (56)
1000
256
128
112
256
128
64 (64)
1001
288
160
128
288
160
128 (80)
1010
320
192
160
320
192
160 (96)
1011
352
224
192
352
224
112 (112)
1100
384
256
224
384
256
128 (128)
1101
416
320
256
416
320
256 (144)
1110
448
384
320
448
384
320 (160)
1111
bad
bad
bad
bad
bad
bad
NOTES: All values are in kbps
V1 - MPEG Version 1
V2 - MPEG Version 2 and Version 2.5
L1 - Layer I
L2 - Layer II
L3 - Layer III
"free" means variable bitrate.
"bad" means that this is not an allowed value
The values in parentheses are from different sources which claim that those values are valid for V2,L2 and V2,L3. If anyone can confirm please let me know.
F
2
(11,10)
Sampling rate frequency index (values are in Hz)
bits
MPEG1
MPEG2
MPEG2.5
00
44100
22050
11025
01
48000
24000
12000
10
32000
16000
8000
11
reserv.
reserv.
reserv.
G
1
(9)
Padding bit
0 - frame is not padded
1 - frame is padded with one extra bit
H
1
(8)
Private bit (unknown purpose)
I
2
(7,6)
Channel Mode
00 - Stereo
01 - Joint stereo (Stereo)
10 - Dual channel (Stereo)
11 - Single channel (Mono)
J
2
(5,4)
Mode extension (Only if Joint stereo)
value
Intensity stereo
MS stereo
00
off
off
01
on
off
10
off
on
11
on
on
K
1
(3)
Copyright
0 - Audio is not copyrighted
1 - Audio is copyrighted
L
1
(2)
Original
0 - Copy of original media
1 - Original media
M
2
(1,0)
Emphasis
00 - none
01 - 50/15 ms
10 - reserved
11 - CCIT J.17
1)每幀的播放時(shí)間:無論幀長是多少,每幀的播放時(shí)間都是26ms;
2)數(shù)據(jù)幀大小:
FrameSize = (((MpegVersion == MPEG1 ? 144 : 72) * Bitrate) / SamplingRate) + PaddingBit
例如: Bitrate = 128000, a SamplingRate =44100, and PaddingBit = 1
FrameSize = (144 * 128000) / 44100 + 1 = 417 bytes
2.MAIN_DATA:
MAIN_DATA部分長度是否變化決定于FRAMEHEADER的bitrate是否變化,一首MP3歌曲,它有三個(gè)版本:96Kbps(96千比特位每秒)、128Kbps和192Kbps。Kbps(比特位速率),表明了音樂每秒的數(shù)據(jù)量,Kbps值越高,音質(zhì)越好,文件也越大,MP3標(biāo)準(zhǔn)規(guī)定,不變的bitrate的MP3文件稱作CBR,大多數(shù)MP3文件都是CBR的,而變化的bitrate的MP3文件稱作VBR,每個(gè)FRAME的長度都可能是變化的。下面是CBR和VBR的不同點(diǎn):
1)CBR:固定位率的FRAME的大小也是固定的(公式如上所述),只要知道文件總長度,和幀長即可由播放每幀需26ms計(jì)算得出mp3播放的總時(shí)間,也可通過計(jì)數(shù)幀的個(gè)數(shù)控制快進(jìn)、快退慢放等操作。
2)VBR:VBR是XING公司推出的算法,所以在MP3的FRAME里會(huì)有“XING"這個(gè)關(guān)鍵字(現(xiàn)在很多流行的小軟件也可以進(jìn)行VBR壓縮,它們是否遵守這個(gè)約定,那就不得而知了),它存放在MP3文件中的第一個(gè)有效FRAME里,它標(biāo)識(shí)了這個(gè)MP3文件是VBR的。同時(shí)第一個(gè)FRAME里存放了MP3文件的FRAME的總個(gè)數(shù),這就很容易獲得了播放總時(shí)間,同時(shí)還有100個(gè)字節(jié)存放了播放總時(shí)間的100個(gè)時(shí)間分段的FRAME的INDEX,假設(shè)4分鐘的MP3歌曲,240S,分成100段,每兩個(gè)相鄰INDEX的時(shí)間差就是2.4S,所以通過這個(gè)INDEX,只要前后處理少數(shù)的FRAME,就能快速找出我們需要快進(jìn)的FRAME頭,可參考下文:
This system was created to minimize file lengths and to preserve sound quality.
Higher frequencies generally needs more space for encoding (thats why many codecs cut all frequencies above cca 16kHz) and lower tones requires less. So if some part of song doesnt consist of higher tones then using eg. 192kbps is wasting of space. It should be enough to use only eg. 96kbps.
And it is the principle of VBR. Codec looks over frame and then choose bitrate suitable for its sound quality.
It sounds perfect but it brings some problems:
If you want to jump over 2 minutes in song, it is not a problem with CBR because you are able simply count amount of Bytes which is necessary to skip. But it is impossible with VBR. Frame lengths should be arbitrary so you have to either go frame by frame and counts (time consuming and very unpractical) or use another mechanism for approximate count.
If you want to cut 5 minutes from the middle of VBR file (all we know CDs where last song takes 10 minutes but 5 minutes is a pure silence, HELL!) problems are the same.
Result? VBR files are more difficult for controlling and adjusting. And I dont like feeling that sound quality changes in every moment. And AFAIK many codecs have problems with creation VBR in good quality.
Personally I cant see any reason why to use VBR - I dont give a fuck if size of one CD in MP3 is 55 MB with CBR or 51 MB with VBR. But everybody has a different taste... some people prefer VBR.
VBR File Structure
is the same as for CBR. But the first frame doesnt contain audio data and it is used for special information about VBR file.
Structure of the first frame:
Byte
Content
0-3
Standard audio frame header (as descripted above). Mostly it contains values FF FB 30 4C, from which you can count FrameLen = 156 Bytes. And thats exactly enough space for storing VBR info.
This header contains some important information valid for the whole file:
- MPEG (MPEG1 or MPEG2)
- SAMPLING rate frequency index
- CHANNEL (JointStereo etc.)
4-x
Not used till string "Xing" (58 69 6E 67). This string is used as a main VBR file identifier. If it is not found, file is supposed to be CBR. This string can be placed at different locations according to values of MPEG and CHANNEL (ya, these from a few lines upwards):
36-39
"Xing" for MPEG1 and CHANNEL != mono (mostly used)
21-24
"Xing" for MPEG1 and CHANNEL == mono
21-24
"Xing" for MPEG2 and CHANNEL != mono
13-16
"Xing" for MPEG2 and CHANNEL == mono
After "Xing" string there are placed flags, number of frames in file and a size of file in Bytes. Each of these items has 4 Bytes and it is stored as 'int' number in memory. The first is the most significant Byte and the last is the least.
--------------------------------------------------------------------------------
Following schema is for MPEG1 and CHANNEL != mono:
40-43
Flags
Value
Name
Description
00 00 00 01
Frames Flag
set if value for number of frames in file is stored
00 00 00 02
Bytes Flag
set if value for filesize in Bytes is stored
00 00 00 04
TOC Flag
set if values for TOC (see below) are stored
00 00 00 08
VBR Scale Flag
set if values for VBR scale are stored
All these values can be stored simultaneously.
44-47
Frames
Number of frames in file (including the first info one)
48-51
Bytes
File length in Bytes
52-151
TOC (Table of Contents)
Contains of 100 indexes (one Byte length) for easier lookup in file. Approximately solves problem with moving inside file.
Each Byte has a value according this formula:
(TOC[i] / 256) * fileLenInBytes
So if song lasts eg. 240 sec. and you want to jump to 60. sec. (and file is 5 000 000 Bytes length) you can use:
TOC[(60/240)*100] = TOC[25]
and corresponding Byte in file is then approximately at:
(TOC[25]/256) * 5000000
If you want to trim VBR file you should also reconstruct Frames, Bytes and TOC properly.
152-155
VBR Scale
I dont know exactly system of storing of this values but this item probably doesnt have deeper meaning.
四.ID3v1
ID3V1比較簡單,它是存放在MP3文件的末尾,用16進(jìn)制的編輯器打開一個(gè)MP3文件,查看其末尾的128個(gè)順序存放字節(jié),數(shù)據(jù)結(jié)構(gòu)定義如下:
typedef struct tagID3V1
{
char Header[3]; /*標(biāo)簽頭必須是"TAG"否則認(rèn)為沒有標(biāo)簽*/
char Title[30]; /*標(biāo)題*/
char Artist[30]; /*作者*/
char Album[30]; /*專集*/
char Year[4]; /*出品年代*/
char Comment[28]; /*備注*/
char reserve; /*保留*/
char track;; /*音軌*/
char Genre; /*類型*/
}ID3V1,*pID3V1;
ID3V1的各項(xiàng)信息都是順序存放,沒有任何標(biāo)識(shí)將其分開,比如標(biāo)題信息不足30個(gè)字節(jié),則使用'\0'補(bǔ)足,否則將造成信息錯(cuò)誤。Genre使用原碼表示,對(duì)照表如下:
/* Standard genres */
0="Blues";
1="ClassicRock";
2="Country";
3="Dance";
4="Disco";
5="Funk";
6="Grunge";
7="Hip-Hop";
8="Jazz";
9="Metal";
10="NewAge";
11="Oldies";
12="Other";
13="Pop";
14="R&B";
15="Rap";
16="Reggae";
17="Rock";
18="Techno";
19="Industrial";
20="Alternative";
21="Ska";
22="DeathMetal";
23="Pranks";
24="Soundtrack";
25="Euro-Techno";
26="Ambient";
27="Trip-Hop";
28="Vocal";
29="Jazz+Funk";
30="Fusion";
31="Trance";
32="Classical";
33="Instrumental";
34="Acid";
35="House";
36="Game";
37="SoundClip";
38="Gospel";
39="Noise";
40="AlternRock";
41="Bass";
42="Soul";
43="Punk";
44="Space";
45="Meditative";
46="InstrumentalPop";
47="InstrumentalRock";
48="Ethnic";
49="Gothic";
50="Darkwave";
51="Techno-Industrial";
52="Electronic";
53="Pop-Folk";
54="Eurodance";
55="Dream";
56="SouthernRock";
57="Comedy";
58="Cult";
59="Gangsta";
60="Top40";
61="ChristianRap";
62="Pop/Funk";
63="Jungle";
64="NativeAmerican";
65="Cabaret";
66="NewWave";
67="Psychadelic";
68="Rave";
69="Showtunes";
70="Trailer";
71="Lo-Fi";
72="Tribal";
73="AcidPunk";
74="AcidJazz";
75="Polka";
76="Retro";
77="Musical";
78="Rock&Roll";
79="HardRock";
/* Extended genres */
80="Folk";
81="Folk-Rock";
82="NationalFolk";
83="Swing";
84="FastFusion";
85="Bebob";
86="Latin";
87="Revival";
88="Celtic";
89="Bluegrass";
90="Avantgarde";
91="GothicRock";
92="ProgessiveRock";
93="PsychedelicRock";
94="SymphonicRock";
95="SlowRock";
96="BigBand";
97="Chorus";
98="EasyListening";
99="Acoustic";
100="Humour";
101="Speech";
102="Chanson";
103="Opera";
104="ChamberMusic";
105="Sonata";
106="Symphony";
107="BootyBass";
108="Primus";
109="PornGroove";
110="Satire";
111="SlowJam";
112="Club";
113="Tango";
114="Samba";
115="Folklore";
116="Ballad";
117="PowerBallad";
118="RhythmicSoul";
119="Freestyle";
120="Duet";
121="PunkRock";
122="DrumSolo";
123="Acapella";
124="Euro-House";
125="DanceHall";
126="Goa";
127="Drum&Bass";
128="Club-House";
129="Hardcore";
130="Terror";
131="Indie";
132="BritPop";
133="Negerpunk";
134="PolskPunk";
135="Beat";
136="ChristianGangstaRap";
137="HeavyMetal";
138="BlackMetal";
139="Crossover";
140="ContemporaryChristian";
141="ChristianRock";
142="Merengue";
143="Salsa";
144="TrashMetal";
145="Anime";
146="JPop";
147="Synthpop";
五.ID3V2
ID3V2到現(xiàn)在一共有4個(gè)版本,但流行的播放軟件一般只支持第3版,既ID3v2.3。由于ID3V1記錄在MP3文件的末尾,ID3V2就只好記錄在MP3文件的首部了(如果有一天發(fā)布ID3V3,真不知道該記錄在哪里)。也正是由于這個(gè)原因,對(duì)ID3V2的操作比ID3V1要慢。而且ID3V2結(jié)構(gòu)比ID3V1的結(jié)構(gòu)要復(fù)雜得多,但比前者全面且可以伸縮和擴(kuò)展。
下面就介紹一下ID3V2.3。
每個(gè)ID3V2.3的標(biāo)簽都一個(gè)標(biāo)簽頭和若干個(gè)標(biāo)簽幀或一個(gè)擴(kuò)展標(biāo)簽頭組成。關(guān)于曲目的信息如標(biāo)題、作者等都存放在不同的標(biāo)簽幀中,擴(kuò)展標(biāo)簽頭和標(biāo)簽幀并不是必要的,但每個(gè)標(biāo)簽至少要有一個(gè)標(biāo)簽幀。標(biāo)簽頭和標(biāo)簽幀一起順序存放在MP3文件的首部。
1、標(biāo)簽頭
在文件的首部順序記錄10個(gè)字節(jié)的ID3V2.3的頭部。數(shù)據(jù)結(jié)構(gòu)如下:
char Header[3]; /*必須為"ID3"否則認(rèn)為標(biāo)簽不存在*/
char Ver; /*版本號(hào)ID3V2.3就記錄3*/
char Revision; /*副版本號(hào)此版本記錄為0*/
char Flag; /*存放標(biāo)志的字節(jié),這個(gè)版本只定義了三位,稍后詳細(xì)解說*/
char Size[4]; /*標(biāo)簽大小,包括標(biāo)簽頭的10個(gè)字節(jié)和所有的標(biāo)簽幀的大小*/
1).標(biāo)志字節(jié)
標(biāo)志字節(jié)一般為0,定義如下:
abc00000
a -- 表示是否使用Unsynchronisation(這個(gè)單詞不知道是什么意思,字典里也沒有找到,一般不設(shè)置)
b -- 表示是否有擴(kuò)展頭部,一般沒有(至少Winamp沒有記錄),所以一般也不設(shè)置
c -- 表示是否為測(cè)試標(biāo)簽(99.99%的標(biāo)簽都不是測(cè)試用的啦,所以一般也不設(shè)置)
2).標(biāo)簽大小
一共四個(gè)字節(jié),但每個(gè)字節(jié)只用7位,最高位不使用恒為0。所以格式如下
0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx
計(jì)算大小時(shí)要將0去掉,得到一個(gè)28位的二進(jìn)制數(shù),就是標(biāo)簽大小(不懂為什么要這樣做),計(jì)算公式如下:
int total_size;
total_size = (Size[0]&0x7F)*0x200000
+(Size[1]&0x7F)*0x400
+(Size[2]&0x7F)*0x80
+(Size[3]&0x7F)
2、標(biāo)簽幀
每個(gè)標(biāo)簽幀都有一個(gè)10個(gè)字節(jié)的幀頭和至少一個(gè)字節(jié)的不固定長度的內(nèi)容組成。它們也是順序存放在文件中,和標(biāo)簽頭和其他的標(biāo)簽幀也沒有特殊的字符分隔。得到一個(gè)完整的幀的內(nèi)容只有從幀頭中的到內(nèi)容大小后才能讀出,讀取時(shí)要注意大小,不要將其他幀的內(nèi)容或幀頭讀入。
幀頭的定義如下:
char FrameID[4]; /*用四個(gè)字符標(biāo)識(shí)一個(gè)幀,說明其內(nèi)容,稍后有常用的標(biāo)識(shí)對(duì)照表*/
char Size[4]; /*幀內(nèi)容的大小,不包括幀頭,不得小于1*/
char Flags[2]; /*存放標(biāo)志,只定義了6位,稍后詳細(xì)解說*/
1).幀標(biāo)識(shí)
用四個(gè)字符標(biāo)識(shí)一個(gè)幀,說明一個(gè)幀的內(nèi)容含義,常用的對(duì)照如下:
TIT2=標(biāo)題 表示內(nèi)容為這首歌的標(biāo)題,下同
TPE1=作者
TALB=專集
TRCK=音軌 格式:N/M 其中N為專集中的第N首,M為專集中共M首,N和M為ASCII碼表示的數(shù)字
TYER=年代 是用ASCII碼表示的數(shù)字
TCON=類型 直接用字符串表示
COMM=備注 格式:"eng\0備注內(nèi)容",其中eng表示備注所使用的自然語言
2).大小
這個(gè)可沒有標(biāo)簽頭的算法那么麻煩,每個(gè)字節(jié)的8位全用,格式如下
xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
算法如下:
int FSize;
FSize = Size[0]*0x100000000
+Size[1]*0x10000
+Size[2]*0x100
+Size[3];
3).標(biāo)志
只定義了6位,另外的10位為0,但大部分的情況下16位都為0就可以了。格式如下:
abc00000 ijk00000
a -- 標(biāo)簽保護(hù)標(biāo)志,設(shè)置時(shí)認(rèn)為此幀作廢
b -- 文件保護(hù)標(biāo)志,設(shè)置時(shí)認(rèn)為此幀作廢
c -- 只讀標(biāo)志,設(shè)置時(shí)認(rèn)為此幀不能修改(但我沒有找到一個(gè)軟件理會(huì)這個(gè)標(biāo)志)
i -- 壓縮標(biāo)志,設(shè)置時(shí)一個(gè)字節(jié)存放兩個(gè)BCD碼表示數(shù)字
j -- 加密標(biāo)志(沒有見過哪個(gè)MP3文件的標(biāo)簽用了加密)
k -- 組標(biāo)志,設(shè)置時(shí)說明此幀和其他的某幀是一組
值得一提的是winamp在保存和讀取幀內(nèi)容的時(shí)候會(huì)在內(nèi)容前面加個(gè)'\0',并把這個(gè)字節(jié)計(jì)算在幀內(nèi)容的大小中。
詳細(xì)的情況可以到
http://www.id3.org/查詢,對(duì)于ID3V1和ID3V2的讀寫,我用DELPHI寫了兩個(gè)類來實(shí)現(xiàn),可以寫信給我索取
q.d.zhang@sohu.com 附:幀標(biāo)識(shí)的含義
4). Declared ID3v2 frames
The following frames are declared in this draft.
AENC Audio encryption
APIC Attached picture
COMM Comments
COMR Commercial frame
ENCR Encryption method registration
EQUA Equalization
ETCO Event timing codes
GEOB General encapsulated object
GRID Group identification registration
IPLS Involved people list
LINK Linked information
MCDI Music CD identifier
MLLT MPEG location lookup table
OWNE Ownership frame
PRIV Private frame
PCNT Play counter
POPM Popularimeter
POSS Position synchronisation frame
RBUF Recommended buffer size
RVAD Relative volume adjustment
RVRB Reverb
SYLT Synchronized lyric/text
SYTC Synchronized tempo codes
TALB Album/Movie/Show title
TBPM BPM (beats per minute)
TCOM Composer
TCON Content type
TCOP Copyright message
TDAT Date
TDLY Playlist delay
TENC Encoded by
TEXT Lyricist/Text writer
TFLT File type
TIME Time
TIT1 Content group description
TIT2 Title/songname/content description
TIT3 Subtitle/Description refinement
TKEY Initial key
TLAN Language(s)
TLEN Length
TMED Media type
TOAL Original album/movie/show title
TOFN Original filename
TOLY Original lyricist(s)/text writer(s)
TOPE Original artist(s)/performer(s)
TORY Original release year
TOWN File owner/licensee
TPE1 Lead performer(s)/Soloist(s)
TPE2 Band/orchestra/accompaniment
TPE3 Conductor/performer refinement
TPE4 Interpreted, remixed, or otherwise modified by
TPOS Part of a set
TPUB Publisher
TRCK Track number/Position in set
TRDA Recording dates
TRSN Internet radio station name
TRSO Internet radio station owner
TSIZ Size
TSRC ISRC (international standard recording code)
TSSE Software/Hardware and settings used for encoding
TYER Year
TXXX User defined text information frame
UFID Unique file identifier
USER Terms of use
USLT Unsychronized lyric/text transcription
WCOM Commercial information
WCOP Copyright/Legal information
WOAF Official audio file webpage
WOAR Official artist/performer webpage
WOAS Official audio source webpage
WORS Official internet radio station homepage
WPAY Payment
WPUB Publishers official webpage
WXXX User defined URL link frame