• Hallo liebe Userinnen und User,

    nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.

    Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance.
    Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.

    Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.


    Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.

Videoausschnitt im laufenden Film vergrößern

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
Edit: Vorerst fertige Version im Beitrag #26
----------------------------------------------------------------------------------------

Die Idee entsprang mir vor einiger Zeit und ich habe dazu schon bissel was im Videotreffpunkt geschrieben und gepostet.
Es geht darum, dass ich als Motorradfahrer meistens aus mindestens zwei Perspektiven filme, nämlich vorne und hinten. Manchmal habe ich aber auch noch eine dritte Kamera dabei, dann filme ich vom Helm, von der Lenkstange (Dann sieht man den Tacho schön) und nach hinten.

Was man dann zeigen will ist meistens etwas schwer. Nicht selten rendere ich dann Bild in Bild, d.h. ich habe ein großes Bild und irgendwo in eine Ecke packe ich noch einen kleinen Ausschnitt der zweiten Kamera hin.

Was aber, wenn ich den Ausschnitt den ich als kleinen Ausschnitt in die Ecke gerendert habe groß sehen will? Das geht nicht mehr. Nach ein bisschen Aufklärung über Videostandards, Bitraten und Technik bin ich zu dem Schluss gekommen, dass man mehrere Videos machen muss und diese dann in unterschiedliche Player synchron abspielen muss. Dann einfach den Player, dessen Video man groß sehen möchte anklicken. Der ausgewählte Player wird größer, der zweite Player wird kleiner. Das Ganze kann man auch wechseln.

Ich habe dazu eine Prof of Concept programmiert und diese funktioniert als solches auch. Dieses habe ich euch hier angehängt und ich denke dann erklärt sich das Konzept nochmal von alleine: (Multicam View PoC2)

Da PoC2 noch sehr einfach gestrickt und übersichtlich ist möchte ich daran noch folgende drei Änderungen vornehmen:
1) Den verkleinerte Player aus der Groupbox "Kamera" soll im Vordergrund sich über das große Video legen. Das funktioniert momentan nur, wenn Player 1 großgezogen und Player 2 klein ist. Ziehe ich Player 2 groß fällt Player 1 in den Hintergrund, das Bild ist somit nicht mehr sichtbar. (Deswegen habe ich die Groupbox "Kamera" geschaffen, soll aber nur ein Zwischenschritt sein, denn ich möchte ja Bild in Bild haben. .BringToFront() war die Lösung.
2) Wenn ich an eine andere Position im Video springe, dann soll der andere Player ebenfalls dorthin springen, damit es synchron bleibt. Momentan stürzt das Programm ab wenn ich das über das Ereignis "PositionChange" direkt am Player mache. Daher habe ich die Buttonlösung eingebaut.
3) Eine intelligente Lösung zum Wechseln zwischen den Playern. Momentan muss der Doppelklick auf das Weise des Media Players erfolgen. Klickt man doppelt auf das laufende Video wechselt der Media Player in einen echten Vollbildmodus. Der Wechsel muss außerdem auf eine andere Art erfolgen, da ich im klein gemachten Player die Steuerelemente des Media Players entfernen möchte. Somit gibt es nichts weises mehr zum Doppelklicken.

Kleine Info am Rande: PoC3 habe ich GUImäßig schon fertig und kommt einem fertigen Projekt schon sehr nahe. Aber erstmal das hier erfolgreich zu Ende bringen.

Anbei habe ich euch den Quellcode und die komplette Projektmappe
Anhang anzeigen 45250
[src=csharp]using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Text.RegularExpressions;
using WMPLib;


namespace Multicam_View_PoC2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void dateiÖffnenKamera1ToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Videodateien (*.mp4)|*.mp4|Alle Dateien (*.*)|*.*";
if (ofd.ShowDialog() == DialogResult.OK)
{
string file = ofd.FileName;
axWindowsMediaPlayer1.URL = ofd.FileName;
axWindowsMediaPlayer1.Ctlcontrols.stop();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

private void dateiÖffnenKamera2ToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Videodateien (*.mp4)|*.mp4|Alle Dateien (*.*)|*.*";
if (ofd.ShowDialog() == DialogResult.OK)
{
string file = ofd.FileName;
axWindowsMediaPlayer2.URL = ofd.FileName;
axWindowsMediaPlayer2.Ctlcontrols.stop();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

private void playlistÖffnenToolStripMenuItem_Click(object sender, EventArgs e)
{

}

private void radioButton1_CheckedChanged(object sender, EventArgs e)
{
axWindowsMediaPlayer1.settings.mute = false;
axWindowsMediaPlayer2.settings.mute = true;
}

private void radioButton2_CheckedChanged(object sender, EventArgs e)
{
axWindowsMediaPlayer1.settings.mute = true;
axWindowsMediaPlayer2.settings.mute = false;
}

private void radioButton3_CheckedChanged(object sender, EventArgs e)
{
axWindowsMediaPlayer1.settings.mute = false;
axWindowsMediaPlayer2.settings.mute = false;
}

private void cmdPlay_Click(object sender, EventArgs e)
{
axWindowsMediaPlayer1.Ctlcontrols.play();
axWindowsMediaPlayer2.Ctlcontrols.play();

}

private void cmdSync1_Click(object sender, EventArgs e)
{
axWindowsMediaPlayer2.Ctlcontrols.currentPosition = axWindowsMediaPlayer1.Ctlcontrols.currentPosition;
}

private void cmdSync2_Click(object sender, EventArgs e)
{
axWindowsMediaPlayer1.Ctlcontrols.currentPosition = axWindowsMediaPlayer2.Ctlcontrols.currentPosition;
}


private void axWindowsMediaPlayer1_DoubleClickEvent(object sender, AxWMPLib._WMPOCXEvents_DoubleClickEvent e)
{
axWindowsMediaPlayer1.Size = new Size(996, 560);
axWindowsMediaPlayer2.Size = new Size(284, 160);

axWindowsMediaPlayer1.Location = new Point(0, 24);
axWindowsMediaPlayer2.Location = new Point(121, 600);

axWindowsMediaPlayer1.settings.mute = true;
axWindowsMediaPlayer2.settings.mute = false;
radioButton1.Checked = true;
}

private void axWindowsMediaPlayer2_DoubleClickEvent(object sender, AxWMPLib._WMPOCXEvents_DoubleClickEvent e)
{
axWindowsMediaPlayer2.Size = new Size(996, 560);
axWindowsMediaPlayer1.Size = new Size(284, 160);

axWindowsMediaPlayer2.Location = new Point(0, 24);
axWindowsMediaPlayer1.Location = new Point(121, 600);

axWindowsMediaPlayer1.settings.mute = false;
axWindowsMediaPlayer2.settings.mute = true;
radioButton2.Checked = true;
}

private void cmdReset_Click(object sender, EventArgs e)
{
axWindowsMediaPlayer1.Size = new Size(640, 360);
axWindowsMediaPlayer2.Size = new Size(640, 360);

axWindowsMediaPlayer1.Location = new Point(0, 24);
axWindowsMediaPlayer2.Location = new Point(645, 24);

axWindowsMediaPlayer1.settings.mute = false;
axWindowsMediaPlayer2.settings.mute = false;
radioButton3.Checked = true;
}
}
}[/src]

Ich hoffe auf eure Hilfe. Bitte haltet die Sache einfach. Ich bin kein Programmierer und es geht wirklich nur darum, dass es funktioniert.
 
