Установка FlashVars для AxShockwaveFlash - PullRequest
3 голосов
/ 18 января 2011

моя программа использует компонент AxShockwaveFlash, используемый в качестве потокового проигрывателя.Проблема в том, что мой код работает с большинством потоковых провайдеров (livestream, ustream, own3d.tv), но проигрыватель Justin.TV несколько проблематичен.

Прежде чем перейти к реальной проблеме, позвольте мне обобщить мой код;

Inherited FlashControl - это позволяет мне переопределить встроенное меню flashplayer:

public class FlashPlayer : AxShockwaveFlashObjects.AxShockwaveFlash // Customized Flash Player.
    {
        private const int WM_MOUSEMOVE = 0x0200;
        private const int WM_MOUSEWHEEL = 0x020A;
        private const int WM_LBUTTONDOWN = 0x0201;
        private const int WM_LBUTTONUP = 0x0202;
        private const int WM_LBUTTONDBLCLK = 0x0203; 
        private const int WM_RBUTTONDOWN = 0x0204;
        private const int WM_RBUTTONUP = 0x0205;                      

        public new event MouseEventHandler DoubleClick;
        public new event MouseEventHandler MouseDown;
        public new event MouseEventHandler MouseUp;
        public new event MouseEventHandler MouseMove;

        public FlashPlayer():base()
        {
            this.HandleCreated += FlashPlayer_HandleCreated;
        }

        void FlashPlayer_HandleCreated(object sender, EventArgs e)
        {
            this.AllowFullScreen = "true";
            this.AllowNetworking = "all";
            this.AllowScriptAccess = "always";
        }

        protected override void WndProc(ref Message m) // Override's the WndProc and disables Flash activex's default right-click menu and if exists shows the attached ContextMenuStrip.
        {
            if (m.Msg == WM_LBUTTONDOWN)
            {
                if (this.MouseDown != null) this.MouseDown(this, new MouseEventArgs(System.Windows.Forms.MouseButtons.Left, 1, Cursor.Position.X, Cursor.Position.Y, 0));
            }
            else if (m.Msg == WM_LBUTTONUP)
            {
                if (this.MouseUp != null) this.MouseUp(this, new MouseEventArgs(System.Windows.Forms.MouseButtons.None, 0, Cursor.Position.X, Cursor.Position.Y, 0));
            }
            else if (m.Msg == WM_MOUSEMOVE)
            {
                if (this.MouseMove != null) this.MouseMove(this, new MouseEventArgs(System.Windows.Forms.MouseButtons.None, 0, Cursor.Position.X, Cursor.Position.Y, 0));
            }
            else if (m.Msg == WM_RBUTTONDOWN)
            {
                if (this.ContextMenuStrip != null) this.ContextMenuStrip.Show(Cursor.Position.X, Cursor.Position.Y);
                m.Result = IntPtr.Zero;
                return;
            }
            else if (m.Msg == WM_LBUTTONDBLCLK)
            {
                if (this.DoubleClick != null) this.DoubleClick(this, new MouseEventArgs(System.Windows.Forms.MouseButtons.Left, 2, Cursor.Position.X, Cursor.Position.Y, 0));
                m.Result = IntPtr.Zero;
                return;
            }

            base.WndProc(ref m);
        }
    }

Окно проигрывателяcode: (Player является экземпляром FlashPlayer)

private void Player_Load(object sender, EventArgs e) 
        {
            try
            {
                this.Text = string.Format("Stream: {0}", this._stream.Name); // set the window title.
                this.Player.LoadMovie(0, this._stream.Movie); // load the movie.

                if (this._stream.ChatAvailable && Settings.Instance.AutomaticallyOpenChat) this.OpenChatWindow();
            }
            catch (Exception exc)
            {
                // log stuff.
            }
        }

Так что это прекрасно работает для livestream.com, ustream.com, own3d.tv, но когда дело доходит до игрока justin.tv, я получаю 1337ошибка (неверный код встраивания).Поэтому я попытался попросить у них поддержки, но не смог получить правильный ответ.

Переменная _stream.movie на самом деле содержит действительный URL для источника потока, например;

http://cdn.livestream.com/grid/LSPlayer.swf?channel=%slug%&autoPlay=true (пример прямой трансляции)

или

http://www.justin.tv/widgets/live_embed_player.swf?channel=%slug%&auto_play=true&start_volume=100 (образец justin.tv)

Попытка urlencode части 'channel =% slug% & auto_play = true & start_volume = 100' для justin.tv, но это тоже не сработало.

Так что я начал пробовать некоторые обходные пути, которые в первую очередь яМысль установка переменной flashVars элемента управления.

Но у меня возникает странная проблема: всякий раз, когда я пытаюсь установить переменную flashVars, она никогда не будет установлена.Я нашел пример скриншота по этой проблеме:

alt text

Так что, если бы я смог установить flashVariables, я мог бы обойти ошибку проигрывателя justin.tv.Кстати, я также попытался установить переменные с помощью Player.SetVariable (ключ, значение) - это тоже не сработало.

Примечания:

  • Я использую профиль клиента .net 4.0.
  • Использование Flash10l.ocx.
  • Сгенерировали оболочки AxShockwaveFlashObjects.dll, ShockwaveFlashObjects.dll с использованием «aximp.exe –source» C: \ WINDOWS \ system32 \ Macromed \ Flash \ Flash10l.ocx "

1 Ответ

2 голосов
/ 26 июня 2012

У меня недавно была проблема с работой justin.tv, но в итоге все было просто, как

axShockwaveFlash1.FlashVars = "auto_play=true&channel=adventuretimed&start_volume=25";
axShockwaveFlash1.Movie = "http://www.justin.tv/widgets/live_embed_player.swf";

и отлично работает

...