MP3

  由於現在的windows OS內建的播放器就可以播MP3檔案,所以只需要去使用windows指令去開啟檔案並播放即可。

  基本開啟 MP3 的 C++ code 如下:

 

std::wstring WorkDir = L"MP3\\";
std::wstring FileName = L"test";
std::wstring MusicFile;
int Now;
int Time;
int Vol;

std::wstringstream wsStream;
wsStream << WorkDir  <<  FileName << L".mp3";
MusicFile.clear();
MusicFile = wsStream.str();	

mciOpen.lpstrDeviceType = L"mpegvideo";
mciOpen.lpstrElementName = wsMusic.c_str();

if(mciSendCommand(1,MCI_OPEN,MCI_OPEN_TYPE | MCI_OPEN_ELEMENT,(DWORD)&mciOpen))
{	
	wstringstream wsStream;

	wsStream << L"==================== MP3 Infomation ==================" << endl;
	wsStream << L"找不到檔案 !!" << endl;
	wsStream << L"======================================================" << endl;
}
else
{
	//查看裝置可用
	mciStatus.dwItem = MCI_STATUS_READY;
	mciSendCommand(mciOpen.wDeviceID, MCI_STATUS, MCI_STATUS_ITEM,(DWORD)&mciStatus);
	if( 0 < mciStatus.dwReturn) //先停掉裝置  在播放
	{
		mciSendCommand(mciOpen.wDeviceID, MCI_CLOSE, MCI_NOTIFY, (DWORD)&mciPlay);
	}

	//取得歌曲長度(毫秒)
	mciStatus.dwItem=MCI_STATUS_LENGTH;
	mciSendCommand(mciOpen.wDeviceID, MCI_STATUS, MCI_STATUS_ITEM, (DWORD)&mciStatus);
	Time = mciStatus.dwReturn; //歌曲長度

	//當前播放到第幾毫秒
	mciStatus.dwItem = MCI_STATUS_POSITION;
	mciSendCommand(mciOpen.wDeviceID, MCI_STATUS, MCI_STATUS_ITEM,(DWORD)&mciStatus);
	Now = mciStatus.dwReturn;

	//開始播放
	mciSendCommand(mciOpen.wDeviceID, MCI_PLAY, MCI_NOTIFY, (DWORD)&mciPlay);
		
	//設定音量
	mciSetAudioPara.dwCallback	= NULL;
	mciSetAudioPara.dwItem	 = MCI_DGV_SETAUDIO_VOLUME; //設定項目為調整音量
	mciSetAudioPara.dwValue	 = Vol;			    //調整音量大小( 0~1000 )
	mciSendCommand( mciOpen.wDeviceID, MCI_SETAUDIO, 
			MCI_DGV_SETAUDIO_VALUE |  MCI_DGV_SETAUDIO_ITEM, 
			(DWORD)(LPVOID)&mciSetAudioPara );
}

 

  如果還要附加搜尋目錄自動播放的可以參考底下的code:

 

wchar_t WorkPath[] = L"MP3\\"; //音樂檔放的目錄
wchar_t FileType[] = L"*.mp3"; //副檔名
std::vector<std::wstring> FileNameList; //檔案路徑的容器

wchar_t TargetPath[MAX_PATH], FilePath[MAX_PATH];


HANDLE hFind;
WIN32_FIND_DATA FindFileData;


//重組檔案路徑以及副檔名
wsprintf(TargetPath, L"%s%s", WorkPath, FileType);


//開始搜尋
int n = 0;
std::wstringstream wsStream; //輸出文字串
wsStream << L"==================== MP3 File List ==================" << endl;
			
if( (hFind = FindFirstFileW(TargetPath, &FindFileData)) != INVALID_HANDLE_VALUE) 
{
	FileNameList.clear();
	do 
	{ //將資料夾下的所有mp3檔找出來

		if(! (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) 
		{ //去除資料夾屬性的檔案

			//取出完整檔案路徑
			wsprintf(FilePath, L"%s%s", WorkPath, FindFileData.cFileName);
				
			//將檔案路徑丟進容器裡		
			FileNameList.push_back(FilePath);

			//將檔案路徑列入輸出文字串裡
			wsStream << L"Data " << n++ << L" :" << FilePath << endl;
		}


	} while(FindNextFile(hFind, &FindFileData)); //還有檔案就繼續找
}

wsStream << L"=======================================================" << endl;

 

  之後只要從檔案路徑的容器裡把檔案路徑挖出來丟到上一段的播放器裡就可以播放了,然後定時檢查播放的進度就可以判斷是否要換下一首了。

創作者介紹

折翼之流

G毛 發表在 痞客邦 PIXNET 留言(1) 人氣()


留言列表 (1)

發表留言
  • 訪客
  • 你好!!
    我看這篇文章無數次了,但是還是不了解應該如何使用或是套用

    我把它放進MAIN裡面會出現超級多的ERROR

    我在前面引用了
    #include<stdio.h>
    #include<iostream>
    #include<stdlib.h>
    #include <sstream>
    但是依舊無法

    請問可以給我一點方向讓我去試試看嗎?

    非常感謝
  • 添加宣告
    #include <windows.h>
    #include <Digitalv.h>
    using namespace std;

    以及在main裡宣告
    MCI_WAVE_OPEN_PARMS mciOpen;
    MCI_STATUS_PARMS mciStatus;
    MCI_PLAY_PARMS mciPlay;
    MCI_DGV_SETAUDIO_PARMS mciSetAudioPara;

    如果出現LINK2001問題
    你還需要加入#pragma comment(lib, "winmm.lib")

    G毛 於 2014/11/01 01:42 回覆