Zuletzt bearbeitet:

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.560
Folgede Ideen:
Bevor etwas abgespielt wird, kann man sicherstellen dass die Videos synchron laufen und alle Daten geladen sind, Frage also, sind die Videos gepuffert bzw. soweit vorgeladen/geladen und zur Anzeige bereit dass wir synchron abspielen können?
Gibt es dafür Funktionen oder Parameter die Signalisieren das ein Video abgespielt werden kann auf die du warten kannst mittels einer Kontrollfunktion die alle Mediaplayer überprüft?

Gibt es eine Kontrolle von "axWindowsMediaPlayer1" und "axWindowsMediaPlayer2" die es erlauben an einen bestimmten "Timecode" oder Zeitabschnitt in einem Video zu springen bzw. diesen einzulesen und über diese Zeitangabe(n) die Videos synchron auf diese Zeit zu setzen, und hier mit der Kontrollfunktion testen ob bei Videos bereit sind zum abspielen?

Kann man die verfügbaren Steuerelemente nicht einschränken oder nur einblenden, wenn die Maus darüber fährt? Oder zum Beispiel nur die Zeitleiste?

Sind nur ein paar fixe Ideen. :)
 

KaPiTN

♪♪♫ wild at heart ♪♫♫♪

Registriert
14 Juli 2013
Beiträge
29.138
Nach ein bisschen Aufklärung über Videostandards, Bitraten und Technik bin ich zu dem Schluss gekommen, dass man mehrere Videos machen muss und diese dann in unterschiedliche Player synchron abspielen muss.

[..]

Ich habe dazu eine Prof of Concept programmiert und diese funktioniert als solches auch.

Hast Du das mit einem oder mit 2 verschiedenen Videos getestet?

Wenn mit 2, versuche es mit einem! Mehrfach und am besten, wenn noch ein paar andere Programme auf dem Rechner geöffnet sind? Kommt Dir das jedesmal synchron vor?

Denn ich halte das zeitgleiche zeitnahe Starten beider Player für ein mehr oder weniger Zufallsergebnis.
(@theSplit hat das anders formuliert, aber ich denke, wir denken da beide das gleiche)

Da Du ja nur an dem Ergebnis interessiert bist, wäre die Klärung Deiner Fragen wahrscheinlich vertane Zeit.

Sag an, solltest Du sie aber auf jeden Fall beantwortet haben wollen.
 

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • Thread Starter Thread Starter
  • #4
2) Wenn ich an eine andere Position im Video springe, dann soll der andere Player ebenfalls dorthin springen, damit es synchron bleibt. Momentan stürzt das Programm ab wenn ich das über das Ereignis "PositionChange" direkt am Player mache. Daher habe ich die Buttonlösung eingebaut.
Ich habe meinen Fehler gefunden. Das Problem ist, dass sich mit dem Befehl
[src=csharp] private void axWindowsMediaPlayer1_PositionChange(object sender, AxWMPLib._WMPOCXEvents_PositionChangeEvent e)
{
axWindowsMediaPlayer2.Ctlcontrols.currentPosition = axWindowsMediaPlayer1.Ctlcontrols.currentPosition;
}

private void axWindowsMediaPlayer2_PositionChange(object sender, AxWMPLib._WMPOCXEvents_PositionChangeEvent e)
{
axWindowsMediaPlayer1.Ctlcontrols.currentPosition = axWindowsMediaPlayer2.Ctlcontrols.currentPosition;
}
[/src] die Player gegenseitig ins Gehege kommen. Ich habe es jetzt hinbekommen, dass sich der jeweils andere Player der Sprungmarke des Anderen anpasst, aber nur wenn einer der beiden Player klein gemacht wurde. Ich habe mir hier den Umstand zunutze gemacht, dass ich beim klein gemachten Player die Steuerelemente des Players ausblenede und eine entsprechende Abfrage mache:
[src=csharp] private void axWindowsMediaPlayer1_PositionChange(object sender, AxWMPLib._WMPOCXEvents_PositionChangeEvent e)
{
if (axWindowsMediaPlayer1.uiMode == "full")
{
axWindowsMediaPlayer2.Ctlcontrols.currentPosition = axWindowsMediaPlayer1.Ctlcontrols.currentPosition;
}
}

private void axWindowsMediaPlayer2_PositionChange(object sender, AxWMPLib._WMPOCXEvents_PositionChangeEvent e)
{
if (axWindowsMediaPlayer2.uiMode == "full")
{
axWindowsMediaPlayer1.Ctlcontrols.currentPosition = axWindowsMediaPlayer2.Ctlcontrols.currentPosition;
}
}
[/src]
Das funktioniert aber nicht, wenn beide Player in der Ausgangssituation sind. Wie kann ich da eine passende Abfrage basteln?

3) Eine intelligente Lösung zum Wechseln zwischen den Playern. Momentan muss der Doppelklick auf das Weise des Media Players erfolgen. Klickt man doppelt auf das laufende Video wechselt der Media Player in einen echten Vollbildmodus. Der Wechsel muss außerdem auf eine andere Art erfolgen, da ich im klein gemachten Player die Steuerelemente des Media Players entfernen möchte. Somit gibt es nichts weises mehr zum Doppelklicken.
Ich habe das jetzt mit einem einfachen Klick gelöst (Ereignis "ClickEvent"). Einfach einmal auf den Player klicken und es funktioniert.

@KaPiTN: Das Problem ist sicherlich gegeben und muss getestet werden. Momentan ist es aber noch eher Zweitrangig. Ich würde es daher gerne aufschieben um nicht (mal wieder) ein Projekt vorzeitig platzen zu lassen, weil ich an einer Kleinigkeit scheitere und dann gar nichts mehr geht. Ich betrachte hier das ganze auch noch als Prof of Concept. Da kommt es auf sowas nicht so sehr an. Eine weitere Version ist wie gesagt GUImäßig schon fertig, aber da stehe ich aufgrund der vorgesehenen Dynamik vor ganz anderen Herausforderungen. Mehr dazu, wenn Punkt 2 auch abgehakt werden kann. Das Ergebnis wird natürlich für alle veröffentlicht.

Edit: Der Teil mit den Bitraten und so wurde im anderen Forum (Videotreffpunkt, siehe Link) bereits geklärt. Es ging um die Frage, ob es auch möglich wäre ein Video so zu rendern, dass man nur eine Videodatei hat und dann wechseln kann, wenn der Player über die Fähigkeit verfügt zwischen den Streams zu wechseln. Es stellen sich da aber gleich mehrere Probleme, angefangen beim rendern bis hin zum Player der das unterstützen muss. Da das Platzproblem heutzutage zu vernachlässigen ist habe ich mich nun für diese Lösung entschieden, auch wenn man für ein video dann den doppelten speicherplatz bereothalten muss. Ist jetzt etwas umständlich wiedergegeben, im anderen Forum kannst du es aber fundiert nachlesen. (Sollte das missverstanden worden sein)
 
Zuletzt bearbeitet:

KaPiTN

♪♪♫ wild at heart ♪♫♫♪

Registriert
14 Juli 2013
Beiträge
29.138
Der Klick-Event sollte wohl vor dem PositionChangeEvent feuern. Du könntest also den uiMode ignorieren und Dir merken, welcher Player zuletzt angeklickt wurde. Dann behandelst Du PositionChangeEvent nur für den aktuellen Player.
 

KaPiTN

♪♪♫ wild at heart ♪♫♫♪

Registriert
14 Juli 2013
Beiträge
29.138
Noch etwas. Wenn Du doch den Doppelklick für den Wechsel haben möchtest, dann kannst Du quick&dirty den FullScreen einfach über erneutes Aufrufen des Events wieder ausschalten

Also in beide DoubleClickEvent-Handler für den entsprechenden Player dies oben einfügen:

[src=csharp]if (axWindowsMediaPlayer.fullScreen)
{
axWindowsMediaPlayer_DoubleClickEvent(sender, null);
}[/src]
 

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • Thread Starter Thread Starter
  • #7
