Bilder und Videos in Programm einbinden

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
__blackjack__
User
Beiträge: 13064
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ja genau, und Deine Antwort darauf verstehe ich nicht. Solange Du das Video in Deinem Programm nicht abspielen kannst, macht es wenig Sinn darüber nachzudenken ob und wie man die Datei einbetten kann.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Achsoo... Okey, hättest vllt genauer formulieren sollen. ^^
Naja, abgespielt sollte es eigentlich per Mausklick auf's Video bzw Thumbnail - was auch immer richtig wäre.
Z.B. wenn man YouTube Videos in einem Forumpost einbettet, da klickt man ja auch bloß aufs Video.
Benutzeravatar
__blackjack__
User
Beiträge: 13064
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Und wie machst Du das?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Das weiß ich eben nicht.
Kannst du es vllt erklären, wie ich das Ziel erreichen kann?
Heißt jetzt nicht unbedingt fertigen Code, aber so schritte/Erklärung wie ich zum Ziel komme, wäre sehr gut und nett.
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Also, das hier wäreso ein Beispiel, wie es aussehen soll:

Code: Alles auswählen

import tkinter, os

main = tkinter.Tk()
main.geometry("500x304")
main.title("Video Player - Test")

def playVideo1():
    os.system("/media/pi/DISK_IMG/Filme/Zombieland.mp4")

canvas = tkinter.Canvas(main,background="black")
canvas.pack(side="top")
playBTN = tkinter.Button(main, text="Play Video",command=playVideo1)
playBTN.place(x=250,y=300,anchor="s")
Da, wo die schwarze Leinwand (Canvas) ist, da soll das Video abgespielt werden.
Hätte es zwar gern, dass man wie bei YouTube bloß auf das Video klicken muss, aber glaube mit Button ist es vllt einfacher - weiß nicht?
Wie lasse ich nun da ein Video abspielen und wie ein Bild?

PS. mit PhotoImage kommt immer ein Fehler mit "couldn't recognized data in image" oder so ähnlich.
Benutzeravatar
__blackjack__
User
Beiträge: 13064
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@xXSkyWalkerXx1: Tjaaa, genau das ist das Problem. Wenn ich das tatsächlich lösen müsste, würde ich schauen welche Bibliothek mit Python-Anbindung es mir erlaubt ein Abspielfenster über X-Window-Fenster-ID in einem Tk-`Frame` darzustellen. Vermutlich geht das irgendwie mit gstreamer. Ich denke aber das geht momentan über Deine Fähigkeiten hinaus.

Oder ich würde ein GUI-Rahmenwerk verwenden, das diese Aufgabe einfacher macht.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Tholo
User
Beiträge: 177
Registriert: Sonntag 7. Januar 2018, 20:36

@skyWalker
Kivy is dafür sehr gut geeignet und hat den Player bereits an Bord. QT5 kann das nach meiner Kenntnis auch bewerkstelligen.

Eine bitte würde ich gleich hierlassen wollen. Kannst du ggf. ein bisschen Eigeninitiative zeigen und Google bemühen etc. Mir (persönlich) kommt es zZ so vor als würdest du wegen jeder 2ten Zeile einen Post eröffnen. Nicht das ich dein Projekt nicht interessant und die Ansätze von deets, Thomas und vielen anderen sehr anschaulich finde. Aber viele Sachen sind offensichtlich auch in Eigenregie zu erfahren.

Ich habe das Gefühl das viele Informationen in der Flut an Posts untergehen.

Kann mich allerdings auch täuschen und verkenne den Lerneffekt durch die Posts.
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Tholo hat geschrieben: Freitag 13. Juli 2018, 16:27 @skyWalker
Kivy is dafür sehr gut geeignet und hat den Player bereits an Bord. QT5 kann das nach meiner Kenntnis auch bewerkstelligen.

Eine bitte würde ich gleich hierlassen wollen. Kannst du ggf. ein bisschen Eigeninitiative zeigen und Google bemühen etc. Mir (persönlich) kommt es zZ so vor als würdest du wegen jeder 2ten Zeile einen Post eröffnen. Nicht das ich dein Projekt nicht interessant und die Ansätze von deets, Thomas und vielen anderen sehr anschaulich finde. Aber viele Sachen sind offensichtlich auch in Eigenregie zu erfahren.

