4

MCIERR_INTERNALI は、アプリ内で単純なメディア プレーヤーを作成しようとしていますが、ファイルが 192kbps 以下の低ビットレートでない限り、私のコードは音楽を再生しないことに気付きました。問題は、私の音楽のほとんどが 260 ~ 320kbps 前後であることです。

これが私のコードです。「利用可能な」ビットレートオプションを上げるために何かできることがあれば教えてください。それ以外の場合は、新しい DLL の提案が必要です!

class MusicPlayer
{
    [DllImport("winmm.dll")]
    private static extern long mciSendString(string lpstrCommand, StringBuilder lpstrReturnString, int uReturnLength, int hwndCallback);

    private static void checkMCIResult(long code)
    {
        int err = (int)(code & 0xffffffff);
        if (err != 0)
        {
            throw new Exception(string.Format("MCI error {0}", err));
        }
    }

    public void open(string file)
    {
        string command = "open \"" + file + "\" type MPEGVideo alias MyMp3";
        checkMCIResult(mciSendString(command, null, 0, 0));
    }

    public void play()
    {
        string command = "play MyMp3";
        mciSendString(command, null, 0, 0);
    }
    public void pause()
    {
        string command = "stop MyMp3";
        mciSendString(command, null, 0, 0);
    }
}

**編集: -Winform アプリケーション

- Windows 7 sp1 を使用

-Visual Studio 2013 コミュニティ エディションの使用

- エラー キャッチから、エラー番号が 289、-256 = 22: MCIERR_INTERNAL であることがわかりました。

4

3 に答える 3

6

これは Windows 固有の制限ではありません。このような問題は環境の問題です。基本的なチェックリスト:

  • 正常な MP3 ファイルでこれを試してください。このテスト ファイルは 320 kbps でエンコードされています。これは、承認されたプレーヤーでの再生のみを許可する不安定な DRM スキームなど、ファイルに関する特定の問題を排除するのに役立ちます。
  • このコードは、Winforms または WPF アプリによって提供される種類の STA スレッドで実行してください。 コンソール モードのアプリではなく、この投稿にあるようなコードが必要です。
  • 非標準の ACM ドライバーがインストールされていることに注意してください。そこにはたくさんのがらくたがあります。「コーデック パック」は常に強い不信感を持って扱ってください。ACM ドライバーが登録されている HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32 レジストリ キーを確認します。
  • 最後になりましたが、mciSendString() の戻り値を無視している限り、あなたは盲目です。失敗すると、理由を示すエラー コードが生成されます。

エラー チェッカー メソッドの簡単な実装:

    private static void checkMCIResult(long code) {
        int err = (int)(code & 0xffffffff);
        if (err != 0) {
            throw new Exception(string.Format("MCI error {0}", err));
        }
    }

使用法:

    public static void open(string file) {
        string command = "open \"" + file + "\" type MPEGVideo alias MyMp3";
        checkMCIResult(mciSendString(command, null, 0, 0));
    }

考えられる MCI エラーは多数あります。それらは、マシンの Windows SDK "include" ディレクトリにある MMSystem.h ファイルに一覧表示されています。C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include\MMSystem.h のように。MCIERR_INVALID_DEVICE_ID から開始し、エラー コードから 256 を減算します。WindowsとVSのバージョンを常に言及してください。

于 2014-11-20T18:35:37.127 に答える
1

わかりましたので、私はこれを理解しました(@Hans Passantのおかげで)、私が受け取ったエラーコードは277でした.MCIと大きなID3(v2.x)タグを持つmp3に問題があることがわかりました-アルバムアート、歌詞など.

偶然にも、私が問題を起こした 2 つのファイルには、アルバム アートがあり、ID3 データ (歌詞を含む) が完全に記入されていました。だから私は自分のニーズに合わせて他のオーディオライブラリに切り替えます

于 2014-11-20T19:19:52.660 に答える
0

特定の MP3 ファイルを再生する、または再生しない Windows API に関する一般的な問題は次のとおりです。標準の MP3 読み取り/解析コンポーネントの 1 つには、最初に読み取り、タグをスキップして実際のビットストリームに到達するための [おそらく?、16KB が問題であるという印象を受けています] 固定サイズのバッファがあります。多くのタグがあると、パーサーはデータを読み取ることができず、ファイルを再生不可能として拒否します。

DirectShow で再生する場合 (C# コードの場合、通常は DirectShow.NET オープン ソース ライブラリを介して再生します)、タグの問題がない、MP3 ファイルを読み取ることができる別のストック Windows コンポーネントを使用することをお勧めします: Windows Media ASF Reader フィルター.

関連参照:

これは長年の問題ですが、Microsoft は何年も前に、標準の MPEG-1 ストリーム スプリッターを更新しないことを決定しました。この問題は、基本的にすべての Windows バージョンに存在します。

于 2014-11-20T19:27:26.467 に答える