9

初期化エラーをトラップできるように、Windows Media Player コントロールをプログラムで作成しようとしています。コントロールをフォームにドロップする前は、すべて正常に動作していました。しかし、プログラムで再生しようとしているので、ビデオがコントロールに表示されません。黒い映像しか見えませんが、音声は聞こえます。

何か案は?

    public TrimVideoControl()
    {
        InitializeComponent();

        // Try creating WMP control
        // We do this here so we can gracefully catch errors if the control doesn't load
        try
        {

            wmPlayer = new AxWMPLib.AxWindowsMediaPlayer();
            ((System.ComponentModel.ISupportInitialize)(wmPlayer)).BeginInit();
            //SuspendLayout();
            wmPlayer.CreateControl();
            wmPlayer.Name = "wmPlayer";
            wmPlayer.Ctlenabled = true;
            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(TrimVideoControl));
            wmPlayer.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("wmPlayer.OcxState")));
            wmPlayer.Location = new Point(12, 13);
            wmPlayer.Size = new Size(636, 358);
            wmPlayer.enableContextMenu = true;
            wmPlayer.stretchToFit = true;
            wmPlayer.uiMode = "none";
            wmPlayer.settings.autoStart = false;
            wmPlayer.ErrorEvent += wmPlayer_ErrorEvent;
            wmPlayer.MediaChange += wmPlayer_MediaChange;
            wmPlayer.MediaError += wmPlayer_MediaError;
            wmPlayer.OpenStateChange += wmPlayer_OpenStateChange;
            wmPlayer.PlayStateChange += wmPlayer_PlayStateChange;
            wmPlayer.Warning += wmPlayer_Warning;
            this.Controls.Add(wmPlayer);
            ((System.ComponentModel.ISupportInitialize)(wmPlayer)).EndInit();

            //this.ResumeLayout(false);
            //this.PerformLayout(); 
            //wmPlayer.Show();
            //wmPlayer.BringToFront();
        }
        catch (Exception ex)
        {
            Logger.Error("Error creating WMP control: " + ex);
        }


    }
4

1 に答える 1

11

MediaPalyer ランタイムの作成に関する正確な問題は、コンポーネントが完全に初期化される前に、MediaPlayer の状態 (url/uimode などの設定) の変更を実行できないという事実です。VS デザイナーはコンポーネントの状態をAxHost.Stateオブジェクトとしてシリアル化し、他の設定には影響しません。実行時には、次のアプローチを使用できます。

void AddMediaPlayer(string url) {
    try {
        var wmPlayer = new AxWMPLib.AxWindowsMediaPlayer();

        ((System.ComponentModel.ISupportInitialize)(wmPlayer)).BeginInit();
        wmPlayer.Name = "wmPlayer";
        wmPlayer.Enabled = true;
        wmPlayer.Dock = System.Windows.Forms.DockStyle.Fill;
        this.Controls.Add(wmPlayer);
        ((System.ComponentModel.ISupportInitialize)(wmPlayer)).EndInit();

        // After initialization you can customize the Media Player
        wmPlayer.uiMode = "none";
        wmPlayer.URL = url;
    }
    catch { }
}
于 2012-06-05T09:34:54.983 に答える