Ich habe das Gefühl das viele Informationen in der Flut an Posts untergehen.

Kann mich allerdings auch täuschen und verkenne den Lerneffekt durch die Posts.
Hallo! ^-^

Ja, ich versuche eigentlich schon so wenig wie möglich hier nachzufragen.
Das Problem ist, dass man (als Bsp. dieses Thread) garnichts dazu findet, wie man Videos einfügt.
Ebenfalls Bilder, da ich viele Codes/Bsp./Tutorials gesehen habe, aber ich immer die gleiche Fehlermeldung bekomme: "couldn't recognize data in image" oder so ähnlich.
Und zu dem Fehler habe ich bloß gefunden, dass man das Bild in ein GIF umwandeln soll - getan, gleiche Fehlermedlung.

Und so manch Posts von __deets__ und __blackjack__ hat mir echt sehr weitergeholfen. :)

Mit freundlichen Grüßen,
xXSkyWalkerXx1
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

__blackjack__ hat geschrieben: Freitag 13. Juli 2018, 15:46 @xXSkyWalkerXx1: Tjaaa, genau das ist das Problem. Wenn ich das tatsächlich lösen müsste, würde ich schauen welche Bibliothek mit Python-Anbindung es mir erlaubt ein Abspielfenster über X-Window-Fenster-ID in einem Tk-`Frame` darzustellen. Vermutlich geht das irgendwie mit gstreamer. Ich denke aber das geht momentan über Deine Fähigkeiten hinaus.

Oder ich würde ein GUI-Rahmenwerk verwenden, das diese Aufgabe einfacher macht.
Gute Idee! :D Ich schau mal welche es gibt.

Kann man mehrer Frameworks in einem Code nutzen?
Denke mal wahrscheinlich ja, aber möcht lieber erstmal nachfragen. ^^
Benutzeravatar
__blackjack__
User
Beiträge: 13064
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Nein kann man nicht.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Ohh. Schade... :D

Dann muss ich so ziemlich neu anfangen - naja gut, wahrscheinlich bloß paar Dinge ersetzen.
Hast du nen Tipp, welchen Framework ich am Besten verwenden soll?
Mein Ziel soll es sein, eine sehr schöne - moderne GUI erstellen zu können, mit Updatefunktion, Video einbetten u. abspielen, später Online Shop und co.
Benutzeravatar
__blackjack__
User
Beiträge: 13064
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@xXSkyWalkerXx1: Ich persönlich bin bei Qt gelandet wenn Tk nicht ausreicht. Wobei man neben den technischen Details die Rechtlichen bedenken muss. Also Lizenzen von Bibliotheken und Anbindungen daran. Insbesondere Du, weil Du ja so gerne alles verstecken möchtest. :-D
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Tholo
User
Beiträge: 177
Registriert: Sonntag 7. Januar 2018, 20:36

Ich hab dir doch deswegen bereits kivy empfohlen. Der Einstieg ist für Anfänger gut dokumentiert und du hast eine Gui welche mit Camera, video und multi touch klar kommt.
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

__blackjack__ hat geschrieben: Freitag 13. Juli 2018, 18:59 @xXSkyWalkerXx1: Ich persönlich bin bei Qt gelandet wenn Tk nicht ausreicht. Wobei man neben den technischen Details die Rechtlichen bedenken muss. Also Lizenzen von Bibliotheken und Anbindungen daran. Insbesondere Du, weil Du ja so gerne alles verstecken möchtest. :-D
Ja, denke auch gerade mit PyQt weiter zu machen / neu an zu fangen. :D Und Tk ist zwar für'n Anfang ok, aber ich will ja mehr und besondereres machen - für meine Community und Käufer. :D
Wie meinst das mit den Lizenzen von Biblios und deren Anbindung bzw dessen rechtliche Bedenken? ^^ Meinst, da ich ja meine Skripts und so verstecken möchte und ich das erstmal richtig hingriegen muss - so in der Art, oder wie? :D
Tholo hat geschrieben: Freitag 13. Juli 2018, 20:23 Ich hab dir doch deswegen bereits kivy empfohlen. Der Einstieg ist für Anfänger gut dokumentiert und du hast eine Gui welche mit Camera, video und multi touch klar kommt.
Ja, aber Kivy ist doch weniger dafür geeignet, sondern eher für NUIs.
Benutzeravatar
__blackjack__
User
Beiträge: 13064
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@xXSkyWalkerXx1: Wenn Du GPL-Lizensierte Bibliotheken verwendest, dann kannst Du Deinen Code schlecht verstecken, denn dann können Deine Benutzer den Quelltext von Dir verlangen und Dich gegebenenfalls vor Gericht bringen, wenn Du den nicht raus rückst.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi xXSkyWalkerXx1

