文章目录:
- 1、求一个JAVA音乐播放器的源代码
- 2、VB编写能播放音频的程序。。。100分提供
- 3、如何写一个可以播放音乐的程序(用简单C语言编写,可以给出音频文件,只需要播放即可)
- 4、使用c++6.0,基于Socket开发网络音频点播程序。求源码!
- 5、直播小程序源码的开发原理?
- 6、求一C语言编写的 网络音乐播放器 类似于千千静听的源码
求一个JAVA音乐播放器的源代码
import javax.media.ControllerEvent;
import javax.media.ControllerListener;
import javax.media.EndOfMediaEvent;
import javax.media.PrefetchCompleteEvent;
import javax.media.RealizeCompleteEvent;
import javax.media.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class MediaPlayer extends JFrame implements ActionListener,
ItemListener, ControllerListener {
String title;
Player player;
boolean first = true, loop = false;
Component vc, cc;
String currentDirectory=null;
// 构造函数,其中包括了设置响应窗口事件的监听器。
MediaPlayer(String title) {
super(title);
/* 关闭按钮的实现。。 */
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
dispose();
}
public void windowClosed(WindowEvent e) {
if (player != null)
player.close();
System.exit(0);
}
});
// 调用程序菜单栏的方法成员完成菜单的布置
setupMenu();
setSize(400, 400);
setVisible(true);
}
// 本方法用以设置程序菜单栏
public void setupMenu() {
// 设置一个菜单
Menu f = new Menu("文件");
// 往设置的菜单添加菜单项
MenuItem mi = new MenuItem("打开");
f.add(mi);
mi.addActionListener(this);
f.addSeparator();
CheckboxMenuItem cbmi = new CheckboxMenuItem("循环", false);
cbmi.addActionListener(this);
f.add(cbmi);
f.addSeparator();
MenuItem ee = new MenuItem("退出");
ee.addActionListener(this);
f.add(ee);
f.addSeparator();
Menu l = new Menu("播放列表");
Menu c = new Menu("播放控制");
MenuItem move = new MenuItem("播放");
move.addActionListener(this);
c.add(move);
c.addSeparator();
MenuItem pause = new MenuItem("暂停");
pause.addActionListener(this);
c.add(pause);
c.addSeparator();
MenuItem stop = new MenuItem("停止");
stop.addActionListener(this);
c.add(stop);
c.addSeparator();
// 设置一个菜单栏
MenuBar mb = new MenuBar();
mb.add(f);
mb.add?;
mb.add(l);
// 将构造完成的菜单栏交给当前程序的窗口;
setMenuBar(mb);
}
// 动作时间响应成员;捕捉发送到本对象的各种事件;
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String cufile, selectfile, currentDirectory;
if (e.getActionCommand().equals("退出")) {
// 调用dispose以便执行windowClosed
dispose();
return;
}
// 此事表明拥护选择了“播放”命令;
// 如果当前有一个文件可以播放则执行播放命令;
if (e.getActionCommand().equals("播放")) {
if (player != null) {
player.start();
}
return;
}
// 如果当前正在播放某一文件,则执行暂停;
if (e.getActionCommand().equals("暂停")) {
if (player != null) {
player.stop();
}
return;
}
// 停止命令的响应;
if (e.getActionCommand().equals("停止")) {
if (player != null) {
player.stop();
player.setMediaTime(new Time(0));
}
return;
}
// 用户选择要播放的媒体文件
if (e.getActionCommand().equals("打开")) {
FileDialog fd = new FileDialog(this, "打开媒体文件", FileDialog.LOAD);
// fd.setDirectory(currentDirectory);
2008-2-6 02:46 回复
肆方茉莉
62位粉丝
6楼
fd.setVisible(true);
// 如果用户放弃选择文件,则返回
if (fd.getFile() == null) {
return;
}
// 保存了所选文件的名称及其路径名称已被稍后使用
// 同时设置当前文件夹路径
selectfile = fd.getFile();
currentDirectory = fd.getDirectory();
cufile = currentDirectory + selectfile;
// 将用户选择的文件作为一个菜单项加入播放列表,该菜单项名为该文件名;
// 被点击后给出的命令串是该文件的全路径名
MenuItem mi = new MenuItem(selectfile);
mi.setActionCommand(cufile);
MenuBar mb = getMenuBar();
Menu m = mb.getMenu(2);
mi.addActionListener(this);
m.add(mi);
} else {
// 程序逻辑运行到次表示用户选择了一个“播放列表”中的媒体文件
// 此时可以通过如下动作获得该文件的全路径名
cufile = e.getActionCommand();
selectfile = cufile;
}
// 如果存在一个播放器,则先将其关闭,稍后再重新创建
// 创建播放器时需要捕捉一些异常
if (player != null) {
player.close();
}
try {
player = Manager.createPlayer(new MediaLocator("file:" + cufile));
} catch (Exception e2) {
System.out.println(e2);
return;
}/*
* catch(NoPlayerException e2){ System.out.println("不能找到播放器");
* return ; }
*/
if (player == null) {
System.out.println("无法创建播放器");
return;
}
first = false;
setTitle(selectfile);
// 设置处理播放控制器实际的对象;
/**/
player.addControllerListener(this);
player.prefetch();
}
// 菜单状态改变事件的响应函数;
public void itemStateChanged(ItemEvent arg0) {
// TODO Auto-generated method stub
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new MediaPlayer("播放器");
}
// 调用绘图函数进行界面的绘制 // public void update() {
// }
// 绘图函数成员 //public void paint(Graphics g) {
// }
public void controllerUpdate(ControllerEvent e) {
// TODO Auto-generated method stub
Container tainer = getContentPane();
// 调用player.close()时ControllerClosedEvent事件出现
// 如果存在视觉部件,则该部件应该拆除(为了一致起见,我们对控制面版部件也执行同样的操作,下一次需要时再构造)
if (e instanceof ControllerClosedEvent) {
if (vc != null) {
remove(vc);
vc = null;
}
if (cc != null) {
remove(cc);
cc = null;
}
}
// 播放结束时,将播放指针置于文件之首,如果设定了循环播放,则再次启动播放器;
if (e instanceof EndOfMediaEvent) {
player.setMediaTime(new Time(0));
if (loop) {
player.start();
}
return;
}
// PrefetchCompletEvent事件发生后调用start,正式启动播放
if (e instanceof PrefetchCompleteEvent) {
player.start();
return;
}
// 本事件表示由于播放的资源已经确定;此时要将媒体的图形conmopnent
// 如果有显示出来,同时将播放器player的控制显示到窗口里;
if (e instanceof RealizeCompleteEvent) {
// 如果媒体中有图像,将对应图像component载入窗体;
vc = player.getVisualComponent();
if (vc != null)
tainer.add(vc, BorderLayout.CENTER);
// 将对应控制器component载入窗体;
cc = player.getControlPanelComponent();
cc.setBackground(Color.blue);
if (cc != null)
tainer.add(cc, BorderLayout.SOUTH);
// 有一些特殊媒体在播放时提供另外的控制手段,将控制器一并加入窗口;
/*
* gc=player.getGainControl(); gcc=gc.getControlComponent();
* if(gcc!=null) tainer.add(gcc,BorderLayout.NORTH);
*/
// 根据媒体文件中是否有图像,设定相应的窗口大小
if (vc != null) {
pack();
return;
} else {
setSize(300, 75);
setVisible(true);
return;
}
}
} }
VB编写能播放音频的程序。。。100分提供
我用vb编了一套播放器程序,有源代码,要的话发email我
frankkanks@yahoo.com.cn
下文为程序的参考资料(详)
MCI Command String总览
MCI Command String是多媒体设备的程序接口。通过它,我们可以打开一个多媒体文件,例如mp3,VCD文件,Mpeg4格式的文件等等,并对它进行播放,暂停,关闭等操作。现在小弟有幸给大家介绍一下MCI Command String的使用方法。
MCI Command String是通过mciExecute或mciSendString两个函数执行的。这两个函数的声明如下:
Private Declare Function mciExecute Lib "winmm.dll" Alias "mciExecute" (ByVal lpstrCommand As String) As Long
Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
这两个函数都有一个叫lpstrCommand的参数, 这个参数就是我们今天要介绍的MCI Command String。其中函数mciSendString还有三个参数,lpstrReturnString是一个字符串,它用来接收mciSendString函数返回的信息(例如,我们在lpstrCommand中的命令是让函数返回打开的文件的设备类型,那么函数就把设备类型的信息保存在这个参数中。);uReturnLength参数用来指定参数lpstrReturnString的长度;hwndCallback是接收”wait”、”notify”消息的窗口句柄,在Visual Basic中调用时该参数设为0即可。如果命令执行出错,函数mciExecute会直接弹出一个对话框,提示出错的原因。而mciSendString函数会返回一个ErrorCode (错误代码),该代码的具体含义您可以参考MSDN中的目录”Platform SDK\Graphics and Multimedia Services\Windows Multimedia\Multimedia Reference\Multimedia Constants\MCIERR Return Values”。您可以根据具体情况选择到底使用哪一个函数来执行MCI命令。例如,在调试的时候使用mciExecute,以便快速地获得错误原因,而在将要发布的程序中使用mciSendString函数,让程序中已设置的错误陷阱去处理错误,以避免频繁的错误提示而使用户觉得厌烦。
在熟悉了这两个函数后,我们就可以进入正题――MCI Command String了。
MCI Command String的命令格式是这样的:lpszCommand lpszDevice lpszCommandFlag lpazFlag
lpszCommand是mci命令,例如open,play,stop,close等等。
lpszDevice是设备名(或文件名)。例如,我们用以下的程序打开了我的文档中的Music01.dat文件,并用”alias”参数将其别名设为OpenFile:
Dim lReturn As long (1)
lReturn=mciExecute(“open C:\Mydocu~1\Music01.dat alias OpenFile type MPEGVideo”) (2)
那么,在以后的MCI Command String中lpszDevice参数必须指定为OpenFile。例如,关闭该文件的代码如下:
lReturn=mciExecute(“close OpenFile”) (3)
如果我们没有为打开的文件设定别名,则以后调用的MCI Command String中lpszDevice参数为DOS路径名加文件名。例子如下:
Dim lReturn As long(4)
lReturn=mciExecute(“open C:\Mydocu~1\Music01.dat type MPEGVideo”)(5)
lReturn=mciExecute(“close C:\Mydocu~1\Music01.dat type MPEGVideo”)(6)
从这里可以看出,设定别名的好处是减少了代码的输入。
LpszCommandFlag是mci命令的参数。如上代码(2),”alias OpenFile”以及”type MPEGVideo”就是命令”open”的参数。通常一个mci命令的参数少则几个多则几十个。LpazFlag可以为指定为”wait”或”notity”。如果为”wait”,那么mci命令执行完毕后会向父窗体发送MCI_WAIT消息,”notity”则发送MCI_NOTIFY消息。此参数在Visual Basic中无甚用处。
在此先声明一下,微软支持的多媒体设备的类型共有cdaudio,dat,digitalvideo,other,overlay,scanner,sequencer,vcr,videodisc,waveaudio十种(注意:微软不支持RealPlay格式的文件。您可以用以下代码获得已打开的文件的类型:lReturn=mciSendString(“capability lpszDevice device type”,sReturn,32,0) )。至于哪一类设备支持哪些参数,您可以在MSDN中查找关键字”MCI Command Strings”,选中所列出的命令,在其中的HTML帮助文档中通常会有一个表格告诉你哪些设备支持哪些参数或者在第一段中有信息告诉您哪些设备支持该命令。
好了,现在让我们对又繁索,又该死,又强大的mci命令参数作一个系统的介绍。(本文仅介绍open命令的常用参数,其它命令的参数有机会小弟再介绍给大家。)
open:
该命令用来打开一个多媒体文件。所有的设备都支持这个命令。在任何mci命令执行前,都必须先打开多媒体文件,以初始化设备。
该命令的几个参数意义如下:alias device_alias――指定欲打开文件的别名;shareable――是否以共享方式打开,如果不指定该参数,则以不共享的方式打开,也就是说,打开某一个多媒体文件后,其它程序不能再打开它,如果指定该参数,则以共享方式打开;type device_type――指定该文件在Windows中注册的多媒体文件名(注:Windows中注册的多媒体文件名与设备类型名并不相同,设备类型只有以上所说的十种类型,而Windows中注册的多媒体文件名请查看C:\Windows\win.ini文件的[mci extensions]小节。),如MPEGVideo,AVIVideo,waveaudio等,MPEGVideo、AVIVideo类型的文件其实都属于设备digitalvideo。
对于open命令,有几个须注意的方面。首先,用open命令打开一个文件时,文件的路径必须是DOS格式的短路径。您可以用API函数GetShortPathName返回某路径的该格式。对于参数type device_type,复合型设备的文件(如:MPEGVideo)mci设备会自动根据其在Windows中注册的扩展名 (要想获得某扩展名的文件在Windows中注册的类型名,请查看C:\Windows\win.ini文件的[mci extensions]小节。)设置该参数(所以对于C:\Windows\win.ini文件的[mci extensions]小节中已列的扩展名,不必指定该参数),但如果设备无法根据其扩展名获得文件的类型的话,就必须指定该参数,如果不指定则会提示:”这不是已注册的mci设备”,而简单型设备(如CD音轨设备,可编程控制的录放像机,可编程控制的镭射影碟机)则不必指定该参数。
如果该命令被成功执行,那么返回值为0。至此,您就可以用alias指定的别名执行各种各样的mci命令了。
Break:指定一个键来退出使用wait参数的当前mci命令。
Capability:获得已打开的设备的功能,比如能否播放,能否退出,能否记录等等。
Capture:将帧缓冲的数据拷贝到指定的文件中。
Close:关闭设备,释放内存。
Configure:显示一对话框,以设置设备的某些属性。
Copy:将数据拷贝至剪切板。
Cue:在播放或记录之前执行该命令可以加快播放或记录速度。
Cut:将工作区的数据剪切到剪切板。
Delete:从已打开的多媒体文件中删除数据段。
Freeze:终止视频输入或输出,禁止视频流从帧缓冲中获得数据。
Info:获得设备信息,例如算法,版权,所打开的文件,UPC等等。
List:返回视频和音频的数量和类型。
Load:用设备指定的格式打开一个文件。类似于open的功能。
Monitor:指定当前源,默认的当前源是当前工作区。
Paste:将剪切板的内容拷贝至工作区。
Pause:暂停播放或记录。
Play:呵呵,这个命令无须多说。
Put:决定显示源和显示目的窗口的区域。
Quality:自定义音频或视频的quality level和静态图像的压缩方式(例如BMP、JPG)。
Realize:自定义图像显示窗口的调色板。
Record:无须多说。
Reserve:为设备的工作区分配连续的磁盘空间。
Restore:将一静态图像从文件拷贝到帧缓冲中。
Resume:继续播放或记录。
Save:保存一个mci文件。
Seek:定位到指定的帧位置并等待。
Set:设置某些参数。(例如左声道,光驱开关,Time Format等等。)
Setaudio:设置音频参数。(例如低音,高音,左右声道)
Setvideo:设置视频回放或捕捉的参数。(例如亮度、对比度、伽马值等。)
Status:返回已打开的设备的状态信息。
Step:设置慢放时步进的帧数,负数即倒放,单位为帧/秒。
Stop:无须多说。
Undo:撤消最近一次copy、cut、delete和paste命令。
Unfreeze:Freeze的反操作。
Update:读取当前帧的数据,并显示在目标窗口或目标DC(设备场景)。
Where:获得Put命令指定的源或目标显示区域。
Window:设置播放的窗口。可以用它把播放窗口设置为其它窗口,取消默认的窗口。
channels channel_count:设置播放或记录的频道
clock time:将外部时间设为变量”time”。该变量为一无符号长整形数值
counter format:设置计数器格式
counter value:将VCR计数器设为指定的值
door closed:收回光盘托盘
door open:退出光盘
file format format:指定”save”或”capture”命令使用的时间格式。如果省略,则设备默认的格式会被使用。如果指定了一个与当前算法和”quality”相冲突的文件格式,则会使用默认的文件格式。以下都是以定义的文件格式:
avi:AVI格式;avss:AVSS格式;dib:DIB格式;jfif:JFIF格式;jpeg:JPEG格式;mpeg:MPEG格式;rdib:RLE DIB格式;rjpeg:RJPEG格式
format tag pcm:设置播放或记录的格式为PCM,文件即以该格式保存
format tag tag:设置播放或记录的格式,文件即以该格式保存
index timecode
index counter
index date
index time:设置VCR的当前显示
input integer:设置音频输入的频道
length duration:设置用户指定的VCR磁带长度
master midi:设置MIDI sequencer为同步源,同步数据以MIDI格式发送
master none:禁止MIDI sequencer发送同步数据
master smpte:设置MIDI sequencer为同步源,同步数据以SMPTE(Society of Motion Picture and Television Engineers电影与电视工程师协会)格式发送
offset time:设置SMPTE偏移。变量”time”的格式为:hh:mm:ss:ff;hh是小时,mm是分钟,ss是秒,ff是帧
output integer:设置音频输出的频道
pause timeout:设置”pause”命令的最大持续时间,单位为毫秒。0表示没有暂停
postroll duration duration:以当前时间格式设置执行一个”stop”或”pause”命令时用来中断VCR传输的时间长度
port mapper:将MIDI印射设置为接收MIDI消息的端口
port none:取消MIDI消息传送
port port_number: 将MIDI端口设置为接收MIDI消息
power on
power off:打开、关闭一个设备的电源
preroll duration duration:以当前时间格式设置用来稳定VCR输出的长度
record format SP
record format LP
record format EP:设置VCR记录模式,SP:正常播放;EP:外部播放;LP长播放
samplespersec integer:设置播放或记录的取样速度,文件即以该格式保存
seek exactly on
seek exactly off:设置两种定位模式。”seek exactly on”是指定位到指定的那一帧。”seek exactly off”是指定位到与指定帧最接近的关键帧。
slave file:设置MIDI sequencer使用文件数据作为同步源,这是默认设置
slave midi:设置MIDI sequencer使用输入的MIDI数据作为同步源。sequencer以MIDI格式识别数据
slave none:设置MIDI sequencer忽略同步源数据
slave smpte:设置MIDI sequencer使用输入的MIDI数据作为同步源。sequencer以SMPTE格式识别数据
speed factor:设置工作区音频视频回放的速度。”factor”为一比例值:1000表示正常速度播放,500表示以正常速度一半播放,2000表示以正常速度2倍播放。为0时表示在不丢音视频帧的情况下尽可能地快放
still file format format:设置”capture”命令使用的文件格式
tempo tempo_value:设置sequence速度,以当前时间格式
time format btyes:在PCM格式文件中,设置时间格式为bytes。所有的位置信息都将表示为bytes值
time format frames:设置时间格式为帧
time format hms:设置时间格式为小时,分钟,秒
time format milliseconds:设置时间格式为毫秒
time format msf:设置时间格式为分钟,秒,帧。其表示为:mm:ss:ff。mm为分钟,ss为秒,ff为帧
time format samples:设置时间格式为取样频率
time format smpte24
time format smpte25
time format smpte30:设置时间格式为SMPTE帧速度
time format smpte 30 drop:设置时间格式为SMPTE30降速(?)
time format song pointer:设置时间格式为歌曲指针
time format tmsf:设置时间格式为磁道、分钟、秒、帧形式。其表示为:tt:mm:ss:ff。tt为磁道,mm为分钟,ss为秒,ff为帧
time format track:设置位置格式为磁道
time mode counter:设置位置信息模式为使用VCR计数器
time mode detect:设置位置信息模式为基于探测磁带时间代码信息的格式
time mode timecode:设置磁带的位置信息模式为使用时间代码信息的格式
video off
video on:关闭、打开视频
Setaudio:设置音频参数(例如低音,高音,左右声道)。digital-video和VCR支持该命令。
algorithm algorithm:选择一个指定的音频压缩算法。该算法将用在”reserve”和”record”命令中。MCI定义”algorithm”为:”g711”“g721”“g722”“g728”“pcm”“cdxa”“adpcm”“adpcm4e”
alignment to integer:设置与waveform-audio设备的输入数据起始部份有关的数据块队列
bass to factor:设置音频低音值
bitspersample to bit_count:设置记录时每次取样的bit数量
bytespersec to integer:设置每秒记录的平均byte数量
clocktime:指定在”over”参数中使用的时间单位为毫秒
input:激活”bass”“treble”“volume”参数的设置。使之影响播放和记录信号。这是默认设置
left off
left on:关闭、打开左声道
left volume to factor:设置左声道的音量
monitor to type number number:控制哪个输入源会传递到VCR的输出而不改变记录源的选择。”type”可以是”output”或其它有效的输入源。如果”number”没有指定,则第一个此类型的输入会被选择
off
on:关闭、打开音频
output:激活”bass”“treble”“volume”参数的设置。使之影响播放信号,并不影响记录信号
over duration:指定如果使用”factor”变量的参数有所改变,将花多长时间。”duration”为当前时间格式,如果不指定该参数,参数变化会立即执行
quality descriptor:指定音频记录到一个文件时压缩的特征。所有设备都支持”low”“medium”“high”
record off:清除音频源选择,接下来的”record”命令不会记录音频数据
record on:打开音频数据记录选择。这是默认项
record track track_number off:清除”track_number”指定的音频源选择,接下来的”record”命令不会记录该音频数据
record track track_number on:打开”track_number”指定的音频源选择
right off
right on:关闭、打开音频右声道输出
right volume to factor:设置右声道的音量
samplespersec to integer:在”pcm”或”adpcm”算法下记录的取样频率,文件即以该格式保存
source to sourcename:设置音频输入源。”sourcename”可以”left”“right”“average”“stereo”,分别意为左,右,平均,立体声
source to type number number:选择将记录在磁带上的音频源。”type”必须”tuner”“line”“svideo”“aux”“generic”“mute”
stream to number:指定工作区回放的音频流。如果该参数没有指定,而且文件也没有定义一个默认值,则音频驱动器物理上第一遇到的音频流会被播放
track track_number off:关闭指定磁道
track track_number on:打开指定磁道
treble to factor:设置高音值
volume to factor:设置左右声道音量
据本人的经验,低音值,高音值,及音量在0至1000之间取值。关于音频还有一个重要的方面容易让人迷惑:有些朋友期望将左(右)声道关闭来禁止左(右)声道的声音,但这种结果是剩下的声道仍有些未被关闭的声道的声音。这是因为默认的音频源总是立体声的,而立体声即是在左(右)声道中掺入轻微的右(左)声道的声音,以达到立体效果。要想完全禁止某一声道的声音,请使用”source to sourcename”参数。
Setvideo:设置视频回放或捕捉的参数(例如亮度、对比度、伽马值等。)。digital-video设备支持该命令。
algorithm algorithm:指定下一个”reserve”或”record”命令使用的视频压缩算法。MCI已定义的有:”mpeg”“h261”,如果指定的算法与当前的文件格式冲突,则会使用文件默认的算法
bitsperpel to count:设置用”capture”或”record”保存数据时每像素bit数量
brightness to factor:设置视频亮度
clocktime:指定”over”参数使用的时间单位为毫秒
color to factor:设置视频饱和度(色彩)
contrast to factor:设置视频对比度
gamma to value:设置伽马修正值。”value”为2200表示伽马值为2.2,1000表示不做伽马修正,
halftone:使用halftone调色板代替默认的调色板
input:激活”brightness”“color”“contrast”“gamma”“sharpness”“tint”参数设置,使之影响输入信号和记录信号
key color to r:g:b:设置”key color”为一RGB值
key index to index:设置”key index”。”index”必须为一物理调色板的索引
monitor to type number number:控制哪个输入源会传递到VCR的输出而不改变记录源的选择。”type”
number of marks:返回最大的遮罩数量,0表示不支持遮罩
ouputs:返回输出设备的总数
seek accuracy:返回定位某帧的精确度,0表示精确定位,1表示与所要定位的帧的误差不大于1帧
slow play rate:返回慢放的播放速度,单位为帧每秒
uses files:如果复合设备使用的数据保存在文件中则返回真
uses palettes:如果设备使用调色板则返回真
windows:返回设备支持的可以同时显示的窗口数量
Capture:将帧缓冲的数据拷贝到指定的文件中。digital-video支持该命令。
at pathname:指定所捕捉的帧缓冲中的图像所要保存的路径和文件名
at rectangle:指定所捕捉的帧缓冲中的图像区域,默认为put命令的source参数指定的区域
注意:该命令可能会在播放的时候或者在需要资源的操作中失效。如果帧缓冲在实时地更新,则会暂停。
Close:关闭设备,释放内存。当一个MCI设备的所有实例或文件都关闭的时候,该MCI设备被卸载。所有设备支持该命令。
注意:如果要关闭所有的设备需如此:close all
Configure:显示一对话框,以设置设备的某些属性。digital-video支持该命令。
Copy:将数据拷贝至剪切板。digital-video支持该命令。
at rectangle:指定要拷贝的帧缓冲的区域,默认为整个帧缓冲
audio stream stream:指定该命令影响的当前工作组的音频流,如果使用了该参数,又想拷贝视频流,则必须指定”video stream”参数,默认为audio stream+video stream
from position:指定开始记录点,默认为当前位置
to position:指定终点,该位置的视音频流不被记录,默认为当前工作组的终点
video stream stream:指定该命令影响的工作组中的视频流,如果使用了该参数,又想拷贝音频流,则必须指定”audio stream”参数
Cue:在播放或记录之前执行该命令可以加快播放或记录速度。digital-video,VCR和waveform-audio支持该命令。
from position:指定起始点
input:准备记录。digital-video可以省略
noshow:准备播放,但不先显示。
output:准备播放,如果input和output都没指定,默认为output
preroll:预滚动到下一位置
reverse:指定为倒放
to position:指定终点
注意:如果设备正在播放、记录或暂停则该命令会失败。使用了”output”参数时,再使用”play”命令的”from”、”to”或”reverse”参数则会退出该命令,使用了”input”参数时,再使用”record”命令的”from”、”to”或”initialize”参数会退出该命令。
Cut:将工作区的数据剪切到剪切板。digital-video支持该命令。
at rectangle:指定每一帧的区域。默认为整个帧。当该参数被指定时,帧并不被删除,代替原图像信息的为黑色块
audio stream stream:指定该命令影响的当前工作组的指定音频流,如果使用了该参数,又想剪切视频流,则必须指定”video stream”参数,默认为audio stream+video stream
from position:指定开始剪切点,默认为当前位置
to position:指定终点,终点并不被剪切,默认为工作组终点
video stream stream:指定该命令影响的当前工作组的指定视频流,如果使用了该参数,又想剪切音频流,则必须指定”video stream”参数,默认为audio stream+video stream
注意:在没有调用”save”命令前,虽然播放的时候好像”cut”命令已经成功了,但只有当”save”命令被调用后该命令所作的删除才会被写入文件
Delete:从已打开的多媒体文件中删除数据段。digital-video和waveform-audio支持该命令。
at rectangle:指定每帧删除的区域。默认为整个帧。当该参数被指定时,帧并不被删除,代替原图像信息的为黑色块
audio stream stream:指定该命令影响的当前工作组的音频流。如果使用了该参数,又想删除视频流,则必须指定”video stream”参数,默认为audio stream+video stream
from position:指定开始位置,默认为当前位置
to position:指定终点,默认为工作组终点
video stream stream:指定该命令影响的当前工作组的视频流,如果使用了该参数,又想删除音频流,则必须指定”video stream”参数,默认为audio stream+video stream
注意:在执行任何使用position参数的命令前,你可以使用”set”命令的”time format”参数来设定媒体的时间格式,如毫秒,帧等
Escape:将设备指定的信息传送到某设备。videodisc设备支持该命令。
Freeze:终止视频输入或输出,禁止视频流从帧缓冲中获得数据。dgital-video、video-overlay和VCR支持该命令。
at rectangle:指定区域。对于digital-video设备,在指定区域中的像素会遮罩覆盖。rectangle的格式为X1 Y1 X2 Y2。X1 Y1为左上角坐标,X2 Y2指定宽度和长度
field:冻结指定的区域,该参数为默认的
frame:冻结整个帧
input:冻结输入图像的当前帧,不管当前正在播放还是暂停
output:冻结VCR的当前帧输出。如果VCR在播放的时候执行该命令,则当前帧被冻结且VCR被暂停。如果VCE已暂停则当前帧被冻结。如果input和output都没指定,则默认为output
outside:指定被冻结的为”at”参数所定义的区域外面部分
注意:要指定一个不规则区域,可以组合使用freeze和unfreeze命令。一些video-overlay设备会限制区域的复杂度
index:控制VCR设备实屏显示。仅VCR设备支持
off:关闭实屏显示
on:打开实屏显示。显示的项目为”set”命令的”index”参数指定的信息
Info:获得设备信息,例如算法,版权,所打开的文件,UPC等等。所有MCI设备都支持该命令。
audio algorithm:返回当前音频压缩算法的名称
audio quality;返回当前音频压缩质量的描述。如果将其quality设为某一值而未使用其指定值可能会返回unknown
copyright:返回MIDI文件的版权信息
file:返回复合设备使用的文件名。如果设备没有打开一个文件而且”load”命令也没被用过,那么返回一个空字符串
info identity:为CD产生一个唯一的序列号
info upc:产生CD的UPC(Universal product Code全球产品码)
input:返回当前输入设备的描述
name:返回sequence名字
output:返回当前输出设备的描述
product:返回该设备的描述。返回信息经常包括产品名称和型号。返回信息经常是31个字节或更小
still algorithm:返回当前静态图像压缩算法名称
still quality:返回当前静态图像压缩质量描述名。如果将其quality设为某一值而未使用其指定值可能会返回unknown
usage:返回工作组中视音频数据的使用限制描述
version:返回设备驱动或硬件的版本
video algorithm:返回当前视频压缩算法名称
video quality:返回当前视频压缩质量描述名如果将其quality设为某一值而未使用其指定值可能会返回unknown
window text:返回设备使用的窗口的标题
List:返回视频和音频的数量和类型。digital-video和VCR支持该命令。
audio algorithm:返回音频压缩算法名称
audio quality algorithm algorithm:返回”algorithm”指定的压缩质量级别。如果”algorit
如何写一个可以播放音乐的程序(用简单C语言编写,可以给出音频文件,只需要播放即可)
用VC++编译通过,代码如下(其中a.wav为自己给出):
#includewindows.h
#pragma comment(lib,"winmm.lib")
void main()
{
PlaySound("C:\\a.wav",0,SND_FILENAME|SND_SYNC);
}
使用c++6.0,基于Socket开发网络音频点播程序。求源码!
“对图中的那些函数,我这里稍加解释一下。” int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData); 功能是初始化Windows Socket Dll,在Windows下必须使用它。参数:“wVersionRequested”表示版本,可以是1.1、2.2等;“lpWSAData”指向WSADATA数据结构的指针。int socket(int family, int type, int protocol); 功能是建立Socket,返回以后会用到的Socket值。如果错误,返回-1。参数:“int family”参数指定所要使用的通信协议,取以下几个值:AF_UNIX(Unix内部协议)、AF_INET(Internet协议)、AF_NS Xerox(NS协议)、AF_IMPLINK(IMP连接层),在Windows下只能把“AF”设为“AF_INET”;“int type”参数指定套接字的类型,取以下几个值:SOCK_STREAM(流套接字)、SOCK_DGRAM (数据报套接字)、SOCK_RAW(未加工套接字)、SOCK_SEQPACKET(顺序包套接字);“int protocol”参数通常设置为0。int bind(int sockfd, struct sockaddr *my_addr, int addrlen); 功能是把套接字和机器上一定的端口关联起来。参数:“sockfd”是调用socket()返回的套接字值;“my_addr”是指向数据结构struct sockaddr的指针,它保存你的地址,即端口和IP地址信息;“addrlen”设置为sizeof(struct sockaddr)。 int listen(int sockfd, int backlog); 功能是服务端监听一个端口,直到accept()。在发生错误时返回-1。参数:“sockfd”是调用socket()返回的套接字值;“backlog”是允许的连接数目。大多数系统的允许数目是20,也可以设置为5到10。 int connect(int sockfd, struct sockaddr *serv_addr, int addrlen); 功能是客户端连接服务端监听的端口。参数:“sockfd”是调用socket()返回的套接字值;“serv_addr”保存着目的地端口和IP 地址的数据结构struct sockaddr;“addrlen”设置为sizeof(struct sockaddr)。 int accept(int sockfd, void *addr, int *addrlen); 功能是服务端接受客户端的连接请求,并返回一个新的套接字,以后服务端的数据传输就使用这个新的套接字。如果有错误,返回-1。参数:“sockfd”是和listen()中一样的套接字值;“addr”是个指向局部的数据结构sockaddr_in的指针;“addrlen”设置为sizeof(struct sockaddr_in)。int send(int sockfd, const void *msg, int len, int flags);int recv(int sockfd, void *buf, int len, unsigned int flags);功能是用于流式套接字或数据报套接字的通讯,我们数据的真正传输就由它们完成。参数:“sockfd”是发/收数据的套接字值;“msg”指向你想发送的数据的指针;“buf”是指向接收数据存放的地址;“len”是数据的长度;“flags”设置为 0。int sendto(int sockfd, const void *msg, int len, unsigned int flags,const struct sockaddr *to, int tolen);int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int *fromlen);功能和send、recv类似,不过是用于无连接数据报套接字的传输。 int closesocket(int sockfd) 功能是关闭套接字。参数“sockfd”为要关闭的套接字值。程序:“这里的目的是让大家对Socket编程有个整体了解。不用怕,程序我会详细解释的,首先是服务端的程序。其流程是: socket()→bind()→listen→accept()→recv()/send()→closesocket() 具体代码如下:”★#include #include #pragma comment(lib,"Ws2_32")#define MYPORT 830 /*定义用户连接端口*/ #define BACKLOG 10 /*多少等待连接控制*/ int main() { int sockfd, new_fd; /*定义套接字*/ struct sockaddr_in my_addr; /*本地地址信息 */ struct sockaddr_in their_addr; /*连接者地址信息*/ int sin_size; WSADATA ws; WSAStartup(MAKEWORD(2,2),ws); //初始化Windows Socket Dll //建立socket if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { //如果建立socket失败,退出程序 printf("socket error\n"); exit(1); } //bind本机的MYPORT端口 my_addr.sin_family = AF_INET; /* 协议类型是INET */ my_addr.sin_port = htons(MYPORT); /* 绑定MYPORT端口*/ my_addr.sin_addr.s_addr = INADDR_ANY; /* 本机IP*/ if (bind(sockfd, (struct sockaddr *)my_addr, sizeof(struct sockaddr))== -1) { //bind失败,退出程序 printf("bind error\n"); closesocket(sockfd); exit(1); } //listen,监听端口 if (listen(sockfd, BACKLOG) == -1) { //listen失败,退出程序 printf("listen error\n"); closesocket(sockfd); exit(1); } printf("listen"); //等待客户端连接 sin_size = sizeof(struct sockaddr_in); if ((new_fd = accept(sockfd, (struct sockaddr *)their_addr, sin_size)) == -1) { printf("accept error\n"); closesocket(sockfd); exit(1); } printf("\naccept!\n"); //有连接,发送ww0830字符串过去 if (send(new_fd, "ww0830\n", 14, 0) == -1) { printf("send error"); closesocket(sockfd); closesocket(new_fd); exit(1); } printf("send ok!\n"); //成功,关闭套接字 closesocket(sockfd); closesocket(new_fd); return 0;}对服务端程序的流程概括:先是初始化Windows Socket Dll: WSAStartup(MAKEWORD(2,2),ws); 然后建立Socket: sockfd = socket(AF_INET, SOCK_STREAM, 0) 再bind本机的MYPORT端口:my_addr.sin_family = AF_INET; /* 协议类型是INET */ my_addr.sin_port = htons(MYPORT); /* 绑定MYPORT端口 */ my_addr.sin_addr.s_addr = INADDR_ANY; /* 本机IP */ bind(sockfd, (struct sockaddr *)my_addr, sizeof(struct sockaddr)) 接下来监听端口: listen(sockfd, BACKLOG) 如果有客户端的连接请求,接收它: new_fd = accept(sockfd, (struct sockaddr *)their_addr, sin_size) 最后发送ww0830字符串过去: send(new_fd, "ww0830\n", 14, 0) 收尾工作,关闭socket: closesocket(sockfd); closesocket(new_fd); ”编译、执行,就会一直监听830端口客户端程序了。其流程是: socket()→connect()→send()/recv()→closesocket() 比服务端更简单吧!其实现代码如下:”★#include #include #include #pragma comment(lib,"Ws2_32") #define PORT 830 /* 客户机连接远程主机的端口 */ #define MAXDATASIZE 100 /* 每次可以接收的最大字节 */ int main(int argc, char *argv[]) { int sockfd, numbytes; char buf[MAXDATASIZE]; struct sockaddr_in their_addr; /* 对方的地址端口信息 */ if (argc != 2) { //需要有服务端ip参数 fprintf(stderr,"usage: client hostname\n"); exit(1); } WSADATA ws;WSAStartup(MAKEWORD(2,2),ws); //初始化Windows Socket Dll if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){ //如果建立socket失败,退出程序 printf("socket error\n"); exit(1); } //连接对方their_addr.sin_family = AF_INET; /* 协议类型是INET */ their_addr.sin_port = htons(PORT); /* 连接对方PORT端口 */ their_addr.sin_addr.s_addr = inet_addr(argv[1]); /* 连接对方的IP */ if (connect(sockfd, (struct sockaddr *)their_addr,sizeof(struct sockaddr)) == -1){ //如果连接失败,退出程序 printf("connet error\n"); closesocket(sockfd); exit(1); } //接收数据,并打印出来if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1) { //接收数据失败,退出程序 printf("recv error\n"); closesocket(sockfd); exit(1); } buf[numbytes] = '\0'; printf("Received: %s",buf); closesocket(sockfd); return 0; } 对客户端程序的流程概括:首先是初始化Windows Socket Dll: WSAStartup(MAKEWORD(2,2),ws); 然后建立Socket: sockfd = socket(AF_INET, SOCK_STREAM, 0) 接着连接服务器方:their_addr.sin_family = AF_INET; /* 协议类型是INET */ their_addr.sin_port = htons(PORT); /* 连接对方PORT端口 */ their_addr.sin_addr.s_addr = inet_addr(argv[1]); /* 连接对方的IP */ connect(sockfd, (struct sockaddr *)their_addr,sizeof(struct sockaddr)) 连接成功就接收数据: recv(sockfd, buf, MAXDATASIZE, 0) 最后把收到的数据打印出来并关闭套接字: printf("Received: %s",buf); closesocket(sockfd); 编译结束后,运行服务端,然后。客户端 服务端IP 回车你会看到服务端发来得数据。那么基本的点对点通信就没问题了。只要两台机器同时包含服务端和客户端,就可以互相通信了。当然,你也可以将服务端和客户端分开做,专门一个服务器负责用户登录和转发消息。流程如下:A客户端发登录消息-----》服务器服务器验证发送用户消息----》客户端A客户端想发消息给B客户端----》先发给服务端服务器得到消息查询B客户端IP并转发消息。(或者B客户端循环发消息询问服务器有无消息)通信结束。
直播小程序源码的开发原理?
主播端使用 live-pusher ,它在微信小程序的内部是一个推流引擎,它负责对手机摄像头和麦克风的数据进行采集和编码,并通过 url 参数指定的 rtmp 推流地址上传到云端。
云端的作用类似信号放大器,它负责将来自主播端的一路音视频流数据进行放大,将数据实时并且无差异的负责并扩散到全国各地。观众端使用 live-player 进行播放,它在小程序的内部是一个在线播放器,负责从云端实时拉取音视频数据并进行解码和渲染。
求一C语言编写的 网络音乐播放器 类似于千千静听的源码
下载地址
1.
2.
一、常规问题
问:Unicode和Ansi版本是怎么回事,用一个更好?
Unicode是统一字符编码方式,Unicode版本的程序只能运行在NT/2000/XP/2003等新的Windows上,可以解决不同语言的显示问题,并且由于Unicode在这些系统上有更好的性能,所以当处理大量列表的时候也有很大的帮助。
千千静听内部处理字符串时(例如处理标签或列表时),大量使用系统默认的16位Unicode(即使是Ansi版本也一样,只是显示的时候才转换成Ansi),可以最大限度的提高处理的性能。
问:我是繁体XP(2000)的用户,可以使用千千静听吗?
可以,千千静听已经支持unicode,可以在非简体中文的Windows 2000/XP下使用,千千静听的界面不会出现乱码,但某些只包含ID3v1标签的MP3文件可能是显示乱码,可以尝试用“文件信息”里的内码转换功能来找到正确的内码。千千静听还提供了繁体和简体之间的标签和歌词转换。
问:安装新版本的时候,需要先删除以前的版本吗?
不用,直接覆盖安装就行了,千千静听可以兼容以前的参数设置,但某些功能可能因为升级而发生变化,绝大多数设置将继续有效。
问:为什么我的电脑上没有淡入淡出窗口的效果?
淡入淡出窗口以及半透明窗口效果都需要Windows2000或以上的操作系统才能支持。
问:我的窗口不小心拖动屏幕外面了,怎么办?
在Windows的系统栏(屏幕右下角的系统时间那里)右键点击主菜单,选“查看窗口”下面的“重新排列”,这个对普通模式和迷你模式都有效。
问:我想把千千支持的文件格式默认用千千来打开,怎么样最方便?
千千选项的最后一页“系统关联”,可以在你想要关联的某个格式,或某一类格式上打上勾,并且为这种或这一类格式指定一个文件类型图标,考虑到不同用户有不同的喜好,千千只提供图标自定义的功能,而不提供任何很多默认的图标。
问:为什么千千静听的皮肤这么少?
作者本人不擅长美工,又找不到专业人士帮助千千(因为千千免费)。其实千千静听的皮肤格式是比较简单的,是基于XML格式的用ZIP压缩一下而已,有兴趣的网友可以自己把皮肤文件改为.zip后缀后解开来看看,具体请看主页上皮肤 这一页。
问:为什么千千静听不支持Winamp的皮肤呢?
由于播放器的功能不相同,皮肤的设计和实现也不相同,很多千千静听需要的皮肤的元素Winamp的皮肤里都没有,例如千千静听需要歌词秀窗口,但Winamp本身就没有这个窗口的皮肤。论坛上有不少网友从winamp改造过来的皮肤,有兴趣不妨去看一下。
--------------------------------------------------------------------------------
二、播放
问:为什么在Win98下不支持播放CD?
Win98没有自带数字CD读取所需的驱动,可以到主页上去下载这个通用的驱动程序,地址是:
问:为什么我正在播放CD的时候,就不能转压CD为其它格式了?
因为Windows下以数字方式访问CD是独占的,所以同时只能由一个任何来访问CD。如果你想转压,请先停止播放。
问:千千有没有能自动在线查询到CD信息的功能?
4.3以后的版本,提供了freedb的在线查询CD信息的功能,但非正版的CD很可能找不到 。
问:为什么我用Windows Media Player制作的WMA文件无法播放?
Window Media Player在制作WMA文件时默认启用了"数字版权保护"机制,而要支持这种文件,必须得到微软的官方支持,考虑到手续比较麻烦所以目前还未实现对它的支持。所以在制作WMA文件的时候请尽量不要使用数字版权保护。
问:回放增益(自动音量)是怎么回事,应该如何使用?
"回放增益信息"是通过对音频文件的扫描分析检测到的一个最佳的增益值, 在以后的播放中如果使用这个增益值就可以把音频文件的音量调整到最佳的水平,从而减少甚至避免不同音频文件之间的音量差异.
可以通过手动扫描或自动扫描来得到这个信息,手动扫描就是在播放列表上右键某些文件,通过“扫描增益信息”来得到,或者选中千千选项的“播放”页中的“自动扫描”,这样在播放的同时,就会自动扫描没有这个信息的文件(如果已存在就不会再扫描),但要注意的是,如果播放被中断或用户拖动了播放进度,扫描就会停止,只有完整的播放一遍之后才能得出这个信息。
问:为什么我启用了回放增益以后,有些歌的音量不正常?
增益信息是以文件标签的形式保存在文件中的,可能是增益信息别的软件破坏了,所以导致音量不正常,这时,你需要手动重新扫描一下。
问:千千支持哪些音频输出方式?
千千支持Waveout(波形输出),DirectSound,Kernel Streaming(内核音频流),ASIO这四种方式,但在不同的系统和声卡环境下,并不是每一种都能支持的,特别是ASIO,更需要声卡本身的支持,一般只有比较高档的声卡才能支持。
问:这些音频输出方式各有什么特点?
Waveout是微软最早提出的音频流输出方式,所以它的兼容性也就好,几乎所有的声卡都支持;
DirectSound是微软DirectX的一个组合部分,它的兼容性也很不错,并且在有多个程序需要播放音频的时候能提供高可靠的保障,并且使用这种方式可以让千千静听更好的支持声音的淡入淡出效果;
Kernel Streaming是微软底层使用的音频流方式,具体更低的延时性,用于对延时性要求比较高的场和,因为更底层,所以效率更高,而且受别的程序的影响也更小,如果你用它来播放时,把系统音量里的波型“静音”,就可以实现只听到播放器的音乐,而不受其它程序的声音的影响。但Kernel Streaming同样对声卡和驱动有一定的要求。
ASIO是Steinberg提出来的比较新的音频流输入输出接口,一般用在对实时性要求很高的专业场合,对声卡的要求更高。
理论上来说,这四种方式对输出的音质没有任何影响,因为这些方式只是把声音的数字信号传输到声卡的数模转换器(D/A),而不会对信息有任何的改变。
问:像AxASIO之类的软件能让声卡不支持ASIO的电脑也使用ASIO,有什么好处吗?
AxASIO或ASIO Kernel-Streaming Driver之类的软件,都是在Kernel Streaming的基础上模拟出来的ASIO,所以效果反而没有直接用Kernel Streaming好,而且设备不当的话还影响正常的播放。
问:千千使用的MP3解码器是哪一个?
千千使用的是最新版本的mpg123-0.59s-pre,它是目前已经的开放源代码中最好的MP3解码器之一,无论是精度来是速度都是很出色的。千千早期版本使用的是MAD,但在个人PC上,MAD的解码速度比mpg123要慢70%甚至更多,而绝对精确和mpg123相比还略有差距,所以后来就改用mpg123了。
问:是不是把播放时的缓冲长度设得越高播放越流畅?
一般来说,只要设置1000-2000毫秒的长度就可以了,太长只会增加资源占用。
问:播放时的输出比特是越高越好吗?
不是,目前几乎所有的音频源都来自16比特的CD,而且一般的声卡只支持16比特的输出,所以基本上选用16比特就可以满足绝大多数的要求了,千千的“原始比特”就是指音频本身的比特数,因为碰到有些24比特的WMA,千千就会自动选择24比特输出。
要注意的是,很多支持ASIO的声卡,最佳的输出比特数是32或24,所以这时选择相对应的比特数就能提供最佳的性能(因为不需要再做额外的转换)。
问:采样频率转换一般用在什么场合?
对于AC’97规范的声卡(主板自带的基本上都是这类声卡),硬件只支持48000Hz这一种采样频率,而CD的音频是44100Hz的,从CD转换过来的MP3等大多部格式也是44100Hz的,也就是说在这种类型的声卡上,在数字信号转成模拟信号之前,还要对采样频率做一次转换,如果驱动程序提供的转换程序不是很好(据说为了提高性能,都采用比较一般的算法),就可以尝试用播放器提供的软件转换功能。但用于这类声卡来说,本身的输出音质就不是很理想,所以用不用更好的转换算法意义并不大,而且由于软件转换需要CPU做更多的事情,性能肯定受到影响。
问:高频抖动又是什么意思?
一般的音频编解码器,都是用高比特来处理16比特的音源的,在最终播放输出的时候,又得把高比特降低到16比特来输出(因为一般的声卡只支持16比特的输出),所以就会有量化的副作用,就好比把一幅真彩的图片转成256色,如果转换的程序不好,就会有大块的很难看的色块出现,于是就产生了一种抖动的技术,就是采用插值算法,在转换前用一些随机的噪声来处理一下,以减少量化带来的副作用。
一般来说,如果音源和输出时的比特数相同,就不需要再用抖动了。并且抖动只对低于16比特的输出比较好的效果。
--------------------------------------------------------------------------------
三、文件标签
问:什么是文件标签,有什么用途?
文件标签就是指一个歌曲文件的标题(歌名)、艺术家(演唱者)等的信息,就好像是一个人的姓名一样。有了文件标签,就能准确的知道这首歌的来源,就能通过这些信息准确的本机或网上查找到相应的歌词文件。
问:如何填写或编辑文件标签?
通过千千的“文件信息”对话框,就能编辑标签信息。有两种方法可以显示这个对话框:1。在播放某首歌的时候,在主窗口上右键的主菜单里选择“查看窗口”里的“文件信息”,这时显示的就是当前正在播放的这首歌的文件信息;2。在播放列表里选中某首或某些歌曲,在右键菜单中选择“文件信息”,就能显示选中文件的信息了,如果你选的是多首歌,就能同时编辑多首歌的信息。
问:千千支持哪些类型的标签?
千千几乎支持所有已知的通用标签类型,比如对于MP3文件,就支持ID3v1/ID3v2、APE;对于Ogg文件,就支持Ogg本身的Vorbis标签;而对于APE、MPC之类的新型文件格式,同样支持APE标签,对于iTunes的MP4/M4A格式,千千也同样支持它的标签类型;要注意的是,WMA的标签的写入需要安装微软的media9或更新的版本,但读取就不需要任何额外的支持了;而对于RM文件,千千目前只支持最基本的几个标签字段。
问:千千嵌入的歌词是怎么回事,和标签有关吗?
千千嵌入的歌词就是以标签的形式保存在歌曲文件里的,字段名是"Lyrics",对标签的操作对嵌入的歌词同样有效。
问:如何在播放列表的歌曲标题里显示我想要显示的标签字段?
可以在千千选项里的“播放列表”页里设置“有标签时的格式”,只要用“%(英文字段名)”这样的字符串就能表示任何你想要显示的字段了,当然前提是你得知道这些字段的英文名称,你可以通过上面讲到的“文件信息”对话框的“高级模式”来看到所有这个文件里已存在的标签字段的名字和值。
问:某些文件显示的是乱码的标签,有没有办法改正?
可以尝试使用“文件信息”里的内码转换功能来找到正确的内码。
问:为什么千千静听在列表里查找文件比较慢?
为了节省资源占用并且提高文件添加到列表的速度,千千静听默认是当播放列表在显示某个音频文件时才会读取信息,而像foobar2000这样的播放器则是在第一次添加时就读取了所有文件的信息,所以查找时就不需要再读取了。 事实上千千静听也提供了和foobar2000一样的文件信息操作方式,请在选项里的“播放列表”页中将读取信息改为“添加”时,并且选上“缓存文件信息到播放列表”。
--------------------------------------------------------------------------------
四、歌词
问:怎么使用歌词秀,为什么我自己从网上下载的歌词就不能显示?
歌词文件有一定的格式,一般以LRC和TXT后缀,每句歌词前面有[00:00.00]这样的时间标签,如果没有这些标签的歌词是无法显示的,可以用千千静听自带的歌词编辑器来为每句歌词加入时间标签,保存后就可以正常显示了。建议把歌词文件以“歌手名 - 歌曲名.lrc”这样的方式命名,再把存放这些歌词的目录加到千千的本地搜索文件夹里,以后就不用再一一关联了,当然你的歌曲文件应该也有相应的歌手名和歌曲名信息,这样才能保证播放器找到正确的歌词文件。
问:为什么歌词下载会失败?
有以下几种可能的原因:
1.文件信息不正确,以至于在搜索时无法正确匹配;
2.歌曲太新,以至于这些歌词网站都还没有收集歌词;
3.如果你安装了防火墙,可能网络请求被过滤而无法连接到歌词服务器;
4.歌词服务器可能出现问题,或者正在维护。
问:为什么没有让用户自己输入或选择歌词网站的功能?
歌词下载网站的搜索和下载方式都不相同,如果要实现用播放器来自动处理需要编写相应的搜索和下载程序,并不是简单的输入一个网址就行了。(注:用百度搜索到的歌词都是纯文本的歌词,无法直接用于歌词秀)
问:为什么我下载了正确的歌词,但下次播放还是显示错误的?
千千加载歌词的顺序是内嵌歌词-关联歌词-本地搜索-在线搜索,很可以内嵌或关联了错误的歌词,或在本机上有错误的歌词文件,这时你可以按上面的顺序来检查优先级高的歌词,如果发现有错误,就删除或修改就行了。具体操作请看歌词秀的右键菜单或选项里的和歌词相关的参数。
问:我想让下载后的歌词自动以歌曲相同的文件名保存,并且直接保存到歌曲所在的目录,这样我找起来很方便,怎样才能做到?
在千千选项的“歌词搜索”页里,有相关的参数可以设置。
问:我的标签信息和文件名都是繁体的,能找到简体的歌词吗?
如果使用的是Unicode版本,并且是2000以上的系统,就可以实现,但在线搜索只有炫网的搜索插件才支持,另外两个网站的搜索引擎不支持简繁体的自动识别。
--------------------------------------------------------------------------------
五、其它
问:我想在播放列表里直接删除硬盘上的文件,“物理删除”为什么是灰色的?
千千提供了物理删除的功能,但考虑到用户可能会误操作,所以默认是禁用的,你可以在千千选项的“播放列表”页中找到启用这项功能的选项。
问:我想从播放列表里直接到文件拖动到其它地方,比如我的U盘或MP3机,可以吗?
可以,在播放列表是选中要操作的文件,注意用左键按住标题(否则就变成选选择文件了,这和windows的资源管理器操作一样),拖动文件到你想要到地方,如果想复制,就按再Ctrl键,操作和资源管理器完全一致。用这种方法,你甚至可以直接把文件拖到回收站上而删除你不想要的文件。
问:我想把CD压缩成MP3、WMA或APE,用千千静听可以做到吗?
可以。通过添加文件或添加目录来把CD上的所有音轨文件拖到播放列表里面,因为数字方式抓取音轨是独占访问的,所以如果正在播放CD上的文件或是音轨,请先停止播放,然后在播放列表里选中要转压的文件(多选就可以进行批量转换),点右键菜单的“转换格式”命令就可以转换了,如果在压缩格式列表里没有找到MP3或WMA,请重新安装千千静听。用同样的方式可以转换任何千千静听可以播放的文件(例如APE等格式转换到MP3、WMA)。
问:为什么其它的播放器对RM的支持比千千静听好?
其它播放器用的是Real Player的播放器核心,其实就相当于在使用Real Player在播放,这和直接用Real Player来播放没多大区别,而且这个核心占用内存实在是比较厉害,所以作者不想采用这种方式。其实Real公司对RMF文件的格式只公开了部分内容,有些细节还没有完全公开,特别是和编码格式有关的部分,在现有的条件下,千千静听只能做到这样了,希望将来能得到更多的技术支持。
问:如果我的电脑上没有安装Windows Media Player 9或更新的版本,还能播放WMA吗?
当然可以,只要在安装时选中支持WMA就行了,千千静听支持WMA只用到了微软的WMA解码器组件,就是安装目录下的wmadmod.dll文件,只有400K左右J,而且还支持WMA文件信息的读取。
问:我要把一台电脑上的千千静听拷到另一台电脑上使用,所有的设置都还有用吗?
千千静听的设置都保存在安装后的目录下的TTPlayer.xml文件下,只要把这个文件和程序一起复制别的电脑上就可以了,根本就不需要重新安装,当然有些目录可能会因为不同的电脑而不一样,需要注意一下(比如歌词下载的保存目录会因为电脑的不同而无效)。
问:我对INI文件比较熟悉,为什么不用INI文件来保存这些设置?
INI是比较“过时”的配置文件,读取和分析都比较慢,扩展性也比较差,而XML是最好的用于保存各种信息的格式,而且现在对它的支持也越来越广泛,所以用XML是更好的选择。
问:为什么我在千千静听里使用DFX看不到DFX的窗口?
如果你的电脑上安装了Winamp,并且DFX也是安装在Winamp上,那只要把Winamp的Plugins目录设置为千千的Winamp音效目录应该就不会有任何问题了(默认情况下千千会检测到Winamp的插件目录并且自动设置),如果你没有安装Winamp,而把DFX安装到千千的目录上,你就应该手动把DFX安装后的目录下的Plugins目录设置为千千的Winamp音效插件目录。
问:为什么不支持视频?
作者设计千千静听的原则就是用来播放音频,至于要看到视频图像,有更多更好的选择,相信大家心中已经都有自己最喜爱的视频播放器了。
问:千千静听支持哪些网络协议的点播?
目前千千静听支持HTTP和MMS方式的在线点播,其中MMS协议需要Media Player 7或更高的版本支持。暂时不支持网上比较流行的RTSP协议。
问:千千静听是用什么语言写的,为什么支持这么多的格式还这么小巧?
千千静听是用VC6编写的,如果你还知道WTL,那么作者可以告诉你,界面是用WTL来编写的,相对于MFC的庸肿,WTL更适合编写快速、精简并且占用资源少的程序。当然很多音频编码库是用C语言来写的,这样更加高效而且小巧。
问:随着用的人越来越多,作者是否会考虑收费或者注册?
作者不会因为任何理由违背承诺来向用户收费!
问:为什么不在网站上做些宣传,好让更多的人知道?
我一直改进千千的理由不是为了钱,所以用的人多了对我本人来说也不见得就是好事,一个人做软件毕竟很辛苦,用的人太多引来的问题和麻烦也就更多。
问:我经常在某些论坛上看到推荐千千静听的贴子,有人说这是作者请的“枪手”在推荐?
这是最可笑的问题,但确实有不少网友来问!
我的回答是“绝对不是”,一方面上面也说过了,我本人对宣传不感兴趣,另一方面,我也请不起所谓的“枪手”。问问你自己或你身边的朋友,你们是如何知道千千静听的,是在媒体上看到的广告?是在论坛上看到大肆的推荐?还是朋友直接推荐给你的?
作者并不反对网友到不同的论坛上推荐千千静听,如果你认为千千是一个你喜欢的并且值得推荐的软件,那么有什么理由不让你去推荐给更多的人用呢?!
问:为什么取名叫“千千”,好像不太响亮哦?
作者很喜欢陈慧娴的歌,相信大家都知道为什么会用“千千”这个词了吧。其实当时之所以会自己写一个播放器也是因为觉得Winamp很多地方不太好用,总觉得要是有一个自己的播放器来听自己喜欢的歌那该多好啊,所以就有了今天的千千静听,希望大家会喜欢。
*)their_addr,sizeof(struct sockaddr)) == -1){ //如果连接失败,退出程序 pri