當前位置:首頁 » 操作系統 » 音頻播放器源碼

音頻播放器源碼

發布時間: 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外部功放設備連接,由外部功放負責對聲音的解碼。

希望以上心得能夠幫助到題主!

熱點內容
html5android教程視頻下載 發布:2024-04-26 03:09:59 瀏覽:866
伺服器的描述是什麼 發布:2024-04-26 03:08:32 瀏覽:393
個人加密 發布:2024-04-26 03:01:23 瀏覽:519
linuxusbgadget 發布:2024-04-26 02:52:54 瀏覽:303
我的世界空島世界伺服器地址 發布:2024-04-26 01:39:08 瀏覽:248
尼爾機械紀元加密 發布:2024-04-26 01:37:11 瀏覽:867
在控制台輸出sql語句 發布:2024-04-26 01:08:12 瀏覽:432
動畫java 發布:2024-04-26 01:02:40 瀏覽:12
得力文件夾5302 發布:2024-04-26 00:21:32 瀏覽:91
您的個人文件夾 發布:2024-04-26 00:03:12 瀏覽:68