Das mit dem einfachen Klick passt schon.

Ich habe den Code ziemlich umgeschrieben, aber leider strotzt das Programm noch so vor Fehlern und stürzt gerne ab bzw. verhält sich anders als man es erwartet. Fehleranfällig ist das Bild in Bild-Feature und die Sprungmarken. Bitte um eure Hilfe den Code zu korrigieren (NICHT optimieren) Es geht nach wie vor darum, dass es einfach erstmal funktioniert, ICH verstehe wie der Code funktioniert und in sich stimmig ist.
Immerhin: Ich habe erstmals Funktionen eingebaut die funktionieren. Einige ältere User hier wissen wie hoch dieser Fortschritt zu bewerten ist. (Es ist mir auch egal, ob ich die Funktion richtig gemacht habe oder nicht oder ob man sie noch besser machen könnte. Es funktioniert. Punkt. Alles andere hat später Zeit)
[src=csharp]using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Text.RegularExpressions;
using WMPLib;


namespace Multicam_View_PoC2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

// Globale Variablen
int lastPlayer;

public void MediaPlayer1_Klick()
{
lastPlayer = 1;

axWindowsMediaPlayer1.Size = new Size(996, 560);
axWindowsMediaPlayer2.Size = new Size(284, 160);

axWindowsMediaPlayer1.Location = new Point(0, 24);
axWindowsMediaPlayer2.BringToFront();
axWindowsMediaPlayer2.uiMode = "none";
axWindowsMediaPlayer1.uiMode = "full";

axWindowsMediaPlayer1.settings.mute = true;
axWindowsMediaPlayer2.settings.mute = false;
radioButton1.Checked = true;
}

public void MediaPlayer2_Klick()
{
lastPlayer = 2;

axWindowsMediaPlayer2.Size = new Size(996, 560);
axWindowsMediaPlayer1.Size = new Size(284, 160);

axWindowsMediaPlayer2.Location = new Point(0, 24);
axWindowsMediaPlayer1.BringToFront();
axWindowsMediaPlayer1.uiMode = "none";
axWindowsMediaPlayer2.uiMode = "full";

axWindowsMediaPlayer1.settings.mute = false;
axWindowsMediaPlayer2.settings.mute = true;
radioButton2.Checked = true;
}

public void keinBildInBild()
{
axWindowsMediaPlayer1.Size = new Size(640, 360);
axWindowsMediaPlayer2.Size = new Size(640, 360);

axWindowsMediaPlayer1.Location = new Point(0, 24);
axWindowsMediaPlayer2.Location = new Point(645, 24);

axWindowsMediaPlayer1.settings.mute = false;
axWindowsMediaPlayer2.settings.mute = false;
radioButton3.Checked = true;

axWindowsMediaPlayer1.uiMode = "full";
axWindowsMediaPlayer2.uiMode = "full";
}

private void dateiÖffnenKamera1ToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Videodateien (*.mp4)|*.mp4|Alle Dateien (*.*)|*.*";
if (ofd.ShowDialog() == DialogResult.OK)
{
string file = ofd.FileName;
axWindowsMediaPlayer1.URL = ofd.FileName;
axWindowsMediaPlayer1.Ctlcontrols.stop();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

private void dateiÖffnenKamera2ToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Videodateien (*.mp4)|*.mp4|Alle Dateien (*.*)|*.*";
if (ofd.ShowDialog() == DialogResult.OK)
{
string file = ofd.FileName;
axWindowsMediaPlayer2.URL = ofd.FileName;
axWindowsMediaPlayer2.Ctlcontrols.stop();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}


private void radioButton1_CheckedChanged(object sender, EventArgs e)
{
axWindowsMediaPlayer1.settings.mute = false;
axWindowsMediaPlayer2.settings.mute = true;
}

private void radioButton2_CheckedChanged(object sender, EventArgs e)
{
axWindowsMediaPlayer1.settings.mute = true;
axWindowsMediaPlayer2.settings.mute = false;
}

private void radioButton3_CheckedChanged(object sender, EventArgs e)
{
axWindowsMediaPlayer1.settings.mute = false;
axWindowsMediaPlayer2.settings.mute = false;
}

private void cmdPlay_Click(object sender, EventArgs e)
{
axWindowsMediaPlayer1.Ctlcontrols.play();
axWindowsMediaPlayer2.Ctlcontrols.play();
cmdPlay.Text = "Play";
}

private void cmdPause_Click(object sender, EventArgs e)
{
axWindowsMediaPlayer1.Ctlcontrols.pause();
axWindowsMediaPlayer2.Ctlcontrols.pause();
cmdPlay.Text = "Weiter";
}

private void axWindowsMediaPlayer1_PositionChange(object sender, AxWMPLib._WMPOCXEvents_PositionChangeEvent e)
{
if (lastPlayer == 1)
{
axWindowsMediaPlayer2.Ctlcontrols.currentPosition = axWindowsMediaPlayer1.Ctlcontrols.currentPosition;
}
else
{
axWindowsMediaPlayer1.Ctlcontrols.currentPosition = axWindowsMediaPlayer2.Ctlcontrols.currentPosition;
}
}

private void axWindowsMediaPlayer2_PositionChange(object sender, AxWMPLib._WMPOCXEvents_PositionChangeEvent e)
{
if (lastPlayer == 2)
{
axWindowsMediaPlayer1.Ctlcontrols.currentPosition = axWindowsMediaPlayer2.Ctlcontrols.currentPosition;
}
else
{
axWindowsMediaPlayer2.Ctlcontrols.currentPosition = axWindowsMediaPlayer1.Ctlcontrols.currentPosition;
}
}

private void axWindowsMediaPlayer1_ClickEvent(object sender, AxWMPLib._WMPOCXEvents_ClickEvent e)
{
if (radioAus.Checked)
{
keinBildInBild();
}

if (radioObenLinks.Checked)
{
axWindowsMediaPlayer2.Location = new Point(0, 24);
MediaPlayer1_Klick();
}
if (radioObenRechts.Checked)
{
axWindowsMediaPlayer2.Location = new Point(712, 24);
MediaPlayer1_Klick();
}
if (radioUntenLinks.Checked)
{
axWindowsMediaPlayer2.Location = new Point(0, 378);
MediaPlayer1_Klick();
}
if (radioUntenRechts.Checked)
{
axWindowsMediaPlayer2.Location = new Point(712, 378);
MediaPlayer1_Klick();
}
}

private void axWindowsMediaPlayer2_ClickEvent(object sender, AxWMPLib._WMPOCXEvents_ClickEvent e)
{
if(radioAus.Checked)
{
keinBildInBild();
}
if (radioObenLinks.Checked)
{
axWindowsMediaPlayer1.Location = new Point(0, 24);
MediaPlayer2_Klick();
}
if (radioObenRechts.Checked)
{
axWindowsMediaPlayer1.Location = new Point(712, 24);
MediaPlayer2_Klick();
}
if (radioUntenLinks.Checked)
{
axWindowsMediaPlayer1.Location = new Point(0, 378);
MediaPlayer2_Klick();
}
if (radioUntenRechts.Checked)
{
axWindowsMediaPlayer1.Location = new Point(712, 378);
MediaPlayer2_Klick();
}
}

private void radioAus_CheckedChanged(object sender, EventArgs e)
{
keinBildInBild();
}

private void radioObenLinks_CheckedChanged(object sender, EventArgs e)
{
if (axWindowsMediaPlayer1.uiMode != "full")
{
axWindowsMediaPlayer1.Location = new Point(0, 24);
}
else
{
axWindowsMediaPlayer2.Location = new Point(0, 24);
}
}

private void radioObenRechts_CheckedChanged(object sender, EventArgs e)
{
if (axWindowsMediaPlayer1.uiMode != "full")
{
axWindowsMediaPlayer1.Location = new Point(712, 24);
}
else
{
axWindowsMediaPlayer2.Location = new Point(712, 24);
}
}

private void radioUntenLinks_CheckedChanged(object sender, EventArgs e)
{
if (axWindowsMediaPlayer1.uiMode != "full")
{
axWindowsMediaPlayer1.Location = new Point(0, 378);
}
else
{
axWindowsMediaPlayer2.Location = new Point(0, 378);
}
}

private void radioUntenRechts_CheckedChanged(object sender, EventArgs e)
{
if (axWindowsMediaPlayer1.uiMode != "full")
{
axWindowsMediaPlayer1.Location = new Point(712, 378);
}
else
{
axWindowsMediaPlayer2.Location = new Point(712, 378);
}
}
}
}[/src]
 

