当前位置:首页 » 操作系统 » 音频播放器源码

音频播放器源码

发布时间: 2023-02-03 09:36:28

1. 基于Android音乐播放器源代码(正常播放、有列表)

package my.android.players;

import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.TextView;

public class mainActivity extends Activity {

private List<String> myMusicList=new ArrayList<String>();
//当前播放歌曲的索引
private int currentListItem=0;
//音乐的路径
private static final String MUSIC_PATH="/sdcard/mp3";
//播放对象
private MediaPlayer myMediaPlayer;
private TextView m_TextView;
//播放按钮
private ImageButton m_start;
private ImageButton m_stop;
private ImageButton m_next;
private ImageButton m_last;
/*设定bIsPaused一开始为false */
private boolean bIsRun = false;
private boolean isplay;

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main2);

myMediaPlayer=new MediaPlayer();

musicList();
m_TextView=(TextView)findViewById(R.id.mtextview);
m_start=(ImageButton)findViewById(R.id.imgbtn_start);
m_stop=(ImageButton)findViewById(R.id.imgbtn_stop);
m_next=(ImageButton)findViewById(R.id.imgbtn_next);
m_last=(ImageButton)findViewById(R.id.imgbtn_last);
listener();

Intent intent = this.getIntent();
Bundle bundle = intent.getExtras();
currentListItem = bundle.getInt("currentListItem");
isplay=bundle.getBoolean("isplay");
if(isplay==true)
{
bIsRun=false;
playMusic(MUSIC_PATH+"/"+myMusicList.get(currentListItem));
}
}
//监听事件
void listener(){

//开始
m_start.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
try
{
if(myMediaPlayer.isPlaying()==true)
{
myMediaPlayer.pause();
m_start.setImageResource(R.drawable.pause);
}
else
{
playMusic(MUSIC_PATH+"/"+myMusicList.get(currentListItem));
}

}
catch (IllegalStateException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}

}
});
//下一首
m_next.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
nextMusic();
}
});

//上一首
m_last.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub

lastMusic();
}
});

//停止
m_stop.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
stopMusic();
}
});

myMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
nextMusic();
}
});
}
//播放音乐
void playMusic(String path){
try {
if(bIsRun==false)
{
myMediaPlayer.reset();
myMediaPlayer.setDataSource(path);
myMediaPlayer.prepare();
myMediaPlayer.start();
/*
* 取出歌曲名的.mp3后缀
* */
String str=(myMusicList.get(currentListItem)).toString();
System.out.println(str);
String str1[]=str.split("\\.");
System.out.println(str1[0]);
m_TextView.setText(str1[0]);
}
else
{
myMediaPlayer.start();
}
m_start.setImageResource(R.drawable.start);
bIsRun=true;
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}

//下一首
void nextMusic(){
if(++currentListItem>=myMusicList.size()){
currentListItem=0;
}
bIsRun=false;
playMusic(MUSIC_PATH+"/"+myMusicList.get(currentListItem));
}

//上一首
void lastMusic(){
if(--currentListItem<0)
currentListItem=myMusicList.size()-1;
bIsRun=false;
playMusic(MUSIC_PATH+"/"+myMusicList.get(currentListItem));
}
//停止
void stopMusic() {

if (myMediaPlayer.isPlaying()) {
m_start.setImageResource(R.drawable.pause);
myMediaPlayer.stop();// 停止
bIsRun=false;
}
else
playMusic(MUSIC_PATH+"/"+myMusicList.get(currentListItem));
}
//当用户返回时结束音乐并释放音乐对象
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if(keyCode==KeyEvent.KEYCODE_BACK){
new AlertDialog.Builder(mainActivity.this).setTitle("message")
.setIcon(android.R.drawable.dialog_frame)
.setMessage("你确定要离开吗?")
.setPositiveButton("确定",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
myMediaPlayer.stop();
myMediaPlayer.release();
finish();
}
}).setNegativeButton("取消",new DialogInterface.OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub

}
}).show();

}
return super.onKeyDown(keyCode, event);
}
/**
* 文件过滤器
*
* @author
*
*/
class MusicFilter implements FilenameFilter {

@Override
public boolean accept(File dir, String filename) {

return (filename.endsWith(".mp3"));
}

}
//绑定音乐
void musicList(){
try{
File home=new File(MUSIC_PATH);
if(!home.exists())
home.mkdirs();
if(home.listFiles(new MusicFilter()).length>=0){
for(File file:home.listFiles(new MusicFilter())){
myMusicList.add(file.getName().toString());
}
}
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}

package my.android.players;

import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.widget.AdapterView;
import android.widget.ArrayAdapter;

import android.widget.ListView;

public class Activity01 extends Activity {

//播放列表
private List<String> myMusicList=new ArrayList<String>();
//当前播放歌曲的索引
private int currentListItem;
//音乐的路径
private static final String MUSIC_PATH="/sdcard/mp3";
//播放列表
private ListView m_ListView;

private boolean isplay=true;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

m_ListView=(ListView)findViewById(R.id.lv_music);

musicList();

//当选择列表项时播放音乐
m_ListView.setOnItemClickListener(new ListView.OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
currentListItem = arg2;
Intent intent = new Intent();
Bundle mBundle=new Bundle();
mBundle.putInt("currentListItem", currentListItem);
mBundle.putBoolean("isplay", isplay);
intent.putExtras(mBundle);
intent.setClass(Activity01.this,mainActivity.class);
startActivity(intent);
finish();
}
});
}

