HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
1214
HSP太郎音楽ファイルの作成者などの取得方法を知りたいです。5未解決


HSP太郎

リンク

2018/12/14(Fri) 18:51:37|NO.85996

音楽ファイル(mp3など)の詳細情報を取得する方法を知りたいです。
例えば『イージューライダー』だと
プロパティ    値
参加アーティスト 奥田民生
アルバム     記念ライダー2号 〜オクダタミオシングルコレクション〜
年        1996
のようなものを取得したいです。どのようにすればいいでしょうか?



この記事に返信する


HSP太郎

リンク

2018/12/14(Fri) 18:58:36|NO.85997

dll使う方法でもいいです。



eleman

リンク

2018/12/15(Sat) 16:52:41|NO.86000

ID3タグというものが使用されているようです。
バイナリの操作方法がわかれば、HSPでも実装が可能と考えられます。
「id3 仕様」などでggっていただければわかる思います。



MIZUSHIKI

リンク

2018/12/16(Sun) 10:39:35|NO.86016

私はT-Matsuoさんの mp3infp を使わせてもらってます。

http://win32lab.com/fsw/mp3infp/
(mp3infp.dllのみで大丈夫です。)


#include "mp3infp_ExportFunc_HSP.as" mp3infp_GetVer ver = int(strf("%x",stat)) ;(16進数の値を文字列化し、さらに数値化[0x250→"250"→250]) mes strf("mp3infp Ver.%d.%d" ,ver/100, ver\100) dialog "",16 if stat = 0 :end _refstr = refstr mp3infp_Load 0, varptr(_refstr) if stat == -1 : mes "読み込み失敗" //szValueName末尾 szValueName_End = "" mp3infp_GetType if stat == MP3INFP_FILE_MP3 { ;MP3の場合、szValueName末尾が変化 mp3infp_mp3_GetTagType repeat 1 if stat & 2 :szValueName_End = "_v2" :break ;ID3v2 if stat & 4 :szValueName_End = "_rmp" :break ;RiffSIF if stat & 1 :szValueName_End = "_v1" :break ;ID3v1 szValueName_End = "_x" :break ;タグ用データ領域を持たないMP3 loop if szValueName_End = "_x" : mes "タグ用データ領域を持たないMP3です" :stop } sdim buf, 256 //タイトル取得 szValueName = "INAM" + szValueName_End mp3infp_GetValue varptr(szValueName), varptr(bufp) if stat!=0 : dupptr buf, bufp, 256, 2 :mes "タイトル : " + buf //アーティスト取得 szValueName = "IART" + szValueName_End mp3infp_GetValue varptr(szValueName), varptr(bufp) if stat!=0 : dupptr buf, bufp, 256, 2 :mes "アーティスト : " + buf //アルバム取得 szValueName = "IPRD" + szValueName_End mp3infp_GetValue varptr(szValueName), varptr(bufp) if stat!=0 : dupptr buf, bufp, 256, 2 :mes "アルバム : " + buf //他のszValueName値は"mp3infp_ExportFunc_HSP.as"を参照
ちょっと取得の仕方が独特な感じですが、概ね上記のような手順で取得します。
下記のコードを"mp3infp_ExportFunc_HSP.as"としてファイル保存して#includeして使ってください。

他命令の使い方や詳細は"mp3infp_ExportFunc_HSP.as"に書いてあるのでそちらを見てください。