KaPiTN

♪♪♫ wild at heart ♪♫♫♪

Registriert
14 Juli 2013
Beiträge
29.138
In den Handlern für den axWindowsMediaPlayer_PositionChange Event führst Du mit den Else-Zweigen die gerade gemachte Unterscheidung, welcher gerade der aktuelle Player ist, ad absurdum.

Einfach weglassen!
 

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • Thread Starter Thread Starter
  • #9
Das funktioniert leider nicht sauber. Solange einer der Player maximiert und der andere klein in der Ecke ist klappt das, aber nicht wenn beide in der Ausgangsstellung sind. Wenn man Bild in Bild später wieder abschaltet funktioniert das mit den Sprungmarken nur an einem Player (der, der zuletzt angeklickt wurde) Beim anderen kann man dann hinspringen wo man will, der andere Player zieht nicht nach.
 

KaPiTN

♪♪♫ wild at heart ♪♫♫♪

Registriert
14 Juli 2013
Beiträge
29.138
Das klappt schon.

Aber halt nur mit dem aktuellen Player.
Und der Wechsel funktioniert in dem Modus nicht.
Denn der aktuelle Player wird in der MediaPlayer_Klick() Funktion gesetzt.
Diese wird aber in axWindowsMediaPlayer_ClickEvent() nicht aufgerufen, wenn radioAus.Checked wahr ist.

"Bild in Bild", also der Wechsel der Ecken und die Größenänderung, ist auch noch buggy. Aber schau erst mal selber.
 

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • Thread Starter Thread Starter
  • #11
Ich habe den Code angepasst. Installiert ist die Windows Meida Player Version, die bei Windows 7 dabei war und halt über Windows Update aktualisiert wurde. (Version 12) Einen neueren gibt es wohl auch nicht

[src=csharp] private void axWindowsMediaPlayer1_ClickEvent(object sender, AxWMPLib._WMPOCXEvents_ClickEvent e)
{
if (radioAus.Checked)
{
lastPlayer = 1;
keinBildInBild();
}
[...][/src]
bzw.
[src=csharp] private void axWindowsMediaPlayer2_ClickEvent(object sender, AxWMPLib._WMPOCXEvents_ClickEvent e)
{
if(radioAus.Checked)
{
lastPlayer = 2;
keinBildInBild();
}
[...][/src]
Klappt nicht.

Ja, das Bild in Bild Feature funktioniert nicht richtig, wenn einer der Player vorher nicht klein gemacht wurde. Ich arbeite noch dran.
 
Zuletzt bearbeitet:

KaPiTN

♪♪♫ wild at heart ♪♫♫♪

Registriert
14 Juli 2013
Beiträge
29.138
Mit aktuellem Player meine ich lastplayer, nicht die Version. ;)

PositionChange feuert tatsächlich vor ClickEvent.

Dann machen wir das so:

Füge mal folgendes ein:

[src=csharp]
private void axWindowsMediaPlayer1_MouseDownEvent(object sender, AxWMPLib._WMPOCXEvents_MouseDownEvent e)
{
lastPlayer = 1;
}

private void axWindowsMediaPlayer2_MouseDownEvent(object sender, AxWMPLib._WMPOCXEvents_MouseDownEvent e)
{
lastPlayer = 2;
}
[/src]

MouseDown ist noch weiter vorne in der Kette und so wird der aktuelle Player aktualisiert, auch wenn man nicht auf den Film klickt, sondern und auf den Schieber.
 

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • Thread Starter Thread Starter
  • #13
Das klappt wie es scheint. Danke. Ich muss im nächsten Schritt aber erstmal den Code aufräumen, dass da nichts doppelt vorhanden ist, was mir im späteren Verlauf zwischenfunkt.

Was ich aber nicht verstehe ist, dass doch das "ClickEvent" in der Ereignisliste vor "PositionChange" kommt oder funktioniert das nicht alphabetisch? Wie bekomme ich raus wie die Reihenfolge der abzuarbeitenden Ereignisse ist? Ich denke später könnte das ja mal noch wichtig werden. Von der Position im Code kann es jedenfalls nicht abhängig sein, weil das "MouseDownEvent" habe ich jetzt ganz unten stehen.
 

KaPiTN

♪♪♫ wild at heart ♪♫♫♪

Registriert
14 Juli 2013
Beiträge
29.138
Die Events für die WinForm sind bei MSDN dokumentiert. Die der einzelnen Controls aber nicht wirklich. Die von activex controls schon mal gar nicht.

Wie es aussieht, kommt "ClickEvent" in der Ereignisliste gar nicht vor "PositionChange", sondern kommt gar nicht, wenn man auf den Regler klickt. Im Gegensatz dazu, wenn man auf das Bild klickt.

Die Reihenfolge ist natürlich nicht alphabetisch.ButtonDown vor ButtonUp ergibt eindeutig mehr Sinn, als anders herum.

Wenn Du die Reihenfolge nicht kennst, dann findest Du sie, sofern Du die Handler für die Events implementiert hast, beim Debuggen über Haltepunkte heraus.

Was ma natürlich auch machen

Eine andere Methode ist, über ein Tool die Events des Controls zu scannen. Ich habe das früher bei einer Gelegenheit mal mit uispy.exe gemacht. Das Tool wird aber offiziell nicht mehr bereit gestellt.

Es gibt da noch:

AccEvent.exe
AccExplorer32.exe
Inspect.exe
SPYXX.EXE
swapy-ob-0.4.3.exe
ViewWizard.exe
WSEdit.EXE

Gut gefallen hat mir, ich habe es mir gestern abend angeschaut, EventSpy von Martin Carolan. Da bindest Du eine DLL direkt in Dein Projekt und übergibst Dein Control als Parameter.
Mit dem WPM Control kam er aber nicht zurecht.

Was man natürlich auch machen könnte, wenn man die Reohenfolge ganz bestimmter Events wissen möchte, sich eben eine TestApp bauen.
a) WinForm
b) Control draufziehen
c) eine globale Zählevariabel
d) die Events registrieren und in die Handler folgendes eingeben
[src=csharp]
number++;
string MethodeName = MethodBase.GetCurrentMethod().Name;
File.AppendAllText("LoggedEvents.txt", number + " " + MethodeName + Environment.NewLine);
[/src]
 

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • Thread Starter Thread Starter
  • #15
So, wie versprochen präsentiere ich hier das Ergebnis. Ich habe sogar noch ein Feature eingebaut, dass so in dieser Version noch gar nicht geplant war.
Man kann jetzt beide Videos in eine Datei exportieren und diese Datei später wieder laden.

Anhang anzeigen 45285

[src=csharp]using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Text.RegularExpressions;
using WMPLib;


