前提・実現したいこと
下のプログラムで取得したmp3の長さが、windows10のファイルのプロパティに表示されている長さと一致しません。
この例で使用したmp3の場合はファイルのプロパティでは45秒でしたが私のプログラムでは48秒が返されました。
他のmp3でもいろいろ試してみましたが、ファイルのプロパティの値とは一致しませんでした。
wavファイルでは正確に取得できました。
このファイルをメディアプレイヤーで開いたときも長さが46秒でプロパティの値とは一致しませんでしたが、windows10のGrooveミュージックで開いたときは45秒と表示されてプロパティの値と一致しました。
どうすればmp3の長さを正確に取得できますか?
該当のソースコード
c
1#include<Windows.h> 2#include<mmsystem.h> 3#pragma comment(lib,"winmm.lib") 4 5MCI_STATUS_PARMS mcistatus; 6MCI_SET_PARMS mciset; 7MCI_OPEN_PARMS mop; 8TCHAR szBuf[256]; 9 10int WINAPI WinMain(HINSTANCE hinst,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){ 11 int result; 12 DWORD dwsecond; 13 mop.lpstrDeviceType = TEXT("MPEGVideo"); 14 mop.lpstrElementName = TEXT("D:\test.mp3"); 15 result = mciSendCommand((MCIDEVICEID)NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ELEMENT, (DWORD_PTR)&mop); 16 if (result !=0){ 17 MessageBox(NULL, 18 TEXT("ファイルが見つかりません!!"), 19 TEXT("エラー"), 20 MB_OK); 21 return -1; 22 } 23 mciset.dwTimeFormat = MCI_FORMAT_MILLISECONDS; 24 mciSendCommand(mop.wDeviceID, MCI_SET, MCI_SET_TIME_FORMAT, (DWORD_PTR)&mciset); 25 mcistatus.dwItem = MCI_STATUS_LENGTH; 26 mciSendCommand(mop.wDeviceID, MCI_STATUS, MCI_STATUS_ITEM, (DWORD_PTR)&mcistatus); 27 dwsecond = (DWORD)mcistatus.dwReturn / 1000; 28 wsprintf(szBuf, TEXT("このファイルの長さは%02d分%02d秒です。"), dwsecond / 60, dwsecond % 60); 29MessageBox(NULL, 30 szBuf, 31 mop.lpstrElementName, 32 MB_OK); 33mciSendCommand(mop.wDeviceID, MCI_CLOSE, 0, 0); 34return 0; 35}
補足情報(FW/ツールのバージョンなど)
Microsoft Visual C++ 2019 C言語
WIN32 ユニコードビルド Windows10
回答1件
あなたの回答
tips
プレビュー