トップページ > 過去ログ > 記事閲覧
BGMをループさせた際に無音が入る
名前:高達 日時: 2012/07/16 20:53

メモリに読み込ませたMP3データをSetLoopPosSoundMem関数を使ってループ点指定させ、 音楽のループ再生をさせたのですが、ループに入る際に20ミリ秒ほどの無音が入ります。 特に重い処理はさせておらず、フレームレートを計測しても60fpsを保っているので 注意書きにあったような0.2秒以上の間隔は空けてないはずなのですが・・・。 ちなみにSoundEngineにてループ点を調べましたが問題なく再生されました。

Page: 1 |

Re: BGMをループさせた際に無音が入る ( No.1 )
名前:いっち 日時:2012/07/16 23:21

事象の再現するコードとデータをご提供いただけますか?
Re: BGMをループさせた際に無音が入る ( No.2 )
名前:高達 日時:2012/07/17 00:27

www1.axfc.net/uploader/Ne/so/136239 pass: dx こちらになります。 音楽の読み込み、再生停止などはbgm_dataの中にあります。 実行ファイルに同梱のbgm.txtに「(曲名),(曲のパス),(ループ点)」を入力しておくと 再生ボタンを押したときに読み込まれます。 よろしくお願いします。
Re: BGMをループさせた際に無音が入る ( No.3 )
名前:いっち 日時:2012/07/17 18:57

以下のような設定でループ再生を行うことで"ドラキュラ城.mp3"に関してはそれっぽく聞こえているように感じました。 SetLoopStartTimePosSoundMem を使用してループ再生を行った場合とそうでない場合で DXライブラリのループ再生の品質が変わることは無さそうなので、 この事象は仕様(もしくは音楽ファイルに問題がある)という事になると思います。 管理人さんにご確認頂きたいということでしたら、ファイルは消さずに残しておいて下さい。 //- 以下、テストコード ("ドラキュラ城.mp3"を使用)-// #include "DxLib.h" int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int ) { ChangeWindowMode( TRUE ); SetWindowText( "DxLib:" DXLIB_VERSION_STR ); if ( DxLib_Init( ) == -1 ) return -1; int white = GetColor( 255, 255, 255 ); // DX_SOUNDDATATYPE_MEMNOPRESS // DX_SOUNDDATATYPE_MEMPRESS // DX_SOUNDDATATYPE_FILE // SetCreateSoundDataType( DX_SOUNDDATATYPE_FILE ); int sh = LoadSoundMem( "ドラキュラ城.mp3" ); int at = GetSoundTotalTime( sh ); SetSoundCurrentTime( at - 4000, sh ); SetLoopPosSoundMem( 23834 + 35, sh ); SetLoopStartTimePosSoundMem( at - 25, sh ); PlaySoundMem( sh, DX_PLAYTYPE_LOOP, FALSE ); SetDrawScreen( DX_SCREEN_BACK ); while ( ProcessMessage( ) == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { ClearDrawScreen( ); DrawFormatString( 0, 0, white, "TEST %d / %d", GetSoundCurrentTime( sh ), at ); ScreenFlip( ); } DxLib_End( ); return 0; }
Re: BGMをループさせた際に無音が入る ( No.4 )
名前:高達 日時:2012/07/17 19:13

ありがとうございます。 こちらのサンプルのように組み込んでみたところ、問題なくループ再生ができました。 この事象の原因をMP3ファイルと仮定して、自分のほうで少し検証してみることにします。
Re: BGMをループさせた際に無音が入る ( No.5 )
名前:管理人 日時:2012/07/22 01:00

MP3の仕様なのかMP3のデコードに使用している機能の仕様なのかは分かりませんが、 MP3を再生するためにPCMに変換した際に、終端にもともと存在しなかった無音の要素が 追加されるようです 試しに何か無圧縮のWAVファイルを何のソフトを使っても良いのでMP3に変換した後、 再び何かのソフトを使ってWAVファイルに変換してみてください、ファイルサイズが 若干増えているのが確認できると思います ( 私が試したファイルでは 7490byte増えました、2チャンネル16ビットの場合 1サンプル辺り4バイトなので、7490 / 4 = 1872.5サンプル増えたことになり、 サンプリング周波数が 44100Hz の場合は 7490 / 44100 ≒ 0.04246 となり、 40ミリ秒ほど長くなったことになります ) このため、ループするBGMなどではループ直前に無音が一瞬入るといった現象が 発生してしまいます なので、MP3はループするBGMに使うフォーマットとしてはあまり適していません DXライブラリでは MP3 並みの圧縮率を持つ Ogg Vorbis ( 拡張子は ogg )という サウンドデータフォーマットに対応していますので、よろしければ Ogg Vrobis を 使ってみてください( wav → ogg に変換できるソフトが少ないのが難点ですが・・・ )
Re: BGMをループさせた際に無音が入る ( No.6 )
名前:高達(解決) 日時:2012/07/22 16:28

MP3の仕様?なのでしょうか。ひとまずファイル側に原因があったのは判りました。 以降はOGGファイルを使用してみます。ありがとうございました。

Page: 1 |