namespace Multicam_View_PoC2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

// Globale Variablen
int lastPlayer;
bool playerAusgangsstellung;

public void MediaPlayer1_Klick()
{

// Player nicht mehr in Ausgangsstellung
playerAusgangsstellung = false;

// Größe der Player
axWindowsMediaPlayer1.Size = new Size(996, 625);
axWindowsMediaPlayer2.Size = new Size(284, 160);

// Position des großen Players
axWindowsMediaPlayer1.Location = new Point(0, 24);
// Kleiner gemachte Player in den vordergrund
axWindowsMediaPlayer2.BringToFront();
// Steuerelemente des kleineren Players ausblenden
axWindowsMediaPlayer2.uiMode = "none";
// Steuerelemente des großen Players (wieder) einblenden
axWindowsMediaPlayer1.uiMode = "full";

// Ton an / aus
axWindowsMediaPlayer1.settings.mute = true;
axWindowsMediaPlayer2.settings.mute = false;
radioButton1.Checked = true;

// Fenstergröße anpassen
this.Size = new Size(1010, 800);
}

public void MediaPlayer2_Klick()
{
// Player nicht mehr in Ausgangsstellung
playerAusgangsstellung = false;

// Größe der Player
axWindowsMediaPlayer2.Size = new Size(996, 625);
axWindowsMediaPlayer1.Size = new Size(284, 160);

// Position des großen Players
axWindowsMediaPlayer2.Location = new Point(0, 24);
// Kleiner gemachte Player in den vordergrund
axWindowsMediaPlayer1.BringToFront();
// Steuerelemente des kleineren Players ausblenden
axWindowsMediaPlayer1.uiMode = "none";
// Steuerelemente des großen Players (wieder) einblenden
axWindowsMediaPlayer2.uiMode = "full";

// Ton an / aus
axWindowsMediaPlayer1.settings.mute = false;
axWindowsMediaPlayer2.settings.mute = true;
radioButton2.Checked = true;

// Fenstergröße anpassen
this.Size = new Size(1010, 800);
}

public void keinBildInBild()
{
// Player in Ausgangsstellung
playerAusgangsstellung = true;

// Größe der Player
axWindowsMediaPlayer1.Size = new Size(640, 427);
axWindowsMediaPlayer2.Size = new Size(640, 427);

// Possition des Player nebeneinander anordnen
axWindowsMediaPlayer1.Location = new Point(0, 24);
axWindowsMediaPlayer2.Location = new Point(645, 24);

// Ton beider Player an
axWindowsMediaPlayer1.settings.mute = false;
axWindowsMediaPlayer2.settings.mute = false;
radioButton3.Checked = true;

// Steuerelemente beider Player (wieder) einblenden
axWindowsMediaPlayer1.uiMode = "full";
axWindowsMediaPlayer2.uiMode = "full";

// Fenstergröße anpassen
this.Size = new Size(1303, 800);
}

private void Form1_Load(object sender, EventArgs e)
{
playerAusgangsstellung = true;
}

