Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 16 kết quả

Đề tài: Lập trình MEDIA | Playing mp3 music trong VC++?

  1. #1
    Ngày gia nhập
    01 2008
    Nơi ở
    Gameloft Studio
    Bài viết
    294

    Mặc định Lập trình MEDIA | Playing mp3 music trong VC++?

    Dạo này thấy nhiều người hỏi về cách play file nhạc quá nên ZC hướng dẫn tạo 1 cái class để play file mp3 nhé.

    Dĩ nhiên là ZC ko đủ trình độ để quậy tới DirectAudio đâu

    Chỉ sử dụng winmm.lib thôi, cái này đơn giản nhưng cũng hiệu quả. Hồi trước Z cũng sử dụng nó để làm music nền cho 1 chương trình để tặng .... bạn nữa kìa.

    Nói chung có thể làm nền games mini khá tốt vì nó chạy thread nên ko ảnh hưởng tới chương trình đơ hay đứng gì hết.

    C++ Code:
    1. #include <windows.h>
    2. #include <Mmsystem.h>
    3. #pragma comment (lib,"winmm.lib")
    4.  
    5. #include <conio.h> //_getch()

    Sau đó là class Mp3Player
    C++ Code:
    1. class Mp3Player
    2. {
    3. protected:
    4.     DWORD m_idPlayer;
    5.    
    6.     Mp3Player(DWORD id)
    7.     {
    8.         m_idPlayer = id;
    9.     }
    10. public:
    11.  
    12. //Open_File
    13. //Thong tin:
    14. //   - Khoi tao doi tuong Mp3Player
    15. //   - Tham so dua vao la duong dan file MP3
    16.  
    17.     static Mp3Player* Open_File(WCHAR *lpFileName)
    18.     {
    19. #pragma warning (disable:4311)
    20.  
    21.         // Tham so cho Media
    22.         MCI_OPEN_PARMS mciOpenParms;
    23.        
    24.         // Driver de play MP3 (tham khao them trong MSDN)
    25.         mciOpenParms.lpstrDeviceType = L"mpegvideo";
    26.         // File mp3 se play
    27.         mciOpenParms.lpstrElementName = lpFileName;
    28.        
    29.         // Khoi tao mp3Player
    30.         DWORD dwResult = mciSendCommand(0, MCI_OPEN,MCI_OPEN_TYPE | MCI_OPEN_ELEMENT,(DWORD) &mciOpenParms);   
    31.         // Loi khoi tao (co the do soundCard)
    32.         if (dwResult != 0 )
    33.             return NULL;
    34.        
    35.         // Thiet lap tham so cho mp3Player (su dung don vi Milisecond) 
    36.         MCI_SET_PARMS param;
    37.         param.dwTimeFormat = MCI_FORMAT_MILLISECONDS;
    38.         dwResult = mciSendCommand(mciOpenParms.wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,(DWORD) (LPMCI_SET_PARMS) &param);
    39.         // Loi thiet lap tham so
    40.         if (dwResult != 0 )
    41.             return NULL;
    42.  
    43. #pragma warning (default:4311)
    44.  
    45.         // Khoi tao doi tuong Mp3
    46.         return new Mp3Player( mciOpenParms.wDeviceID );    
    47.     }
    48.    
    49.     virtual ~Mp3Player()
    50.     {
    51.         // Huy mp3Player
    52.         mciSendCommand(m_idPlayer, MCI_CLOSE, 0, NULL);
    53.     }
    54.  
    55.     void Release(){delete this;}
    56.  
    57. // Play()
    58. // Thong tin: Play file nhac
    59.     void Play()
    60.     {
    61. #pragma warning (disable:4311)
    62.         MCI_PLAY_PARMS param;
    63.         param.dwCallback = (DWORD) NULL;
    64.         mciSendCommand(m_idPlayer, MCI_PLAY, MCI_NOTIFY,(DWORD)(LPVOID) &param);
    65. #pragma warning (default:4311)
    66.     }
    67.  
    68. // Stop()
    69. // Thong tin: Dung file nhac   
    70.     void Stop()
    71.     {
    72. #pragma warning (disable:4311)
    73.         MCI_GENERIC_PARMS param;
    74.         param.dwCallback = NULL;
    75.         mciSendCommand(m_idPlayer,MCI_STOP,MCI_NOTIFY,(DWORD) (LPMCI_GENERIC_PARMS) &param);
    76. #pragma warning (default:4311)
    77.     }
    78.  
    79. // Pause()
    80. // Thong tin: Tam dung file nhac   
    81.     void Pause()
    82.     {
    83. #pragma warning (disable:4311)
    84.         MCI_GENERIC_PARMS param;
    85.         param.dwCallback = NULL;
    86.         mciSendCommand(m_idPlayer,MCI_PAUSE,MCI_NOTIFY,(DWORD)(LPMCI_GENERIC_PARMS) &param);
    87. #pragma warning (default:4311)
    88.     }
    89.  
    90. // Resume()
    91. // Thong tin: Tiep tuc play (do pause)
    92.     void Resume()
    93.     {
    94. #pragma warning (disable:4311)
    95.         MCI_GENERIC_PARMS param;
    96.         param.dwCallback = NULL;
    97.         mciSendCommand(m_idPlayer,MCI_RESUME,MCI_NOTIFY,(DWORD)(LPMCI_GENERIC_PARMS) &param);
    98. #pragma warning (default:4311)
    99.     }
    100.  
    101. // Length()
    102. // Thong tin: Tra ve thoi gian file mp3 (milisecond)
    103.     DWORD Get_Length()
    104.     {
    105. #pragma warning (disable:4311)
    106.         MCI_STATUS_PARMS param;
    107.         param.dwItem = MCI_STATUS_LENGTH;
    108.         DWORD dwResult = mciSendCommand(m_idPlayer,MCI_STATUS ,MCI_STATUS_ITEM, (DWORD) (LPMCI_STATUS_PARMS) &param);
    109. #pragma warning (default:4311)
    110.         if (dwResult != 0)
    111.             return false;
    112.  
    113.         return (DWORD)param.dwReturn;
    114.     }
    115.  
    116. // Get_Position()
    117. // Thong tin: Tra ve vi tri (thoi diem milisecond) dang play
    118.     DWORD Get_Position()
    119.     {
    120. #pragma warning (disable:4311)
    121.         MCI_STATUS_PARMS param;
    122.         param.dwItem = MCI_STATUS_POSITION;;
    123.         DWORD dwResult = mciSendCommand(m_idPlayer,MCI_STATUS ,MCI_STATUS_ITEM, (DWORD) (LPMCI_STATUS_PARMS) &param);
    124. #pragma warning (default:4311)
    125.         if (dwResult != 0)
    126.             return false;
    127.         return (DWORD)param.dwReturn;
    128.     }
    129.  
    130. // Seek()
    131. // Thong tin: Nhay den vi tri seekto de play (milisecond)
    132.     void Seek(DWORD seekto)
    133.     {
    134. #pragma warning (disable:4311)
    135.         MCI_SEEK_PARMS param;
    136.         param.dwTo = seekto;   
    137.         mciSendCommand(m_idPlayer,MCI_SEEK,MCI_TO,(DWORD) (LPMCI_SEEK_PARMS) &param);
    138. #pragma warning (default:4311)
    139.  
    140.     }
    141. };

    Cuối cùng là copy file mp3 cùng thư mục với chương trình và viết hàm main như sau.

    C++ Code:
    1. int _tmain(int argc, _TCHAR* argv[])
    2. {
    3.     Mp3Player *pPlayer = Mp3Player::Open_File(L"Phanly_LilKnight.mp3");
    4.  
    5.     if (pPlayer == NULL)
    6.     {
    7.         printf("Sound card hoac path mp3 khong hop le\n");
    8.         return 1;
    9.     }
    10.    
    11.     pPlayer->Play();
    12.  
    13.     printf("Hay lang nghe nhe... (press a key to stop)\n");
    14.     _getch();  
    15.  
    16.     pPlayer->Release();
    17.     return 0;
    18. }

    Code này chỉ là play mp3. Ngoài ra nó có thể play các file wav, midi, avi và mpg. Tham thêm ở msdn nhé.
    Good luck!
    Đã được chỉnh sửa lần cuối bởi ZCoder87 : 09-12-2008 lúc 10:26 PM.

  2. #2
    Ngày gia nhập
    11 2007
    Bài viết
    12

    bạn ơi mình cop vào chạy thì nó báo 2 lỗi ở 2 dòng

    // Driver de play MP3 (tham khao them trong MSDN)
    mciOpenParms.lpstrDeviceType = L"mpegvideo";
    // File mp3 se play
    mciOpenParms.lpstrElementName = lpFileName;

  3. #3
    Ngày gia nhập
    01 2008
    Nơi ở
    Gameloft Studio
    Bài viết
    294

    Hiểu luôn!

    Bạn đang xài VC6.0, mặc định nó ko có hỗ trợ Unicode
    Bạn code lại hàm này như sau:

    Lưu ý: Sửa WCHAR -> CHAR

    C++ Code:
    1.  static Mp3Player* Open_File(CHAR *lpFileName)
    2.     {
    3. #pragma warning (disable:4311)
    4.  
    5.         // Tham so cho Media
    6.         MCI_OPEN_PARMS mciOpenParms;
    7.        
    8.         // Driver de play MP3 (tham khao them trong MSDN)
    9.         mciOpenParms.lpstrDeviceType = "mpegvideo";
    10.         // File mp3 se play
    11.         mciOpenParms.lpstrElementName = lpFileName;
    12.        
    13.         // Khoi tao mp3Player
    14.         DWORD dwResult = mciSendCommand(0, MCI_OPEN,MCI_OPEN_TYPE | MCI_OPEN_ELEMENT,(DWORD) &mciOpenParms);    
    15.         // Loi khoi tao (co the do soundCard)
    16.         if (dwResult != 0 )
    17.             return NULL;
    18.        
    19.         // Thiet lap tham so cho mp3Player (su dung don vi Milisecond)  
    20.         MCI_SET_PARMS param;
    21.         param.dwTimeFormat = MCI_FORMAT_MILLISECONDS;
    22.         dwResult = mciSendCommand(mciOpenParms.wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,(DWORD) (LPMCI_SET_PARMS) &param);
    23.         // Loi thiet lap tham so
    24.         if (dwResult != 0 )
    25.             return NULL;
    26.  
    27. #pragma warning (default:4311)
    28.  
    29.         // Khoi tao doi tuong Mp3
    30.         return new Mp3Player( mciOpenParms.wDeviceID );    
    31.     }

    Trong hàm main thì bỏ chữ L" string " đi.
    C++ Code:
    1. Mp3Player *pPlayer = Mp3Player::Open_File("lonely.mp3");

  4. #4
    Ngày gia nhập
    11 2007
    Bài viết
    12

    hic bạn ơi mình sửa lại tiếp rồi nó lại báo là lỗi ở 2 dòng

    Code:
    printf("Sound card hoac path mp3 khong hop le\n");

    Code:
    printf("Hay lang nghe nhe... (press a key to stop)\n");
    mình bỏ 2 dòng này đi thì nó lại báo tiếp 2 lỗi khác
    LIBCMTD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
    Debug/aaaa.exe : fatal error LNK1120: 1 unresolved externals

    bạn xem giúp mình với

  5. #5
    Ngày gia nhập
    01 2008
    Nơi ở
    Gameloft Studio
    Bài viết
    294

    Lỗi nì thì mình bó tay! Vì nó nằm ngoài khu vực mp3Player roài!!!

    Để mình xem lại cuốn lập trình C căn bản đã.
    Đã được chỉnh sửa lần cuối bởi ZCoder87 : 16-12-2008 lúc 10:37 AM.

  6. #6
    Ngày gia nhập
    09 2008
    Nơi ở
    Kĩ viện
    Bài viết
    169

    Mặc định Lập trình MEDIA | Playing mp3 music trong VC++?

    @arn0ld: Do bạn cấu hình project SubSystem là windows nên nó mới thế, vì lúc đó entry function là WinMain chứ không phải main, mà nó chả thấy WinMain của bạn đâu nên nó mới hỏi tý. cấu hình lại thành console là xong .

    @Zcoder: Cái của bạn làm mini game thì ổn chứ làm game thật có lẽ dùng OpenAL tốt hơn , nó có nhiều hiệu ứng mà quan trọng nhất là 3D, không thì chơi game nghe tiếng đâu đâu cũng đều đều không xướng lắm, sang trái sang phải cũng như nhau .

    Edit: Vote phát 5 sao.
    Đã được chỉnh sửa lần cuối bởi NamVoDang : 10-12-2008 lúc 06:33 PM.
    Phá toái hư không - Bạch nhật thăng thiên.

  7. #7
    Ngày gia nhập
    11 2007
    Bài viết
    12

    chỉnh ở đâu hả bạn mình chưa biết mấy cái bạn nói

  8. #8
    Ngày gia nhập
    09 2008
    Nơi ở
    Kĩ viện
    Bài viết
    169

    Mình không có VC++6.0 T.T, nhưng VC++ 2005 express trở lên thì chắc chắn là như thế này. Phải chuột vào cái project -> Properties -> Linker -> SubSystem -> Đổi thành console.

    Còn nếu thấy không như thế thì tạo project khác, nhưng lúc tạo project nhớ chọn console chứ đừng chọn window application.
    Phá toái hư không - Bạch nhật thăng thiên.

  9. #9
    Ngày gia nhập
    09 2008
    Bài viết
    28

    Trích dẫn Nguyên bản được gửi bởi arn0ld Xem bài viết
    hic bạn ơi mình sửa lại tiếp rồi nó lại báo là lỗi ở 2 dòng

    Code:
    printf("Sound card hoac path mp3 khong hop le\n");
    ...
    bạn xem giúp mình với
    Bạn nhớ phải thế tên bài nhạc mp3 trong ví dụ với tên bài nhạc thật sự trên máy của bạn thì nó mới tìm ra và chơi được.

    Mp3Player *pPlayer = Mp3Player::Open_File("lonely.mp3");

  10. #10
    Ngày gia nhập
    11 2007
    Bài viết
    12

    cái tên file nhac và lệnh open mình viết đúng rồi mà ở đây nó báo cái j liên quan đến thư viện hay sao ý
    IBCMTD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
    Debug/aaaa.exe : fatal error LNK1120: 1 unresolved externals

Các đề tài tương tự

  1. Xử lý Music trong lập trình C
    Gửi bởi Xcross87 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 8
    Bài viết cuối: 20-09-2014, 10:09 PM
  2. Chương trình chạy nhạc (Playing Song)
    Gửi bởi huygamer trong diễn đàn Tutorials và Thủ thuật lập trình Objective-C
    Trả lời: 0
    Bài viết cuối: 10-01-2013, 03:42 PM
  3. Xử lý tự chuyển bài hát ở chương trình media trong C#?
    Gửi bởi mrsku121 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 13-04-2011, 10:16 PM
  4. [Hỏi] media player trong Form
    Gửi bởi namroyal88 trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 1
    Bài viết cuối: 29-05-2009, 10:13 PM
  5. Xử lý Pause, Next, Prev trong chương trình play music viết bằng C# như thế nào?
    Gửi bởi vnxone trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 20-05-2009, 01:37 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn