Ein Programm von mir verwendet AxShockwaveFlash Komponente als Stream-Player verwendet. Das Problem ist, dass mein Code mit den meisten Stream-Providern (Livestream, ustream, own3d.tv) funktioniert, aber Justin.TV-Player ist etwas problematisch.
Bevor ich auf das eigentliche Problem eingehe, möchte ich meinen Code zusammenfassen;
Vererbtes FlashControl - damit kann ich das integrierte Menü des Flashplayers außer Kraft setzen:
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 des Spielerfensters: (Player ist eine Instanz von 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.
}
}
Also das funktioniert super für livestream.com, ustream.com, own3d.tv, aber wenn es zu justin.tv's Player kommt, bekomme ich einen 1337 Fehler (ungültiger Einbettungscode). Also habe ich versucht sie fragen um Unterstützung gebeten, konnte aber keine gültige Antwort erhalten.
Die Variable _stream.movie enthält eine gültige URL für die Stream-Quelle wie;
http://cdn.livestream.com/grid/LSPlayer.swf?channel=%slug%&autoPlay=true (Livestream-Beispiel)
oder
http://www.justin.tv/widgets/live_embed_player.swf?channel=%slug%&auto_play=true&start_volume=100 (justin.tv-Probe)
Ich habe versucht, den Teil 'channel=%slug%&auto_play=true&start_volume=100' für justin.tv zu urlencodieren, aber auch das hat nicht funktioniert.
So begann ich versuchen einige Workarounds, die auf den ersten Platz, den ich dachte, Einstellung flashVars Variable des Steuerelements.
Aber ich habe ein seltsames Problem, wenn ich versuche, die flashVars-Variable zu setzen, wird sie nie gesetzt. Ich habe ein Beispiel-Screenshot zu diesem Problem gefunden;
Wenn ich also in der Lage wäre, die flashVariables zu setzen, könnte ich vielleicht den Fehler des justin.tv-Players umgehen. Btw, ich habe auch versucht, Variablen mit Player.SetVariable(key,value) zu setzen - das hat auch nicht funktioniert.
Notas:
- Ich verwende ein .net 4.0 Client-Profil.
- Verwendung der Flash10l.ocx.
- Ich habe die Wrapper AxShockwaveFlashObjects.dll und ShockwaveFlashObjects.dll mit "aximp.exe -source " erzeugt. C:\WINDOWS\system32\Macromed\Flash\Flash10l.ocx "