// Datei öffnen für Player 1
private void dateiÖffnenKamera1ToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Videodateien (*.mp4)|*.mp4|Alle Dateien (*.*)|*.*";
if (ofd.ShowDialog() == DialogResult.OK)
{
string file = ofd.FileName;
axWindowsMediaPlayer1.URL = ofd.FileName;
axWindowsMediaPlayer1.Ctlcontrols.stop();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

// Datei öffnen für Player 2
private void dateiÖffnenKamera2ToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Videodateien (*.mp4)|*.mp4|Alle Dateien (*.*)|*.*";
if (ofd.ShowDialog() == DialogResult.OK)
{
string file = ofd.FileName;
axWindowsMediaPlayer2.URL = ofd.FileName;
axWindowsMediaPlayer2.Ctlcontrols.stop();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

private void mutlicamDateiErstellenToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "Multicam View (*.mcv)|*.mcv";
if (sfd.ShowDialog() == DialogResult.OK)
{
string file = sfd.FileName;
string pfadVideo1 = axWindowsMediaPlayer1.URL;
string pfadVideo2 = axWindowsMediaPlayer2.URL;
File.WriteAllText(sfd.FileName, pfadVideo1 + "\r\n" + pfadVideo2, Encoding.UTF8);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

private void playlistÖffnenToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Multicam(*.mcv|*.mcv";
if(ofd.ShowDialog() == DialogResult.OK)
{
string file = ofd.FileName;
var lines = File.ReadAllLines(file);
// Teile 1 auslesen
axWindowsMediaPlayer1.URL = lines[0];
axWindowsMediaPlayer1.Ctlcontrols.stop();
// Zeile 2 auslesen
axWindowsMediaPlayer2.URL = lines[1];
axWindowsMediaPlayer2.Ctlcontrols.stop();
}
}

private void toolStripMenuItem1_Click(object sender, EventArgs e)
{
MessageBox.Show("Multicam View PoC2.1");
}

private void radioButton1_CheckedChanged(object sender, EventArgs e)
{
// Ton für Player 1 einschalten
axWindowsMediaPlayer1.settings.mute = false;
// Ton für Player 2 ausschalten
axWindowsMediaPlayer2.settings.mute = true;
}

private void radioButton2_CheckedChanged(object sender, EventArgs e)
{
// Ton für Player 1 ausschalten
axWindowsMediaPlayer1.settings.mute = true;
// Ton für Player 2 einschalten
axWindowsMediaPlayer2.settings.mute = false;
}

private void radioButton3_CheckedChanged(object sender, EventArgs e)
{
// Ton beider Player einschalten
axWindowsMediaPlayer1.settings.mute = false;
axWindowsMediaPlayer2.settings.mute = false;
}

private void cmdPlay_Click(object sender, EventArgs e)
{
// Beide Player gleichzeitig die Videos abspielen lassen
axWindowsMediaPlayer1.Ctlcontrols.play();
axWindowsMediaPlayer2.Ctlcontrols.play();
// Text des Play-Buttons (wieder) auf Play setzen.
cmdPlay.Text = "Play";
}

private void cmdPause_Click(object sender, EventArgs e)
{
// Videos pausieren
axWindowsMediaPlayer1.Ctlcontrols.pause();
axWindowsMediaPlayer2.Ctlcontrols.pause();
// Text des Play-Buttons wenn die Videos pausiert werden
cmdPlay.Text = "Weiter";
}

private void axWindowsMediaPlayer1_MouseDownEvent(object sender, AxWMPLib._WMPOCXEvents_MouseDownEvent e)
{
// Wird Player 1 (egal wo und wie) angeklickt den Player entsprechend markieren
// Wichtig um bei den Sprungmarken unterscheiden zu können welcher Player sich dem Anderen anpassen muss
lastPlayer = 1;

if (radioAus.Checked)
{
playerAusgangsstellung = true;
keinBildInBild();
}

if (radioObenLinks.Checked)
{
playerAusgangsstellung = false;
axWindowsMediaPlayer2.Location = new Point(0, 24);
MediaPlayer1_Klick();
}
if (radioObenRechts.Checked)
{
playerAusgangsstellung = false;
axWindowsMediaPlayer2.Location = new Point(712, 24);
MediaPlayer1_Klick();
}
if (radioUntenLinks.Checked)
{
playerAusgangsstellung = false;
axWindowsMediaPlayer2.Location = new Point(0, 425);
MediaPlayer1_Klick();
}
if (radioUntenRechts.Checked)
{
playerAusgangsstellung = false;
axWindowsMediaPlayer2.Location = new Point(712, 425);
MediaPlayer1_Klick();
}
}

private void axWindowsMediaPlayer2_MouseDownEvent(object sender, AxWMPLib._WMPOCXEvents_MouseDownEvent e)
{
// Wird Player 2 (egal wo und wie) angeklickt den Player entsprechend markieren
// Wichtig um bei den Sprungmarken unterscheiden zu können welcher Player sich dem Anderen anpassen muss
lastPlayer = 2;

if (radioAus.Checked)
{
playerAusgangsstellung = true;
keinBildInBild();
}
if (radioObenLinks.Checked)
{
playerAusgangsstellung = false;
axWindowsMediaPlayer1.Location = new Point(0, 24);
MediaPlayer2_Klick();
}
if (radioObenRechts.Checked)
{
playerAusgangsstellung = false;
axWindowsMediaPlayer1.Location = new Point(712, 24);
MediaPlayer2_Klick();
}
if (radioUntenLinks.Checked)
{
playerAusgangsstellung = false;
axWindowsMediaPlayer1.Location = new Point(0, 425);
MediaPlayer2_Klick();
}
if (radioUntenRechts.Checked)
{
playerAusgangsstellung = false;
axWindowsMediaPlayer1.Location = new Point(712, 425);
MediaPlayer2_Klick();
}
}

private void axWindowsMediaPlayer1_PositionChange(object sender, AxWMPLib._WMPOCXEvents_PositionChangeEvent e)
{
// Wird die Sprungmarke an Player 1 geändert zieht Player 2 gleich
if (lastPlayer == 1)
{
axWindowsMediaPlayer2.Ctlcontrols.currentPosition = axWindowsMediaPlayer1.Ctlcontrols.currentPosition;
}
}

private void axWindowsMediaPlayer2_PositionChange(object sender, AxWMPLib._WMPOCXEvents_PositionChangeEvent e)
{
// Wird die Sprungmarke an Player 2 geändert zieht Player 1 gleich
if (lastPlayer == 2)
{
axWindowsMediaPlayer1.Ctlcontrols.currentPosition = axWindowsMediaPlayer2.Ctlcontrols.currentPosition;
}
}

// <!-- Anfang Bild in Bild Possitionen --->
private void radioAus_CheckedChanged(object sender, EventArgs e)
{
playerAusgangsstellung = true;
keinBildInBild();
}

private void radioObenLinks_CheckedChanged(object sender, EventArgs e)
{
// Prüfen, ob beide Player in Ausstellungsstellung
// Falls ja nicht auf den Radio-button reagieren
if (playerAusgangsstellung == false)
{
// Prüfen an welchem Player die Steuerelemente ausgelendet sind
// Das ist dann der kleinere Player und wird entsprechend der Beschreibung des Radio-Buttons verschoben
if (axWindowsMediaPlayer1.uiMode != "full")
{
axWindowsMediaPlayer1.Location = new Point(0, 24);
}
else if (axWindowsMediaPlayer2.uiMode != "full")
{
axWindowsMediaPlayer2.Location = new Point(0, 24);
}
else { }
}
}

private void radioObenRechts_CheckedChanged(object sender, EventArgs e)
{
// Prüfen, ob beide Player in Ausstellungsstellung
// Falls ja nicht auf den Radio-button reagieren
if (playerAusgangsstellung == false)
{
// Prüfen an welchem Player die Steuerelemente ausgelendet sind
// Das ist dann der kleinere Player und wird entsprechend der Beschreibung des Radio-Buttons verschoben
if (axWindowsMediaPlayer1.uiMode != "full")
{
axWindowsMediaPlayer1.Location = new Point(712, 24);
}
else if (axWindowsMediaPlayer2.uiMode != "full")
{
axWindowsMediaPlayer2.Location = new Point(712, 24);
}
else { }
}
}

private void radioUntenLinks_CheckedChanged(object sender, EventArgs e)
{
// Prüfen, ob beide Player in Ausstellungsstellung
// Falls ja nicht auf den Radio-button reagieren
if (playerAusgangsstellung == false)
{
// Prüfen an welchem Player die Steuerelemente ausgelendet sind
// Das ist dann der kleinere Player und wird entsprechend der Beschreibung des Radio-Buttons verschoben
if (axWindowsMediaPlayer1.uiMode != "full")
{
axWindowsMediaPlayer1.Location = new Point(0, 425);
}
else if (axWindowsMediaPlayer2.uiMode != "full")
{
axWindowsMediaPlayer2.Location = new Point(0, 425);
}
else { }
}
}

private void radioUntenRechts_CheckedChanged(object sender, EventArgs e)
{
// Prüfen, ob beide Player in Ausstellungsstellung
// Falls ja nicht auf den Radio-button reagieren
if (playerAusgangsstellung == false)
{
// Prüfen an welchem Player die Steuerelemente ausgelendet sind
// Das ist dann der kleinere Player und wird entsprechend der Beschreibung des Radio-Buttons verschoben
if (axWindowsMediaPlayer1.uiMode != "full")
{
axWindowsMediaPlayer1.Location = new Point(712, 425);
}
else if (axWindowsMediaPlayer2.uiMode != "full")
{
axWindowsMediaPlayer2.Location = new Point(712, 425);
}
else { }
}
}
// <!-- Ende Bild in Bild Possitionen --->
}
}[/src]

Einen winzigen Bug gibt es noch.
Wenn man noch einmal auf den groß gezogenen Player klickt, wechselt der Sound. Ich habe keinen Weg gefunden das zu unterbinden. Ansonsten gibt es nichts mehr soweit ich es feststellen konnte.

Außerdem habe ich die Playergröße so angepasst, dass es bei 16:9-Format keine schwarzen Balken mehr gibt.
 
Zuletzt bearbeitet:

KaPiTN

♪♪♫ wild at heart ♪♫♫♪

Registriert
14 Juli 2013
Beiträge
29.138
@Cyperfriend:

Ich habe mich richtig für Dich gefreut, als ich das gelesen habe.

Allerdings wurde das ein wenig getrübt, als ich Deine Änderungen gesehen habe.

1) Ich habe nicht alle Elemente au dem Schirm und kann auch nicht i den Vollbildmodus gehen, um das zu ändern.

2) Auf den Click-Event nicht mehr zu reagieren, war gar keine gute Idee. Daß durch eine Aktion, hier das drücken einer Maustaste, mehrere, ganz verschieden Events ausgelöst werden, hat durchaus einen Sinn.
Ich hatte schon geschrieben, das der Klick-Event nur ausgelöst wird, wenn man auf das Bild klickt, nicht auf die Steuerelemente des Players. Der Mouse-Down löst aber bei beiden aus.
Du hättest jetzt nicht alles in einem Handler zusammenfassen sollen.

Das Problem, was Du aktuell hast ist folgendes.
Wenn man, ohne eigenen Code auf das Bild doppelklickt, wechselt man in den Vollbildmodus oder zurück. Bei einem einfachem Klick, wird der Ton an- oder abgestellt.
Bislang war das egal, weil Du selber auch darauf reagiert hast und dann den Ton nach Deinem Wunsch eingestellt hast.
Du reagierst jetzt zwar nicht mehr auf den Klick, das Control aber schon.
Mein Rat wäre, das wieder zurück zu ändern.

Unter dem Strich aber klasse, das Du etwas Vorzeigbares geschaffen hast. Wie sagt man heute, cooler shice ;) , Dein Programm? :T
 

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • Thread Starter Thread Starter
  • #17
Danke. Ich mache das wieder rückgängig. War ich wohl zu übermotiviert beim Codeoptimieren. Das sind halt so Dinge wo mir die Erfahrung und halt auch das Wissen fehlt.
Warum du nicht alle Elemente auf dem Schirm hast verstehe ich nicht. Ich habe die feste Fenstergröße rausgenommen, damit sich die Fenstergröße an den Playern orientiert. (Wenn auch durch statische Zuweisung) Kannst du mir das Problem bitte näher beschreiben oder ein Screenshot machen?