/**
* 文件过滤器
*
* @author
*
*/
class MusicFilter implements FilenameFilter {

@Override
public boolean accept(File dir, String filename) {

return (filename.endsWith(".mp3"));
}

}

//绑定音乐
void musicList(){
try{
File home=new File(MUSIC_PATH);
if(!home.exists())
home.mkdirs();
if(home.listFiles(new MusicFilter()).length>=0){
for(File file:home.listFiles(new MusicFilter())){
myMusicList.add(file.getName().toString());
}
ArrayAdapter<String> musicList=new ArrayAdapter<String>
(Activity01.this,android.R.layout.simple_list_item_1, myMusicList);
m_ListView.setAdapter(musicList);
}
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}

2. 求一个c#音乐播放器源代码。

其实很简单的,自己就可以使用Media palyer组件写一个。
方法如下:
1,在工具箱空白处右键,选择“选择项”。
2,在com组件中选择 “windows media player"
3,然后就可以通过 player对象来控制播放,暂停,快进等。

给你贴了参考资料链接。我也写过一个播放器,支持基本的播放功能及歌词同步,如果有需要可以把源码发你。

3. 求一个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;
}
}

} }

4. 求一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很多地方不太好用,总觉得要是有一个自己的播放器来听自己喜欢的歌那该多好啊,所以就有了今天的千千静听,希望大家会喜欢。

5. 网页音乐播放器HTML源码

一、在ASPASP.Net MVC音乐播放的HTML代码网页。

6. 您好,您有音频播放器的C++源码吗麻烦发我一份,太感谢!!

有,但是不一定找得到了,有时间我再找找

7. 用C语言编写音乐播放器的源代码

如果你这个播放器是在电脑上使用,那用C语言显然有点太小题大做了,用其他高级语言实现起来要简单的多。如果是设计一个类似MP3的播放设备,那么C语言几乎是唯一的选择,而且代码复杂程度远远高于你的想象,不过幸运的是会有一些开源的代码可以移植,所以让这件事情也变得容易实现多了,如果再加上一个专用的解码芯片,那软件会简单点,解码效率也高多了。

8. 网页音乐播放器HTML源码

一、在ASPASP.Net MVC音乐播放的HTML代码网页。

9. 音频输出的源码和解码有什么区别哪个好呢

源码输出,大体是指播放器播放的音频以数字形式输出给功放或者解码器进行音频的解码,然后输出到音箱;
解码输出,大体是指播放器本身先将音频进行解码,然后将解码后的音频输出给功放或者其他设备然后输出到音箱。
没有功放或者解码设备的,一般都是播放器自己解码后输出;
有功放或者解码设备的,建议播放器设置源码输出,然后解码工作交给功放或者解码器来进行解码。
相对来说,源码输出更好一些,因为功放的解码硬件要好于播放设备的解码。

10. 亿格瑞播放机能源码输出,到底源码输出和解码输出有什么区别

将TrueHD或DTS音频数据以数字信号模式输出则叫做源码输出(RAM),若以模拟信号输出则叫解码输出(LPCM)。

1.源码输出,大体是指播放器播放的音频以数字形式输出给知功放或者解码器进行音频的解码,然后输出到音箱;


解码输出,大体是指播放器本身先将音频进行解码,然后将解码后的音频输出给功放或道者其他设备然后输出到音箱。

没有功放或者解码设备的,版一般都是播放器自己解码后输出;
有功放或者解码设备的,建议播放器设置源码输出,然后解码工作交权给功放或者解码器来进行解码。

2.【HDMI输出】
LPCM:解码输出,通过HDMI接口传输解码后的2声道声音,通常用于直接连接电视机的情况。
RAW: 源码输出,通过HDMI接口传输原始比特流数据,通常用于和带HDMI的外部功放设备连接,由外部功放负责对声音的解码。

HDMI输出最高可支持7.1声道;

【SPDIF输出】
LPCM: 解码输出,通过SPDIF接口传输解码后的2声道声音。
RAW: 源码输出,通过SPDIF接口传输原始比特流数据,通常用于和带SPDIF外部功放设备连接,由外部功放负责对声音的解码。

希望以上心得能够帮助到题主!

热点内容
如何把手机改安卓10 发布:2024-05-05 17:39:07 浏览:496
我的世界怎么扩容服务器内存 发布:2024-05-05 17:19:54 浏览:48
java读取文件字符 发布:2024-05-05 17:15:18 浏览:11
三星怎么应用加密 发布:2024-05-05 17:13:18 浏览:152
cad字体在那个文件夹 发布:2024-05-05 17:08:20 浏览:331
什么时候用编译器 发布:2024-05-05 17:08:20 浏览:766
应急救援脚本 发布:2024-05-05 17:08:17 浏览:338
我的世界搭建无正版验证服务器 发布:2024-05-05 17:03:48 浏览:819
我的世界服务器地址宝可梦 发布:2024-05-05 17:00:16 浏览:256
dede企业源码 发布:2024-05-05 16:57:53 浏览:787