VisualBasic Sound abspielen - einfachste Lösung?

o0Julia0o

Commander
Registriert
Dez. 2012
Beiträge
2.738
Folgenden Code um eine Datei abzuspielen hat google mir verraten:

Code:
Set Sound = CreateObject("WMPlayer.OCX.7")
Sound.URL = "D:\PfadZurMP3\test.mp3"
Sound.Controls.play
do while Sound.currentmedia.duration = 0
wscript.sleep 100
loop
wscript.sleep (int(Sound.currentmedia.duration)+1)*1000

Er funktioniert. Die Datei wird abgespielt, man hört sie nur, man sieht keinen Player. Gibt es aber eine einfachere resourcenschonendere Möglichkeit? Mit diesem sleep und loop das verwirrt mich etwas. Die Datei soll doch nur 1x abgespielt werden und das wird sie auch. Es wird nichts geloopt. Lasse ich loop aber z.B. weg, dann wird gar nichts mehr abgespielt.
 
Danke euch. Also das hier spielt gar nichts ab:

Code:
Sub PlayBackgroundSoundFile()
    My.Computer.Audio.Play("D:\Ordner1\test.wav",
        AudioPlayMode.WaitToComplete)
End Sub
Ich erhalte folgendes stattdessen:
2021-07-02 00_12_36-Windows Script Host.png

Die test.wav, welche so mit dem WindowsMediaPlayer funktioniert liegt in D:\Ordner1. Es gibt nur 49 Zeichen in der 2. Codezeile.
 
.vbs und Visual Basic ist nicht das gleiche.

Ohne loop:
Code:
Set Sound = CreateObject("WMPlayer.OCX")
Sound.URL = "D:\PfadZurMP3\test.mp3"
Sound.Controls.play
wscript.sleep 1000
wscript.sleep (int(Sound.currentmedia.duration))*1000
 
  • Gefällt mir
Reaktionen: o0Julia0o und BAGZZlash
till69 schrieb:
.vbs und Visual Basic ist nicht das gleiche.
Und VBS ist faktisch tot. Nicht machen.

Aber zur Erläuterung: die Methode .Play() aus dem ActiveX Control, die hier verwendet wird, ist asynchron und läuft in einem eigenen Thread.
Dazu kommt, daß wenn das Script beendet wird, dann werden auch alle aufgerufenen Threads terminiert.

Beides zusammen führt dazu, daß man im Script auf Beendigung von .Play() explizit warten muß, und zwar so lange, bis
(A) man ein Event ausgelöst bekommt und das verarbeiten kann (soweit VBS einen das überhaupt läßt); oder
(C) man den Thread (spätestens) zum angegebenen Zeitpunkt selber terminieren läßt.

Alternativ gibt es evtl auch synchrone Funktionen, entweder gesondert oder per Argument.

Außerdem besteht ggfs die Möglichkeit, den Thread eben nicht mitsamt dem Aufrufer terminieren zu lassen. Aber das ist gefährlich - die Audiodatei läuft dann einfach unkontrollierbar weiter bis sie fertig ist und wenn man jetzt zB das Script nochmal starten würde, dann würden eben zwei Audiodateien gleichzeitig abgespielt werden.

In diesem Fall implementieren Loop() und Sleep() die zweite Option.
Mit Powershell / VB.NET oder sonst einer .Net Sprache ließe sich auch Option A implementieren, bzw. Option B um einen Fortschrittsbalken ergänzen (via Loop() ).
 
  • Gefällt mir
Reaktionen: Hayda Ministral
@ o0Julia0o
Was möchtest Du machen?
Aufgrund der verschiedenen Threads zum selben Thema: Wofür? Warum? Für was soll es angewendet werden?

Es gibt zig verschiedene Programmiersprachen. Müssen wir jetzt jeweils seperate Threads zum selben Thema SoundPlay erwarten?

Ist es zielführend irgendwelchen Quelltext aus dem Internet zu kopieren & dann hier zu posten, wenn man nicht weiterkommt?

Ist es nicht sinnvoller bei Sprachen zu bleiben, welche man schon beherrscht & diese dann zu vertiefen (statt immer ein neues Fass aufzumachen)?
 
till69 schrieb:
Code:
Set Sound = CreateObject("WMPlayer.OCX")
Sound.URL = "D:\PfadZurMP3\test.mp3"
Sound.Controls.play
wscript.sleep 1000
wscript.sleep (int(Sound.currentmedia.duration))*1000
Ein Programm läd etwas länger, damit man weiß, man hat es gestartet soll bereits ein Startsond direkt abgespielt werden. Aber parallel schon das Programm geladen werden. Außerdem soll das ohne Fenster geschehen, einfach so im Hintergrund der Sound abgespielt werden.

Der oben genannte code funktioniert zwar, aber nicht zuverlässig. Manchmal wird ein Sound abgespielt, manchmal nicht.

Geht das gleiche was der code da oben macht mit diesem Powersehell zuverlässiger?

Zum wav abspielen geht es so:
(New-Object Media.SoundPlayer Dateipfad.wav).Play()

Aber er soll das ja wie VB gleichzeitig machen:
Code:
WScript.CreateObject( "WScript.Shell" ).Run ".\Run.bat",0,0
Set Sound = CreateObject("WMPlayer.OCX")
Sound.URL = "D:\PfadZurMP3\test.mp3"
Sound.Controls.play
wscript.sleep 1000
wscript.sleep (int(Sound.currentmedia.duration))*1000
Also die 1. Zeile ausführen und währenddessen parallel schon die anderen Zeilen ausführen für die Soundwiedergabe.
 
Zuletzt bearbeitet:
Dann müssen die Befehle parallel ausgeführt werden.
https://stackoverflow.com/questions/4016451/can-powershell-run-commands-in-parallel
https://devblogs.microsoft.com/powershell/powershell-foreach-object-parallel-feature/


o0Julia0o schrieb:
Geht das gleiche was der code da oben macht mit diesem Powersehell zuverlässiger
Egal in welcher Sprache du es machst, ist es überall gleich zuverlässig.
Du schreibst ein Programm, führst es aus und dann macht das was Du geschrieben hast
 
In VB ist es jedoch nicht zuverlässig. Manchmal wird der Sound abgespielt, manchmal nicht.

Weiß das Jemand wie man eine batch per Powershell und spiele parallel eine mp3-datei ab(aber ohne Fenster im Hintergrund)? Was ich über Powershell gefunden habe, kann es keine Programme ohne Fenster ausführen.
 
Zurück
Oben