Programm beenden

  • Hallo zusammen,

    ich denke, ich stelle mich gerade doof an:

    Wenn ich im passenden Ordner die Kommandozeile

    Code
    cvlc test.wav

    eingebe, dann spielt mein VLC-Player die datei test ab.

    Dummerweise beendet er sich danach aber nicht. Das kann ich nur in einem zweiten Fenster mit

    Code
    killall vlc

    machen.

    Weiß da jemand eine Lösung?

    Eigentlich möchte ich in einem c++ - Programm den Player aufrufen, um im Programm kurze Audiodateien abzuspielen.

    Da ist das Problem aber das gleiche. Erst, nachdem ich im Terminal Killall vlc eingegeben habe, läuft das Programm weiter.

    Im c++ heißt das dann:

    Code
    system("cvlc test.wav");

    Gruss,

    Achim

  • Beitrag von __blackjack__ (5. November 2022 um 12:56)

    Dieser Beitrag wurde gelöscht, Informationen über den Löschvorgang sind nicht verfügbar.
  • Na das hat es vorher doch auch getan. Falls Du das nicht willst, darfst Du halt keine blockierende Funktion wie `system()` verwenden. Und machst damit dann aber gleich einen ganzen Haufen weiterer Baustellen auf, denn wenn Du externe Programme asynchron startest, musst Du anfangen Dich damit auseinanderzusetzen wie man die dann wieder ordentlich aufräumt, also beispielsweise den Rückgabecode abfragen, damit keine Zombie-Prozesse entstehen. Und im konkreten Fall wohl auch sicherstellen, dass immer nur ein Sound gleichzeitig laufen kann.

    Was ist das denn für ein Programm? Warum löst Du die Soundausgabe so komisch über externe Programme? Könnte man dafür nicht ganz normal eine Bibliothek in das Programm einbinden? Also beispielsweise `libvlc` statt da erst eine Shell zu starten, die dann ``cvlc`` ausführt, was dann letztlich ja `libvlc` verwendet.

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • Aber jetzt hält leider mein Progamm an, während die Sounddatei gespielt wird....

    Und vorher, d. h. ohne "--play-and-exit", war das nicht der Fall?

    Wenn es aplay auf deinem PI gibt:

    Code
    which aplay

    , dann teste mal mit:

    Code
    aplay test.wav

    EDIT:

    BTW: Wenn es aply gibt und mit deiner test.wav nicht funktioniert, kannst aplay auf deinem PI mit:

    Code
    echo "g(i,x,t,o){return((3&x&(i*((3&i>>16?\"BY}6YB6$\":\"Qj}6jQ6%\")[t%8]+51)>>o))<<4);};main(i,n,s){for(i=0;;i++)putchar(g(i,1,n=i>>14,12)+g(i,s=i>>17,n^i>>13,10)+g(i,s/3,n+((i>>11)%3),10)+g(i,s/5,8+n-((i>>10)%3),9));}" | gcc -o playsound -s -x c - && ./playsound | aplay

    testen. Abbrechen mit "strg c" und danach "rm ./playsound". Quelle: Internet

    The most popular websites without IPv6 in Germany.  IPv6-Ausreden

    Meine PIs

    PI4B/8GB (border device) OpenBSD 7.4 (64bit): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server

    PI3B+ FreeBSD 14.0-R-p6 (arm64): SSH-Serv., WireGuard-Serv., ircd-hybrid-Serv., stunnel-Proxy, Mumble-Serv., ddclient

    PI4B/4GB Bullseye-lite (64bit; modifiziert): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server, botamusique, ample

    Einmal editiert, zuletzt von rpi444 (5. November 2022 um 14:14)

  • Was ist das denn für ein Programm? Warum löst Du die Soundausgabe so komisch über externe Programme? Könnte man dafür nicht ganz normal eine Bibliothek in das Programm einbinden? Also beispielsweise `libvlc` statt da erst eine Shell zu starten, die dann ``cvlc`` ausführt, was dann letztlich ja `libvlc` verwendet.

    Wenn ich wüsste wie das geht.... ;(

    Ich starte ein Video mit opencv und VideoCapture. Wenn ich eine bestimmte Taste drücke soll ein Schuss zu hören sein.

  • Beispiel mit CVLC + Popen:


    Das ist keine Ideale Lösung, da die Instanz von VLC einfach weiterläuft, wenn man das Programm killt.

    Popen blockiert nicht, sondern führt den Prozess im Hintergrund einfach aus.

    Deswegen habe ich atexit.register verwendet, um alles zu killen, bevor der Interpreter beendet wird.

    Für VLC gibt es aber auch für Python Bibliotheken, die weitaus mehr können und nicht diese halbgare Lösung verfolgen.

  • @DeaD_EyE Die Programmiersprache hier ist C++. Bei Python hätte ich noch weniger verstanden warum keine Bibliothek eingebunden wird und hätte auch schon was zu `system()` gesagt. ?

    Der `status` ist ja streng genommen redundant wenn man `proc` wieder auf `None` setzen würde bei `stop()`.

    Statt `atexit` hätte ich da einen Kontextmanager draus gemacht.

    Ungetestet:

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • Moin,

    danke, das Ihr Euch um mich kümmert. :danke_ATDE:

    Aber von dem, was Ihr schreibt, verstehe ich nur die Hälfte. (vielleicht auch ein bisschen weniger....)

    Bei Python bin ich ganz raus...

    Ich hab gerade erstmal mit

    Code
    sudo apt-get install libvlc-dev

    das libvlc-Ding installiert.

    Dann im Programm mit

    Code
    #include <vlc/vlc.h>

    eingebunden.

    Jetzt versuche ich mich mal schlau zu machen wie ich das im Programm aufrufen muss....

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!