Kannst du mit dem folgenden Skript einmal versuchen ein .mp4 Video abzuspielen?:

Code: Alles auswählen

import sys
import os

from functools import partial
import tkinter as tk

import gi
gi.require_version('Gst', '1.0')
from gi.repository import Gst
# Needed for set_window_handle():
gi.require_version('GstVideo', '1.0')
from gi.repository import GstVideo

APP_TITLE = "GStreamer"
APP_XPOS = 100
APP_YPOS = 100
APP_WIDTH = 400
APP_HEIGHT = 400


class Application(object):

    def __init__(self, master):
        self.master = master
        self.master.protocol("WM_DELETE_WINDOW", self.close)
        
        self.main_frame = tk.Frame(master, relief='sunken', bd=6)
        self.main_frame.pack(padx=10, pady=10)
        
        self.display_frame = tk.Frame(self.main_frame, width=530, height=300,
            relief='sunken', bd=2)
        self.display_frame.pack()
        
        self.button_frame = tk.Frame(master)
        self.button_frame.pack(expand=True, pady=(0, 10))
        
        tk.Button(self.button_frame, text="Start",
            command=partial(self.video_control, 'start')).pack(side='left')
        tk.Button(self.button_frame, text="Pause",
            command=partial(self.video_control, 'pause')).pack(side='left')
        tk.Button(self.button_frame, text="Stop",
            command=partial(self.video_control, 'stop')).pack(side='left')

        self.var_time = tk.StringVar(master, "0:00")
        tk.Label(self.button_frame, textvariable=self.var_time, width=6,
            bg='white').pack(side='left')
        self.frame_id = self.display_frame.winfo_id()
        
        fullname = os.path.join(os.getcwd(), "MyVideo.mp4")
        self.player = Gst.ElementFactory.make('playbin', None)
        self.player.set_property('uri', 'file://%s' % fullname)
        self.player.set_state(Gst.State.PLAYING)

        bus = self.player.get_bus()
        bus.enable_sync_message_emission()
        bus.connect('sync-message::element', self.set_frame_handle,
            self.frame_id)
    
    def close(self):
        self.master.withdraw()
        self.player.set_state(Gst.State.NULL)
        self.master.destroy()
        
    def video_control(self, action):
        if action == 'start':
            duration_nanosecs = self.player.query_duration(Gst.Format.TIME)[1]
            duration = float(duration_nanosecs) / Gst.SECOND
            print("Dauer:", duration)
            
        elif action == 'pause':
            self.player.set_state(Gst.State.PAUSED)
            nanosecs = self.player.query_position(Gst.Format.TIME)[1]
            position = float(nanosecs) / Gst.SECOND
            print("Position:", position)
            
        elif action == 'stop':
            self.player.set_state(Gst.State.NULL)
            
    def set_frame_handle(self, bus, message, frame_id):
        if not message.get_structure() is None:
            if message.get_structure().get_name() == 'prepare-window-handle':
                display_frame = message.src
                display_frame.set_property('force-aspect-ratio', True)
                display_frame.set_window_handle(frame_id)
           
def main():
    app_win = tk.Tk()
    app_win.title(APP_TITLE)
    app_win.geometry("+{}+{}".format(APP_XPOS, APP_YPOS))
    #app_win.geometry("{}x{}".format(APP_WIDTH, APP_HEIGHT))
    
    Gst.init(None)
        
    app = Application(app_win)
    
    app_win.mainloop()
 
 
if __name__ == '__main__':
    main()
N.B. Hierfür muss das Modul gi installiert sein!
Gruss wuf ;-)
Take it easy Mates!
Antworten