//mp3infp_ExportFunc.h をHSP用に書き直したものです。 #ifndef _MP3INFP_EXPORT_FUNC_H #define _MP3INFP_EXPORT_FUNC_H #uselib "mp3infp.dll" /*======================================================================================= 名前: mp3infp_GetVer 概要: mp3infpのバージョンを取得する 引数: なし 戻値: DWORD バージョン情報 Ver.2.11 = 0x0211 備考: 対応: Ver2.11〜 */ #func global mp3infp_GetVer "mp3infp_GetVer" /*======================================================================================= 名前: mp3infp_ViewPropEx 概要: mp3infpに対応したファイル形式のプロパティを開く(モーダルダイアログ版) 説明: 指定ファイルのプロパティをmp3infpのタブをアクティブにして開きます ※シェルエクステンションを使用せずにmp3infp.dll単独の動作となります ※シェルエクステンション標準のプロパティページは表示されません 引数: IN HWND hWnd 呼び出し元ウインドウハンドル 呼び出し元ウインドウ上にダイアログを表示します NULLならデスクトップを指定したとみなします IN char *szFileName 対象ファイル名をフルパスで指定。 IN DWORD dwPage ・mp3infpの何ページ目をアクティブにするか指定する(0=ID3v1 / 1=ID3v2 / 2=RiffSIF / 3=APE(Ver2.47)) ・タグを含まないmp3の場合のみ有効 ・タグを含む場合はID3v2/APE/RiffSIF/ID3v1の順で検索して、最初に見つかったタグをアクティブにします IN BOOL modeless TRUEならプロパティを表示したまま制御を返します。戻り値にはプロパティのウインドウハンドルが入ります。 FALSEならプロパティを閉じるまで制御を返しません。 DWORD param1 未使用(0を指定してください) DWORD param2 未使用(0を指定してください) 戻値: int 成功=0以上/失敗=-1 対応: Ver2.48〜 */ #func global mp3infp_ViewPropEx "mp3infp_ViewPropEx" int,int,int,int,int,int /*======================================================================================= 名前: mp3infp_ViewProp 概要: mp3infpに対応したファイル形式のプロパティを開く 説明: 指定ファイルのプロパティをmp3infpのタブをアクティブにして開きます 引数: IN HWND hWnd 呼び出し元ウインドウハンドル IN char *szFileName 対象ファイル名をフルパスで指定。 IN DWORD dwPage ・mp3infpの何ページ目をアクティブにするか指定する(0=ID3v1 / 1=ID3v2 / 2=RiffSIF / 3=APE(Ver2.47)) ・タグを含まないmp3の場合のみ有効 ・タグを含む場合はID3v2/APE/RiffSIF/ID3v1の順で検索して、最初に見つかったタグをアクティブにします 戻値: BOOL 成功=TRUE/失敗=FALSE 対応: Ver2.00〜 */ #func global mp3infp_ViewProp "mp3infp_ViewProp" int,int,int /*======================================================================================= 名前: mp3infp_Load 概要: タグ情報をロードする 引数: IN HWND hWnd 呼び出し元ウインドウを指定します。無い場合はNULL。 IN const char *szFileName 対象ファイル名をフルパスで指定。 戻値: DWORD -1=ロード失敗 ERROR_SUCCESS=成功 (その他)=Win32エラーコード (FormatMessageで文字列を取得できる) 対応: Ver2.26〜 */ #func global mp3infp_Load "mp3infp_Load" int, int /*======================================================================================= //////////////////////////////////////////////////////////////////// 表1 mp3infp_GetValue()/mp3infp_SetValue()でszValueNameに指定する名前一覧 //////////////////////////////////////////////////////////////////// [共通](※1) ファイル名 "FILE" (v2.41〜) 拡張子 "FEXT" (v2.41〜) パス "PATH" (v2.41〜) サイズ(byte単位) "SIZ1" (v2.41〜) サイズ(Kbyte単位) "SIZK" (v2.41〜) サイズ(Mbyte単位) "SIZM" (v2.41〜) [MP3] ID3v1 ID3v2 RiffSIF APE フォーマット(※1) "AFMT" "AFMT" "AFMT" "AFMT" 演奏時間(※1) "TIME" "TIME" "TIME" "TIME" タイトル "INAM_v1" "INAM_v2" "INAM_rmp" "INAM_APE" アーティスト "IART_v1" "IART_v2" "IART_rmp" "IART_APE" アルバム "IPRD_v1" "IPRD_v2" "IPRD_rmp" "IPRD_APE" コメント "ICMT_v1" "ICMT_v2" "ICMT_rmp" "ICMT_APE" 作成日 "ICRD_v1" "ICRD_v2" "ICRD_rmp" "ICRD_APE" ジャンル "IGNR_v1" "IGNR_v2" "IGNR_rmp" "IGNR_APE" (ID3v2/RiffSIF) 著作権 "ICOP_v2" "ICOP_rmp" ソフトウェア/エンコーダ "ISFT_v2" "ISFT_rmp" (ID3v2) 作曲 "COMP_v2" Orig.アーティスト "OART_v2" URL "URL_v2" エンコードした人 "ENC2_v2" (RiffSIF) ソース "ISRC_rmp" エンジニア "IENG_rmp" (ID3v1/2) トラック番号 "TRACK_v1" "TRACK_v2" "TRACK_APE" [WAV] フォーマット(※1) "AFMT" 演奏時間(※1) "TIME" タイトル(※2) "INAM" タイトル(※2) "ISBJ" アーティスト "IART" アルバム "IPRD" コメント "ICMT" 作成日 "ICRD" ジャンル "IGNR" 著作権 "ICOP" ソフトウェア "ISFT" ソース "ISRC" エンジニア "IENG" [AVI] 音声フォーマット(※1) "AFMT" 映像フォーマット(※1) "VFMT" 時間(※1) "TIME" タイトル(※2) "INAM" タイトル(※2) "ISBJ" アーティスト "IART" コメント "ICMT" 作成日 "ICRD" ジャンル "IGNR" 著作権 "ICOP" ソフトウェア "ISFT" ソース "ISRC" エンジニア "IENG" AVIバージョン "AVIV" (v2.37〜) [VQF] フォーマット(※1) "AFMT" 演奏時間(※1) "TIME" タイトル "INAM" アーティスト "IART" コメント "ICMT" 著作権 "ICOP" 保存名 "FILE" [WMA] 音声フォーマット(※1) "AFMT" 映像フォーマット(※1) "VFMT" 時間(※1) "TIME" タイトル "INAM" トラック "TRACK" アーティスト "IART" アルバム "IPRD" コメント "ICMT" 作成日 "ICRD" ジャンル "IGNR" 著作権 "ICOP" URL(Album) "URL1" URL(関連) "URL2" [OGG] フォーマット(※1) "AFMT" 演奏時間(※1) "TIME" タイトル "INAM" アーティスト "IART" アルバム "IPRD" コメント "ICMT" 作成日 "ICRD" ジャンル "IGNR" トラック番号 "TRACK" [APE] フォーマット(※1) "AFMT" 演奏時間(※1) "TIME" タイトル "INAM" アーティスト "IART" アルバム "IPRD" コメント "ICMT" 作成日 "ICRD" ジャンル "IGNR" トラック番号 "TRACK" [MP4] (v2.53〜) 音声フォーマット(※1) "AFMT" 映像フォーマット(※1) "VFMT" タイトル "INAM" アーティスト "IART" アルバム "IPRD" グループ "IGRP" 作曲 "COMPOSER" ジャンル "IGNR" トラック番号1 "TRACK1" (1以上の数値) トラック番号2 "TRACK2" (1以上の数値) ディスク番号1 "DISC1" (1以上の数値) ディスク番号2 "DISC2" (1以上の数値) テンポ "BPM" (数値) 作成日 "ICRD" (4桁の数値 例:"2004") コンピレーション "COMPILATION" ("1" or "0") コメント "ICMT" ツール "TOOL" (※1)mp3infp_SetValue()では利用できません。 (※2)mp3infpではロード時にINAMを優先、無ければISBJを表示。セーブ時にはISBJを削除、INAMを保存します。 */ #define global MP3INFP_FILE_UNKNOWN 0x00 #define global MP3INFP_FILE_MP3 0x01 #define global MP3INFP_FILE_WAV 0x02 #define global MP3INFP_FILE_AVI 0x03 #define global MP3INFP_FILE_VQF 0x04 #define global MP3INFP_FILE_WMA 0x05 #define global MP3INFP_FILE_OGG 0x07 #define global MP3INFP_FILE_APE 0x08 #define global MP3INFP_FILE_MP4 0x09 /*======================================================================================= 名前: mp3infp_GetType 概要: ファイルの種類を取得する 補足: mp3infp_Load()の後に呼び出してください 引数: なし 戻値: DWORD #define MP3INFP_FILE_UNKNOWN 0x00 #define MP3INFP_FILE_MP3 0x01 #define MP3INFP_FILE_WAV 0x02 #define MP3INFP_FILE_AVI 0x03 #define MP3INFP_FILE_VQF 0x04 #define MP3INFP_FILE_WMA 0x05 #define MP3INFP_FILE_OGG 0x07 #define MP3INFP_FILE_APE 0x08 対応: Ver2.26〜 #define MP3INFP_FILE_MP4 0x09 対応: Ver2.53〜 */ #func global mp3infp_GetType "mp3infp_GetType" /*======================================================================================= 名前: mp3infp_GetValue 概要: タグ情報を取得する 補足: mp3infp_Load()の後に呼び出してください 引数: IN const char *szValueName タグの種類を示す名前(表1を参照) OUT char **buf タグ情報を示すバッファのポインタを受け取るポインタ 戻値: BOOL 成功=TRUE/失敗=FALSE 対応: Ver2.26〜 */ #func global mp3infp_GetValue "mp3infp_GetValue" int,int #define global MP3INFP_HAS_MP3_ID3V1 0x00000001 #define global MP3INFP_HAS_MP3_ID3V2 0x00000002 #define global MP3INFP_HAS_MP3_RIFFSIF 0x00000004 #define global MP3INFP_HAS_MP3_ID3V1_0 0x00000008 // v2.43〜 #define global MP3INFP_HAS_MP3_ID3V1_1 0x00000010 // v2.43〜 #define global MP3INFP_HAS_MP3_ID3V2_2 0x00000020 // v2.43〜 #define global MP3INFP_HAS_MP3_ID3V2_3 0x00000040 // v2.43〜 #define global MP3INFP_HAS_MP3_ID3V2_4 0x00000080 // v2.43〜 #define global MP3INFP_HAS_MP3_APEV1 0x00000100 // v2.47〜 #define global MP3INFP_HAS_MP3_APEV2 0x00000200 // v2.47〜 /*======================================================================================= 名前: mp3infp_mp3_GetTagType 概要: mp3が持っているタグの種類を取得する 補足: mp3infp_Load()の後に呼び出してください 引数: なし 戻値: DWORD (OR) #define MP3INFP_HAS_MP3_ID3V1 0x00000001 #define MP3INFP_HAS_MP3_ID3V2 0x00000002 #define MP3INFP_HAS_MP3_RIFFSIF 0x00000004 #define MP3INFP_HAS_MP3_ID3V1_0 0x00000008 // v2.43〜 #define MP3INFP_HAS_MP3_ID3V1_1 0x00000010 // v2.43〜 #define MP3INFP_HAS_MP3_ID3V2_2 0x00000020 // v2.43〜 #define MP3INFP_HAS_MP3_ID3V2_3 0x00000040 // v2.43〜 #define MP3INFP_HAS_MP3_ID3V2_4 0x00000080 // v2.43〜 #define MP3INFP_HAS_MP3_APEV1 0x00000100 // v2.47〜 #define MP3INFP_HAS_MP3_APEV2 0x00000200 // v2.47〜 対応: Ver2.27〜 */ #func global mp3infp_mp3_GetTagType "mp3infp_mp3_GetTagType" /*======================================================================================= 名前: mp3infp_SetConf 概要: mp3infpの動作設定 引数: IN char *tag 設定項目(表2参照) IN char *val 設定値(表2参照) 戻値: BOOL 成功=TRUE/失敗=FALSE 対応: Ver2.42〜 補足: ・他のプロセスのmp3infp.dll/シェル拡張のmp3infpには影響しない ・設定内容は保存されない */ #func global mp3infp_SetConf "mp3infp_SetConf" int,int /*======================================================================================= //////////////////////////////////////////////////////////////////// mp3infp_SetConf()指定する設定項目・値一覧 //////////////////////////////////////////////////////////////////// [Waveファイルのコーデック名称の取得方法](Ver2.42〜) (項目名) "wave_CodecFind" (値) "0"(default) mp3infp内蔵辞書 → Windows APIを利用の順で検索(高速) "1" Windows APIを利用 → 自力解析の順で検索(低速) "2" mp3infp内蔵辞書(高速) "3" Windows APIを利用(低速) [Aviファイルのコーデック名称の取得方法](Ver2.42〜) (項目名) "avi_CodecFind" (値) "0"(default) mp3infp内蔵辞書 → Windows APIを利用の順で検索(高速) "1" Windows APIを利用 → 自力解析の順で検索(低速) "2" mp3infp内蔵辞書(高速) "3" Windows APIを利用(低速) [ID3v1で拡張ジャンルを使用する](Ver2.43〜) (項目名) "mp3_UseExtGenre" (値) "0"(default) 無効 "1" 有効 [ID3v2で文字列をUnicodeで書き込む](Ver2.43〜) (項目名) "mp3_ID3v2Unicode" (値) "0"(default) 無効 "1" 有効 [ID3v2を非同期化する](Ver2.43〜) (項目名) "mp3_ID3v2Unsync" (値) "0" 無効 "1"(default) 有効 [保存時のID3v2バージョン](Ver2.43〜) ※この設定値はmp3infp_Load()の実行によって上書きされます。 (項目名) "mp3_SaveID3v2Version" (値) "2.2" ID3v2.2 "2.3"(default) ID3v2.3 "2.4" ID3v2.4 */ /*======================================================================================= 名前: mp3infp_SetValue 概要: タグ情報を設定する 補足: mp3infp_Load()の後に呼び出してください 引数: IN const char *szValueName タグの種類を示す名前(表1を参照) IN const char *buf タグ情報を示す文字列 戻値: DWORD -1=失敗 ERROR_SUCCESS=成功 対応: Ver.2.43〜 */ #func global mp3infp_SetValue "mp3infp_SetValue" str,str /*======================================================================================= 名前: mp3infp_Save 概要: タグ情報を保存する 補足: mp3infp_Load()の後に呼び出してください 引数: IN const char *szFileName 対象ファイル名をフルパスで指定。 戻値: DWORD -1=失敗 -2=2Gバイトを超えるファイルを扱うことはできません。(WAVファイルのみ) ERROR_SUCCESS=成功 (その他)=Win32エラーコード (FormatMessageで文字列を取得できる) 対応: Ver.2.43〜 */ #func global mp3infp_Save "mp3infp_Save" int /*======================================================================================= 名前: mp3infp_mp3_MakeId3v1 概要: ID3TAG V1を作成する 補足: mp3infp_Load()の後に呼び出してください 変更は直ちに反映されます mp3ファイルにのみ利用してください(wavファイルは対象外) 引数: IN char *szFileName 対象ファイル名をフルパスで指定。 戻値: DWORD -1=失敗 ERROR_SUCCESS=成功 (その他)=Win32エラーコード (FormatMessageで文字列を取得できる) 対応: Ver.2.43〜 */ #func global mp3infp_mp3_MakeId3v1 "mp3infp_mp3_MakeId3v1" int /*======================================================================================= 名前: mp3infp_mp3_DelId3v1 概要: ID3TAG V1を削除する 補足: mp3infp_Load()の後に呼び出してください 変更は直ちに反映されます mp3ファイルにのみ利用してください(wavファイルは対象外) 引数: IN char *szFileName 対象ファイル名をフルパスで指定。 戻値: DWORD -1=失敗 ERROR_SUCCESS=成功 (その他)=Win32エラーコード (FormatMessageで文字列を取得できる) 対応: Ver.2.43〜 */ #func global mp3infp_mp3_DelId3v1 "mp3infp_mp3_DelId3v1" int /*======================================================================================= 名前: mp3infp_mp3_MakeId3v2 概要: ID3TAG V2を作成する 補足: mp3infp_Load()の後に呼び出してください 変更は直ちに反映されます mp3ファイルにのみ利用してください(wavファイルは対象外) 引数: IN char *szFileName 対象ファイル名をフルパスで指定。 戻値: DWORD -1=失敗 ERROR_SUCCESS=成功 (その他)=Win32エラーコード (FormatMessageで文字列を取得できる) 対応: Ver.2.43〜 */ #func global mp3infp_mp3_MakeId3v2 "mp3infp_mp3_MakeId3v2" int /*======================================================================================= 名前: mp3infp_mp3_DelId3v2 概要: ID3TAG V2を削除する 補足: mp3infp_Load()の後に呼び出してください 変更は直ちに反映されます mp3ファイルにのみ利用してください(wavファイルは対象外) 引数: IN char *szFileName 対象ファイル名をフルパスで指定。 戻値: DWORD -1=失敗 ERROR_SUCCESS=成功 (その他)=Win32エラーコード (FormatMessageで文字列を取得できる) 対応: Ver.2.43〜 */ #func global mp3infp_mp3_DelId3v2 "mp3infp_mp3_DelId3v2" int /*======================================================================================= 名前: mp3infp_mp3_MakeRMP 概要: mp3形式からRMP形式に変換する 補足: mp3infp_Load()の後に呼び出してください 変更は直ちに反映されます mp3ファイルにのみ利用してください(wavファイルは対象外) 引数: IN char *szFileName 対象ファイル名をフルパスで指定。 戻値: DWORD -1=失敗 ERROR_SUCCESS=成功 (その他)=Win32エラーコード (FormatMessageで文字列を取得できる) 対応: Ver.2.43〜 */ #func global mp3infp_mp3_MakeRMP "mp3infp_mp3_MakeRMP" int /*======================================================================================= 名前: mp3infp_mp3_DelRMP 概要: RMP形式からmp3形式に変換する 補足: mp3infp_Load()の後に呼び出してください 変更は直ちに反映されます mp3ファイルにのみ利用してください(wavファイルは対象外) 引数: IN char *szFileName 対象ファイル名をフルパスで指定。 戻値: DWORD -1=失敗 ERROR_SUCCESS=成功 (その他)=Win32エラーコード (FormatMessageで文字列を取得できる) 対応: Ver.2.43〜 */ #func global mp3infp_mp3_DelRMP "mp3infp_mp3_DelRMP" int /*======================================================================================= 名前: mp3infp_mp3_MakeApeTag 概要: APE Tagを作成する 補足: mp3infp_Load()の後に呼び出してください 変更は直ちに反映されます mp3ファイルにのみ利用してください(wavファイルは対象外) 引数: IN char *szFileName 対象ファイル名をフルパスで指定。 戻値: DWORD -1=失敗 ERROR_SUCCESS=成功 (その他)=Win32エラーコード (FormatMessageで文字列を取得できる) 対応: Ver.2.47〜 */ #func global mp3infp_mp3_MakeApeTag "mp3infp_mp3_MakeApeTag" int /*======================================================================================= 名前: mp3infp_mp3_DelApeTag 概要: APE Tagを削除する 補足: mp3infp_Load()の後に呼び出してください 変更は直ちに反映されます mp3ファイルにのみ利用してください(wavファイルは対象外) 引数: IN char *szFileName 対象ファイル名をフルパスで指定。 戻値: DWORD -1=失敗 ERROR_SUCCESS=成功 (その他)=Win32エラーコード (FormatMessageで文字列を取得できる) 対応: Ver.2.47〜 */ #func global mp3infp_mp3_DelApeTag "mp3infp_mp3_DelApeTag" int #endif //_MP3INFP_EXPORT_FUNC_H
現在は、他の方が開発を引き継いでUnicode版に対応させたものもあるようです。



HSP太郎

リンク

2019/1/8(Tue) 20:30:26|NO.86292

返事が遅れましてすみません。皆様ありがとうございました!!



歌川史郎

リンク

2019/1/8(Tue) 20:41:28|NO.86293

今のところ曲の長さだけを取得したいです。
それだけならばmp3以外の

dialog"mp3;*.mp2;*.mp1;*.ogg;*.wav;*.aiff;*.flac;*.alac;*.wma;*.asf;*.m4a;*.aac|mp3;*.mp2;*.mp1|wav;*.aiff|flac;*.alac",16,"オーディオファイル|MPEG オーディオ|無圧縮オーディオ|ロスレス圧縮音源"
これらのものの長さを取得したいです。



ONION software Copyright 1997-2023(c) All rights reserved.