クイックスタート
1
DLL を配置する
mruopus.dll を呼び出し元 EXE と同じフォルダに配置します。
Visual C++ 再頒布可能パッケージ (vcredist) が未インストールの場合はインストールしてください。
2
DLL を動的ロードする
LoadLibraryW(L"mruopus.dll") で DLL をロードします。
スタティックリンクやインポートライブラリは不要です。
3
関数ポインタを取得する
GetProcAddress() で必要な関数ポインタを取得します。
OpusDllExports.h に全 API のシグネチャが記載されています。
4
初期化して再生する
Opus_InternalInit() → OpusPlayer_Create() →
OpusPlayer_LoadFile() → OpusPlayer_Play() の順に呼び出します。
終了時は OpusPlayer_Destroy() → Opus_FinalizeAll() → FreeLibrary()。
API 早見表
初期化 / 終了
| Opus_InternalInit() | DLL 初期化(起動直後に 1 度呼ぶ) |
| Opus_FinalizeAll() | DLL 終了処理(FreeLibrary 前に呼ぶ) |
| Opus_GetVersionString() | バージョン文字列取得(wchar_t*)— __stdcall |
| Opus_GetBuildInfo() | ビルド情報取得(SIMD レベル等)— __stdcall |
| Opus_GetLastError() | 最後のエラーメッセージ取得(char*) |
再生 (OpusPlayer) — 基本操作
| OpusPlayer_Create() | プレイヤーハンドル作成 |
| OpusPlayer_Destroy(h) | プレイヤー破棄 |
| OpusPlayer_LoadFile(h, path) | ファイルロード(wchar_t* パス) |
| OpusPlayer_LoadFromMemory(h, data, sz) | メモリバッファからロード |
| OpusPlayer_Play(h) | 再生開始 |
| OpusPlayer_Stop(h) | 再生停止 |
| OpusPlayer_Pause(h, BOOL) | 一時停止 / 再開 |
| OpusPlayer_SeekMs(h, ms) | ミリ秒シーク |
| OpusPlayer_IsPlaying(h) | 再生中判定 |
| OpusPlayer_IsPaused(h) | 一時停止中判定 |
再生 (OpusPlayer) — 音量 / パン / フェード
| OpusPlayer_SetVolume(h, vol) | 音量設定(0.0〜1.0) |
| OpusPlayer_GetVolume(h) | 音量取得 |
| OpusPlayer_SetMute(h, BOOL) | ミュート設定 |
| OpusPlayer_IsMuted(h) | ミュート状態取得 |
| OpusPlayer_SetPan(h, pan) | パン設定(-1.0=左 / 0.0=中央 / 1.0=右) |
| OpusPlayer_GetPan(h) | パン取得 |
| OpusPlayer_StartFadeIn(h, ms) | フェードイン開始 |
| OpusPlayer_StartFadeOut(h, ms) | フェードアウト開始 |
再生 (OpusPlayer) — ループ / 再生速度 / キューポイント
| OpusPlayer_SetLoop(h, BOOL) | ループ設定 |
| OpusPlayer_SetLoopRangeMs(h, start, end) | ループ区間設定(ms) |
| OpusPlayer_SetLoopRangeSamples(h, s, e) | ループ区間設定(samples / 48kHz 基準) |
| OpusPlayer_EnableSeamlessLoop(h, BOOL) | シームレスループ有効化 |
| OpusPlayer_SetRepeatSegment(h, msA, msB) | A-B リピート設定(ms) |
| OpusPlayer_ClearRepeatSegment(h) | A-B リピート解除 |
| OpusPlayer_SetPlaybackRate(h, rate) | 再生速度設定(Simple モード・軽量) |
| OpusPlayer_SetPlaybackRateHQ(h, rate, mode) | 高品質速度変更:0=Simple / 1=WSOLA / 2=PhaseVocoder |
| OpusPlayer_GetPlaybackRate(h) | 現在の再生速度取得 |
| OpusPlayer_AddCuePoint(h, ms, id) | キューポイント追加 |
| OpusPlayer_ClearCuePoints(h) | キューポイント全削除 |
| OpusPlayer_SetCallbacks(h, onStarted, onStopped, onEndOfStream, onCuePoint, user) | イベントコールバック設定 |
再生 (OpusPlayer) — 情報取得 / OpusTags
| OpusPlayer_GetPositionMs(h) | 現在位置取得(ms) |
| OpusPlayer_GetTotalMs(h) | 総時間取得(ms) |
| OpusPlayer_GetTotalSamples(h) | 総サンプル数取得 |
| OpusPlayer_GetSampleRate(h) | サンプルレート取得(常に 48000) |
| OpusPlayer_GetChannels(h) | チャンネル数取得 |
| OpusPlayer_GetBitrate(h) | ビットレート取得 |
| OpusPlayer_GetTitle(h) | TITLE タグ取得(wchar_t*) |
| OpusPlayer_GetArtist(h) | ARTIST タグ取得(wchar_t*) |
| OpusPlayer_GetAlbum(h) | ALBUM タグ取得(wchar_t*) |
| OpusPlayer_GetCommentCount(h) | コメント総数取得 |
| OpusPlayer_GetComment(h, i) | i 番目コメント取得(wchar_t*) |
クロスフェード (OpusCrossfade)
| OpusCrossfade_Create() | クロスフェードマネージャー作成 |
| OpusCrossfade_Destroy(h) | マネージャー破棄 |
| OpusCrossfade_Play(h, path, loop) | 再生開始 |
| OpusCrossfade_CrossfadeTo(h, path, ms, loop) | クロスフェード切り替え(ms でフェード時間指定) |
| OpusCrossfade_Stop(h, fadeMs) | 停止(フェードアウト付き) |
| OpusCrossfade_Pause(h, BOOL) | 一時停止 / 再開 |
| OpusCrossfade_SetVolume(h, vol) | マスター音量設定 |
| OpusCrossfade_IsPlaying(h) | 再生中判定 |
| OpusCrossfade_IsCrossfading(h) | クロスフェード中判定 |
効果音プール (OpusSePool)
| OpusSePool_Init(voices) | プール初期化(最大ボイス数指定) |
| OpusSePool_Finalize() | プール破棄 |
| OpusSePool_Play(path, vol) | SE 再生(ボイスハンドル返却) |
| OpusSePool_Stop(handle) | 指定 SE 停止 |
| OpusSePool_StopAll() | 全 SE 停止 |
| OpusSePool_SetVolume(h, vol) | ボイス音量設定 |
| OpusSePool_GetVolume(h) | ボイス音量取得 |
| OpusSePool_GetActiveCount() | 再生中ボイス数取得 |
エンコード (OpusEncoder)
| OpusEncoder_Create(ch, sr, br, app, frame) | エンコーダ作成 |
| OpusEncoder_GetHeaders(enc, ...) | OpusHead + OpusTags ヘッダパケット取得 |
| OpusEncoder_EncodeFrame(enc, pcm, ...) | フレームエンコード(float PCM → Opus パケット) |
| OpusEncoder_Finish(enc, totalSamples) | EOS 通知・最終パケット生成 |
| OpusEncoder_FreeBuffer(buf) | バッファ解放 |
| OpusEncoder_Destroy(enc) | エンコーダ破棄 |
| Opus_WriteOggFileFromPacketsW(...) | パケット列から Ogg ファイル書き出し |
mruopus_sample の実行方法
mruopus_sample.cpp は LoadLibrary を使った動的ロードのサンプルソースです。コマンドライン引数でファイルを指定する仕様のため、バッチファイル経由の起動が最も手軽です。
ビルド方法
Visual Studio 2022 でソリューションを開いてビルドします。
sample\project\mruopus_sample.sln
ℹ️
ビルド後、mruopus.dll はポストビルドイベントにより出力先(x64\Release\ 等)へ自動コピーされます。
コマンドラインでビルドする場合は Developer Command Prompt を開き、sample\project\ フォルダで以下を実行します。
cl ..\src\mruopus_sample.cpp /std:c++20 /W3 /EHsc /Fe:mruopus_sample.exe
その後、bin\mruopus.dll を実行ファイルと同じフォルダにコピーしてください。
実行方法 (1) — コマンドプロンプトから直接実行
bin\ フォルダ内で実行します。
REM BGM のみ再生
mruopus_sample.exe bgm.opus
REM BGM + SE(S キーで SE を再生)
mruopus_sample.exe bgm.opus se.opus
REM BGM + SE + クロスフェード先(X キーで切り替え)
mruopus_sample.exe bgm.opus se.opus next.opus
実行方法 (2) — バッチファイルを使用(推奨)
以下の内容で run_sample.bat を作成して EXE と同じフォルダに置き、ダブルクリックで起動します。
run_sample.bat
@echo off
cd /d "%~dp0"
mruopus_sample.exe bgm.opus se.opus next.opus
pause
実行方法 (3) — ドラッグ&ドロップ起動バッチ
音声ファイルをバッチアイコンにドラッグ&ドロップするだけで再生できます。
drop_play.bat
@echo off
cd /d "%~dp0"
if "%~1"=="" (
echo ファイルをこのバッチにドラッグ&ドロップしてください。
pause
exit /b 1
)
mruopus_sample.exe "%~1" "%~2" "%~3"
pause
操作キー一覧
Space 一時停止 / 再開
← Left 5 秒 巻き戻し
→ Right 5 秒 早送り
↑ Up 音量 +10%
↓ Down 音量 -10%
M ミュート切り替え
L ループ切り替え
I フェードイン(2 秒)
O フェードアウト(2 秒)
P パン切り替え(左 → 中央 → 右)
F 再生速度切り替え(1.0x / 1.25x / 1.5x / 0.75x、WSOLA モード)
A A-B リピート 設定 / 解除(現在位置から 10 秒間)
C キューポイント追加(現在位置 +3 秒)
T OpusTags 表示(Title / Artist / Album)
D デバッグ情報表示(DumpState / SIMD レベル)
S SE 再生(引数 2 が指定されている場合)
X クロスフェード切り替え(引数 3 が指定されている場合)
Q / ESC 終了
最小実装例(C++ / LoadLibrary)
// mruopus.dll を動的ロードして bgm.opus を再生する最小限のコード
#include <windows.h>
typedef void* OPUS_HANDLE;
int wmain() {
HMODULE hDll = LoadLibraryW(L"mruopus.dll");
auto Init = (BOOL (__cdecl*)()) GetProcAddress(hDll, "Opus_InternalInit");
auto Fin = (void (__cdecl*)()) GetProcAddress(hDll, "Opus_FinalizeAll");
auto Create = (OPUS_HANDLE (__cdecl*)()) GetProcAddress(hDll, "OpusPlayer_Create");
auto Destroy = (void (__cdecl*)(OPUS_HANDLE)) GetProcAddress(hDll, "OpusPlayer_Destroy");
auto Load = (BOOL (__cdecl*)(OPUS_HANDLE, const wchar_t*))
GetProcAddress(hDll, "OpusPlayer_LoadFile");
auto Play = (BOOL (__cdecl*)(OPUS_HANDLE)) GetProcAddress(hDll, "OpusPlayer_Play");
auto Stop = (void (__cdecl*)(OPUS_HANDLE)) GetProcAddress(hDll, "OpusPlayer_Stop");
Init();
OPUS_HANDLE h = Create();
Load(h, L"bgm.opus");
Play(h);
Sleep(5000); // 5 秒再生
Stop(h);
Destroy(h);
Fin();
FreeLibrary(hDll);
return 0;
}
トラブルシューティング
LoadLibrary が失敗する
mruopus.dll が EXE と同じフォルダにあるか確認してください。EXE と DLL のビット数(x86 / x64)が一致しているか、Visual C++ 再頒布可能パッケージがインストール済みかどうかもご確認ください。
OpusPlayer_Play が FALSE を返す
Opus_InternalInit() を呼んでいるか確認してください。Opus_GetLastError() でエラー内容を確認し、ファイルが有効な Ogg Opus 形式かどうかをご確認ください。
音が出ない
出力デバイスが存在しミュートされていないか確認してください。他のアプリが WASAPI 排他モードでデバイスを占有していないか、OpusPlayer_GetVolume() で音量が 0 になっていないかも確認してください。
再生速度変更で音質が低い
SetPlaybackRateHQ() で mode=1 (WSOLA) を指定するとピッチを保ちつつより自然な速度変更が可能です。mode=0 (Simple) は線形補間のみのため音質が低下します。
EXE 終了時にクラッシュする
FreeLibrary() の前に必ず Opus_FinalizeAll() を呼んでください。内部スレッドが join されずにプロセスが終了するとクラッシュします。