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.
----------------------------------------------------------------------------------------
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: