Установка FlashVars для AxShockwaveFlash
Моя программа использует компонент 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);
}
}
Код окна проигрывателя: (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, она никогда не устанавливается. Я нашел образец скриншота по этому вопросу;
Поэтому, если бы я мог установить 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 ответ
Недавно у меня возникла проблема с работой justin.tv, но в итоге все было так просто, как
axShockwaveFlash1.FlashVars = "auto_play=true&channel=adventuretimed&start_volume=25";
axShockwaveFlash1.Movie = "http://www.justin.tv/widgets/live_embed_player.swf";
и работает отлично