Video abspielen mit dem WindowsMediaPlayer ABER Audio von anderem Programm (Bass.dll)// Fehler Lippensynchronisation

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Video abspielen mit dem WindowsMediaPlayer ABER Audio von anderem Programm (Bass.dll)// Fehler Lippensynchronisation

    Hi,

    Quell-Datei ist eine .mp4 Datei. Die Audiospur der Mp4-Datei lese, verändere und spiele ich über die Bass.dll ab. Das Videosignal zeige ich über den Windowsmediaplayer an (Audio ist dort dann gemuted).

    Leider bekomme ich es nicht hin die beiden "Streams" genau Zeitgleich abzuspiele. Ziel ist es das Audisignal mit der Bass.dll zu verändern (z.B. EQ) und synchron mit dem Video anzuzeigen.

    VB.NET-Quellcode

    1. .....
    2. Bass.BASS_ChannelPlay(mixer, False) 'Starte das Abspielen der Audiospur
    3. FrmMediaPlayer.AxWindowsMediaPlayer1.Ctlcontrols.play() 'Starte in der nächsten Zeile das Abspielen des VideoSignals
    4. ....
    5. 'Zur Kontrolle der Position beide in Sek. angezeigt
    6. LbPosVideo.Text = "VideoPos (double): " & AxWindowsMediaPlayer1.Ctlcontrols.currentPosition.ToString
    7. Dim pos As Long = Bass.BASS_ChannelGetPosition(FrmEq.mixer)
    8. LbPosAudio.Text = "AudioPos (ChannelBytes2Seconds): " & Bass.BASS_ChannelBytes2Seconds(FrmEq.mixer, pos).ToString


    Die beiden Streams liegen ca. 0,3 sek auseinander und driften langsam weiter auseinander.

    Wie bekomme ich es hin, dass beide immer die gleiche Position haben/abspielen? Die Audiospur auf die Position des Videostreams zu bringen habe ich bereits versucht mit ​Bass.BASS_ChannelSetPosition(FrmEq.mixer, Bass.BASS_ChannelSeconds2Bytes(FrmEq.mixer, AxWindowsMediaPlayer1.Ctlcontrols.currentPosition), BASSMode.BASS_POS_BYTE)
    Das brachte nix.

    Ich hab bei meiner Recherche folgendes gefunden

    MediaTimeline Class

    Kenn sich jemand damit aus. Ich bin noch ein ziemlicher Noob ;)
    codewars.com Rank: 4 kyu
    @nogood Wird die MP4 mit einem anderen Player korrekt wiedergegeben?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany Ja die Mp4 Datei wird korrekt wiedergegeben, wenn man Sie abspielt. Sie würde auch im WindowsMediaPlayer korrekt wiedergegeben. Mein Problem ist beim "späteren gemeinsamen" abspielen die Asynchronizität der beiden Stream. Windowsmediaplaye (Audio ist stumm) spielt das Video Bass.dll spielt den Sound.
    codewars.com Rank: 4 kyu
    @nogood Die MP4 wird auf zwei Geräten simultan wiedergegeben?
    Ich könnte mir vorstellen, dass der WMP den Hardware-Timer verwendet und die Bass-DLL einen Software-Timer.
    Sieh mal nach, ob die Bass-DLL einen Parameter hat, dass der Hardware-Timer verwendet werden soll.
    Was passiert, wenn Du 2 Instanzen WMP verwendest?
    Den VLC-Player kann man in mehreren Instanzen starten.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    WMP den Hardware-Timer verwendet und die Bass-DLL einen Software-Timer.
    Da komm ich im Moment nicht weiter, dass übersteigt mein Recherchekönnen. Ich kann leider keine Beispiele zur der von mir in Post eins erwähnten MediaTimeline finden (oder ist das ein Holzweg in diesem Fall).
    In Bass.dll Help finde ich nichts wo ich das timer Verhalten für das Abspielen verändern kann. Ich kann die Abspielgeschwindigkeit des Audiostreams ändern. Damit könnte man den "Drift" später "einfangen". Der anfänglichen Offset von ca. 0.3 Sek auf meinem Pc bekomme ich so nicht weg.

    Ich hab deinen Vorschlag die Datei zeitgleich mit 2 WindowsMediaplayer abzuspielen ausprobiert. Das scheint ohne Probleme zu klappen. Falls da ein Delay/Offset sein sollte, konnte ich es mit dem bloßen Auge/Ohr nicht wahrnehmen.


    Ich frage mich wie ich die Clock vom AudioStream und die Clock vom Video zusammenbringe.


    P.S.: Da fällt mir ein, dass ich ja auch beim Abfragen der Position von Video und Audio einen "Fehler" mache. Wenn ich erst die Position des einen Streams abfrage und dann in der nächsten Codezeile die Position des anderen Streams ist dieser ja in der Zwischenzeit auch etwas weiter gelaufen?
    codewars.com Rank: 4 kyu

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „nogood“ ()

    nogood schrieb:

    Ich frage mich wie ich die Clock vom AudioStream und die Clock vom Video zusammenbringe.
    Das geht nicht, das ist tief innen drinnen.
    Vielleicht kannst Du mal die Bass-Leute selbst kontaktieren und Dein Problem schildern, die haben gewiss auch ein Forum.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!