Ja, das Programm war meine Idee und abgesehen von der Hilfe hier und auf das Zurückgreifen anderer (mal begonnener) Projekte und (viel) googeln habe ichs alleine hinbekommen. Momentan habe ich wieder eine "starke Phase", wo mir solche Dinge gelingen.
 
Zuletzt bearbeitet:

KaPiTN

♪♪♫ wild at heart ♪♫♫♪

Registriert
14 Juli 2013
Beiträge
29.138
screen.png
 

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • Thread Starter Thread Starter
  • #19
Spontan sieht es so aus, als wäre das Programmfenster größer als deine Desktopauflösung? Ich habe 1920*1080.
Wenn dem so ist, werde ich dahingehend nichts mehr fixen.

1) In PoC3 (Vermutlich bekommt das Tool dann aber eine richtige Versionsnummer, weil mittlerweile mehr daraus geworden ist als das Präsentieren einer Idee) möchte ich die Playergröße dynamisch halten und soll sich am Programmfenster orientieren. Dazu dann mehr, wenn es soweit ist.

2) Die Playergröße (nicht die Fenstergröße) ist noch statisch festgelegt und lässt sich dynamisch nicht verändern. Die Größe ist aber für mich genau richtig. Ich sehe ja nicht so gut, gehe entsprechend nah an den Bildschirm ran und für mich ist das daher die ideale Größe um alles gleichzeitig angenehm erfassen zu können.

Streng genommen wäre das Programm also nach Behebung des letzten Fehlers fertig. Ich möchte aber eine weitere Version machen, wo ich erstens noch mehr Erfahrung sammeln kann, zweitens von der jeder etwas hat und drittens brauche ich den Player ja vielleicht selbst mal an einem PC / Laptop mit niedrigerer Auflösung.
 

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • Thread Starter Thread Starter
  • #20
Ich habe den Code wieder zurückkopiert (an anderer Stelle natürlich auch gelöscht), aber der Audiobug ist nach wie vor vorhanden. Kannst du das bestätigen?
[src=csharp]using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Text.RegularExpressions;
using WMPLib;


namespace Multicam_View_PoC2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

// Globale Variablen
int lastPlayer;
bool playerAusgangsstellung;

public void MediaPlayer1_Klick()
{

// Player nicht mehr in Ausgangsstellung
playerAusgangsstellung = false;

// Größe der Player
axWindowsMediaPlayer1.Size = new Size(996, 625);
axWindowsMediaPlayer2.Size = new Size(284, 160);

// Position des großen Players
axWindowsMediaPlayer1.Location = new Point(0, 24);
// Kleiner gemachte Player in den vordergrund
axWindowsMediaPlayer2.BringToFront();
// Steuerelemente des kleineren Players ausblenden
axWindowsMediaPlayer2.uiMode = "none";
// Steuerelemente des großen Players (wieder) einblenden
axWindowsMediaPlayer1.uiMode = "full";

// Ton an / aus
axWindowsMediaPlayer1.settings.mute = true;
axWindowsMediaPlayer2.settings.mute = false;
radioButton1.Checked = true;

// Fenstergröße anpassen
this.Size = new Size(1010, 800);
}

public void MediaPlayer2_Klick()
{
// Player nicht mehr in Ausgangsstellung
playerAusgangsstellung = false;

// Größe der Player
axWindowsMediaPlayer2.Size = new Size(996, 625);
axWindowsMediaPlayer1.Size = new Size(284, 160);

// Position des großen Players
axWindowsMediaPlayer2.Location = new Point(0, 24);
// Kleiner gemachte Player in den vordergrund
axWindowsMediaPlayer1.BringToFront();
// Steuerelemente des kleineren Players ausblenden
axWindowsMediaPlayer1.uiMode = "none";
// Steuerelemente des großen Players (wieder) einblenden
axWindowsMediaPlayer2.uiMode = "full";

// Ton an / aus
axWindowsMediaPlayer1.settings.mute = false;
axWindowsMediaPlayer2.settings.mute = true;
radioButton2.Checked = true;

// Fenstergröße anpassen
this.Size = new Size(1010, 800);
}

public void keinBildInBild()
{
// Player in Ausgangsstellung
playerAusgangsstellung = true;

// Größe der Player
axWindowsMediaPlayer1.Size = new Size(640, 427);
axWindowsMediaPlayer2.Size = new Size(640, 427);

// Possition des Player nebeneinander anordnen
axWindowsMediaPlayer1.Location = new Point(0, 24);
axWindowsMediaPlayer2.Location = new Point(645, 24);

// Ton beider Player an
axWindowsMediaPlayer1.settings.mute = false;
axWindowsMediaPlayer2.settings.mute = false;
radioButton3.Checked = true;

// Steuerelemente beider Player (wieder) einblenden
axWindowsMediaPlayer1.uiMode = "full";
axWindowsMediaPlayer2.uiMode = "full";

// Fenstergröße anpassen
this.Size = new Size(1303, 800);
}

private void Form1_Load(object sender, EventArgs e)
{
playerAusgangsstellung = true;
}

// Datei öffnen für Player 1
private void dateiÖffnenKamera1ToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Videodateien (*.mp4)|*.mp4|Alle Dateien (*.*)|*.*";
if (ofd.ShowDialog() == DialogResult.OK)
{
string file = ofd.FileName;
axWindowsMediaPlayer1.URL = ofd.FileName;
axWindowsMediaPlayer1.Ctlcontrols.stop();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

// Datei öffnen für Player 2
private void dateiÖffnenKamera2ToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Videodateien (*.mp4)|*.mp4|Alle Dateien (*.*)|*.*";
if (ofd.ShowDialog() == DialogResult.OK)
{
string file = ofd.FileName;
axWindowsMediaPlayer2.URL = ofd.FileName;
axWindowsMediaPlayer2.Ctlcontrols.stop();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

private void mutlicamDateiErstellenToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "Multicam View (*.mcv)|*.mcv";
if (sfd.ShowDialog() == DialogResult.OK)
{
string file = sfd.FileName;
string pfadVideo1 = axWindowsMediaPlayer1.URL;
string pfadVideo2 = axWindowsMediaPlayer2.URL;
File.WriteAllText(sfd.FileName, pfadVideo1 + "\r\n" + pfadVideo2, Encoding.UTF8);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

private void playlistÖffnenToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Multicam(*.mcv|*.mcv";
if(ofd.ShowDialog() == DialogResult.OK)
{
string file = ofd.FileName;
var lines = File.ReadAllLines(file);
// Teile 1 auslesen
axWindowsMediaPlayer1.URL = lines[0];
axWindowsMediaPlayer1.Ctlcontrols.stop();
// Zeile 2 auslesen
axWindowsMediaPlayer2.URL = lines[1];
axWindowsMediaPlayer2.Ctlcontrols.stop();
}
}

private void toolStripMenuItem1_Click(object sender, EventArgs e)
{
MessageBox.Show("Multicam View PoC2.1");
}

private void radioButton1_CheckedChanged(object sender, EventArgs e)
{
// Ton für Player 1 einschalten
axWindowsMediaPlayer1.settings.mute = false;
// Ton für Player 2 ausschalten
axWindowsMediaPlayer2.settings.mute = true;
}

private void radioButton2_CheckedChanged(object sender, EventArgs e)
{
// Ton für Player 1 ausschalten
axWindowsMediaPlayer1.settings.mute = true;
// Ton für Player 2 einschalten
axWindowsMediaPlayer2.settings.mute = false;
}

private void radioButton3_CheckedChanged(object sender, EventArgs e)
{
// Ton beider Player einschalten
axWindowsMediaPlayer1.settings.mute = false;
axWindowsMediaPlayer2.settings.mute = false;
}

private void cmdPlay_Click(object sender, EventArgs e)
{
// Beide Player gleichzeitig die Videos abspielen lassen
axWindowsMediaPlayer1.Ctlcontrols.play();
axWindowsMediaPlayer2.Ctlcontrols.play();
// Text des Play-Buttons (wieder) auf Play setzen.
cmdPlay.Text = "Play";
}

private void cmdPause_Click(object sender, EventArgs e)
{
// Videos pausieren
axWindowsMediaPlayer1.Ctlcontrols.pause();
axWindowsMediaPlayer2.Ctlcontrols.pause();
// Text des Play-Buttons wenn die Videos pausiert werden
cmdPlay.Text = "Weiter";
}

private void axWindowsMediaPlayer1_MouseDownEvent(object sender, AxWMPLib._WMPOCXEvents_MouseDownEvent e)
{
// Wird Player 1 (egal wo und wie) angeklickt den Player entsprechend markieren
// Wichtig um bei den Sprungmarken unterscheiden zu können welcher Player sich dem Anderen anpassen muss
lastPlayer = 1;
}

private void axWindowsMediaPlayer2_MouseDownEvent(object sender, AxWMPLib._WMPOCXEvents_MouseDownEvent e)
{
// Wird Player 2 (egal wo und wie) angeklickt den Player entsprechend markieren
// Wichtig um bei den Sprungmarken unterscheiden zu können welcher Player sich dem Anderen anpassen muss
lastPlayer = 2;
}

private void axWindowsMediaPlayer1_PositionChange(object sender, AxWMPLib._WMPOCXEvents_PositionChangeEvent e)
{
// Wird die Sprungmarke an Player 1 geändert zieht Player 2 gleich
if (lastPlayer == 1)
{
axWindowsMediaPlayer2.Ctlcontrols.currentPosition = axWindowsMediaPlayer1.Ctlcontrols.currentPosition;
}
}

private void axWindowsMediaPlayer2_PositionChange(object sender, AxWMPLib._WMPOCXEvents_PositionChangeEvent e)
{
// Wird die Sprungmarke an Player 2 geändert zieht Player 1 gleich
if (lastPlayer == 2)
{
axWindowsMediaPlayer1.Ctlcontrols.currentPosition = axWindowsMediaPlayer2.Ctlcontrols.currentPosition;
}
}

// <!-- Anfang Bild in Bild Possitionen --->
private void radioAus_CheckedChanged(object sender, EventArgs e)
{
playerAusgangsstellung = true;
keinBildInBild();
}

private void radioObenLinks_CheckedChanged(object sender, EventArgs e)
{
// Prüfen, ob beide Player in Ausstellungsstellung
// Falls ja nicht auf den Radio-button reagieren
if (playerAusgangsstellung == false)
{
// Prüfen an welchem Player die Steuerelemente ausgelendet sind
// Das ist dann der kleinere Player und wird entsprechend der Beschreibung des Radio-Buttons verschoben
if (axWindowsMediaPlayer1.uiMode != "full")
{
axWindowsMediaPlayer1.Location = new Point(0, 24);
}
else if (axWindowsMediaPlayer2.uiMode != "full")
{
axWindowsMediaPlayer2.Location = new Point(0, 24);
}
else { }
}
}

private void radioObenRechts_CheckedChanged(object sender, EventArgs e)
{
// Prüfen, ob beide Player in Ausstellungsstellung
// Falls ja nicht auf den Radio-button reagieren
if (playerAusgangsstellung == false)
{
// Prüfen an welchem Player die Steuerelemente ausgelendet sind
// Das ist dann der kleinere Player und wird entsprechend der Beschreibung des Radio-Buttons verschoben
if (axWindowsMediaPlayer1.uiMode != "full")
{
axWindowsMediaPlayer1.Location = new Point(712, 24);
}
else if (axWindowsMediaPlayer2.uiMode != "full")
{
axWindowsMediaPlayer2.Location = new Point(712, 24);
}
else { }
}
}

private void radioUntenLinks_CheckedChanged(object sender, EventArgs e)
{
// Prüfen, ob beide Player in Ausstellungsstellung
// Falls ja nicht auf den Radio-button reagieren
if (playerAusgangsstellung == false)
{
// Prüfen an welchem Player die Steuerelemente ausgelendet sind
// Das ist dann der kleinere Player und wird entsprechend der Beschreibung des Radio-Buttons verschoben
if (axWindowsMediaPlayer1.uiMode != "full")
{
axWindowsMediaPlayer1.Location = new Point(0, 425);
}
else if (axWindowsMediaPlayer2.uiMode != "full")
{
axWindowsMediaPlayer2.Location = new Point(0, 425);
}
else { }
}
}

private void radioUntenRechts_CheckedChanged(object sender, EventArgs e)
{
// Prüfen, ob beide Player in Ausstellungsstellung
// Falls ja nicht auf den Radio-button reagieren
if (playerAusgangsstellung == false)
{
// Prüfen an welchem Player die Steuerelemente ausgelendet sind
// Das ist dann der kleinere Player und wird entsprechend der Beschreibung des Radio-Buttons verschoben
if (axWindowsMediaPlayer1.uiMode != "full")
{
axWindowsMediaPlayer1.Location = new Point(712, 425);
}
else if (axWindowsMediaPlayer2.uiMode != "full")
{
axWindowsMediaPlayer2.Location = new Point(712, 425);
}
else { }
}
}
// <!-- Ende Bild in Bild Possitionen --->

private void axWindowsMediaPlayer1_ClickEvent(object sender, AxWMPLib._WMPOCXEvents_ClickEvent e)
{
if (radioAus.Checked)
{
playerAusgangsstellung = true;
keinBildInBild();
}

if (radioObenLinks.Checked)
{
playerAusgangsstellung = false;
axWindowsMediaPlayer2.Location = new Point(0, 24);
MediaPlayer1_Klick();
}
if (radioObenRechts.Checked)
{
playerAusgangsstellung = false;
axWindowsMediaPlayer2.Location = new Point(712, 24);
MediaPlayer1_Klick();
}
if (radioUntenLinks.Checked)
{
playerAusgangsstellung = false;
axWindowsMediaPlayer2.Location = new Point(0, 425);
MediaPlayer1_Klick();
}
if (radioUntenRechts.Checked)
{
playerAusgangsstellung = false;
axWindowsMediaPlayer2.Location = new Point(712, 425);
MediaPlayer1_Klick();
}
}

private void axWindowsMediaPlayer2_ClickEvent(object sender, AxWMPLib._WMPOCXEvents_ClickEvent e)
{
if (radioAus.Checked)
{
playerAusgangsstellung = true;
keinBildInBild();
}
if (radioObenLinks.Checked)
{
playerAusgangsstellung = false;
axWindowsMediaPlayer1.Location = new Point(0, 24);
MediaPlayer2_Klick();
}
if (radioObenRechts.Checked)
{
playerAusgangsstellung = false;
axWindowsMediaPlayer1.Location = new Point(712, 24);
MediaPlayer2_Klick();
}
if (radioUntenLinks.Checked)
{
playerAusgangsstellung = false;
axWindowsMediaPlayer1.Location = new Point(0, 425);
MediaPlayer2_Klick();
}
if (radioUntenRechts.Checked)
{
playerAusgangsstellung = false;
axWindowsMediaPlayer1.Location = new Point(712, 425);
MediaPlayer2_Klick();
}
}
// <!-- Ende Bild in Bild Possitionen --->
}
}[/src]
 
Oben