OpenCV RTMP Steam anzeige

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.
Antworten
TommiB
User
Beiträge: 41
Registriert: Montag 9. Februar 2015, 18:15

Hallo,

ich versuche einen rtmp Stream mit Opencv auf einem Win 7 mit Python 2.7 anzuzeigen.

Code:

Code: Alles auswählen

import cv2
cv2.namedWindow("camCapture", cv2.CV_WINDOW_AUTOSIZE)
cap = cv2.VideoCapture()
cap.open("rtmp://83.169.58.36/live/Stream3")

if not cap.open:
    print "Not open"
while (True):
    err,img = cap.read()
    
    cv2.imshow("camCapture", img)
    if err:
        print err
        break
    cv2.waitKey(30)

cap.release()
cv2.destroyAllWindows()
Beim Ausführen des Codes kommt folgender Fehler:
error: C:\slave\WinInstallerMegaPack\src\opencv\modules\core\src\array.cpp:2482: error: (-206) Unrecognized or unsupported array type

Weiß jemand, wie ich das Array umwandeln muss, damit es angezeigt wird?
Oder hat jemand eine bessere Idee, wie man einen RTMP Stream mit Python anzeigen und den Ton abspielen kann?

Gruß Tommi
Zuletzt geändert von Anonymous am Donnerstag 26. November 2015, 21:44, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@TommiB: Also bei mir spielt das ein Video ab wenn ich die Bedingung beim ``if err:`` negiere, denn das Flag zeigt keine Fehler an sondern das *kein* Fehler aufgetreten ist. Sollte also auch nicht `err` heissen. Ton ist allerdings keiner dabei.

Ich würde ein Rahmenwerk wie GStreamer versuchen, allerdings weiss ich nicht wie leicht (oder schwierig) das unter Windows zu installieren ist.
TommiB
User
Beiträge: 41
Registriert: Montag 9. Februar 2015, 18:15

Danke BJack,

unter Windows wird bei mir nichts angezeigt... :( Wäre ja mal ein kl. Erfolg.....

Ich habe mir gstreamer angeschaut... Ist unter Windows verwirrend und wirklich schwer zu installieren..... :K

Ich suche mir aber auch immer Sachen aus, die nicht so einfach zu machen sind!!!

Sonst niemand eine Idee?

Gruß Tommi
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Ich kann dir VLC und die Pythonbindings von VLC empfehlen, nicht auf Windows benutzt, aber ich nehme mal an, dass es wesentlich einfacher als Gstreamer ist.
the more they change the more they stay the same
BlackJack

Stimmt, Quick'n'Dirty:

Code: Alles auswählen

from __future__ import absolute_import, division, print_function 
from time import sleep
from vlc import MediaPlayer


def main():
    player = MediaPlayer('rtmp://83.169.58.36/live/Stream3')
    player.play()
    sleep(5)  # Neccessary to wait for network/start of playing state.
    print('Abbruch mit Strg+C')
    try:
        while True:
            if not player.is_playing():
                break
            sleep(0.5)
    except KeyboardInterrupt:
        player.stop()


if __name__ == '__main__':
    main()
Die Wartepause am Anfang sollte man vielleicht durch entsprechende Ereignisbehandlung ersetzen, aber dann würde das Beispiel komplizierter.
TommiB
User
Beiträge: 41
Registriert: Montag 9. Februar 2015, 18:15

Hallo BJack und Quick'n'Dirty,

damit werde ich am Wochenende mal experimentieren.
Werde erstmal das vlc installieren....
Unter Windows wieder eine Herausforderung :K

Danke für die Hilfestellung.

Gruß Tommi
TommiB
User
Beiträge: 41
Registriert: Montag 9. Februar 2015, 18:15

Habe jetzt eine Stunde gegoogelt.
Hat jemand eine funktionierende Anleitung wie man VLC unter Windows 7 installiert?

Gruß Tommi
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@TommiB:

- Nach "vlc" googeln
- Auf den ersten Link klicken
- Auf der angezeigten Seite ganz nach unten scrollen
- Auf den Link "VLC for Windows" klicken
- Auf der angezeigten Seite auf den Button mit der passenden Version klicken
- Die exe-Datei speichern (es erscheint ein Dialogfenster zum Speichern)
- Die gespeicherte exe-Datei ausführen
In specifications, Murphy's Law supersedes Ohm's.
TommiB
User
Beiträge: 41
Registriert: Montag 9. Februar 2015, 18:15

Hallo pillmuncher,

erstmal danke für die Antwort.

Damit ist dann die Bindung zu Python hergestellt?

Gruß Tommi
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@TommiB: Nein, dazu musst du noch ein "pip install python-vlc" ausführen. Da es sich dabei anscheinend um eine Source Code Distribution handelt, muss vorher zudem noch setuptools installiert sein.
In specifications, Murphy's Law supersedes Ohm's.
TommiB
User
Beiträge: 41
Registriert: Montag 9. Februar 2015, 18:15

Hallo Pillmuncher,
erstmal danke für die Antworten.

Das habe ich so gemacht. pip ist mit Erfolg abgeschlossen worden. Im Python34-Verzeichnis liegt eine vlc.py Datei - ich glaube das sind die Bindigs.

Leider kommt beim importieren des vlc (Dein hier im Threat geposteter Code) folgender Fehler:

Traceback (most recent call last):
File "C:\Python34\vlc.py", line 4, in <module>
from vlc import MediaPlayer
File "C:\Python34\vlc.py", line 4, in <module>
from vlc import MediaPlayer
ImportError: cannot import name 'MediaPlayer'

Irgendwie findet Python den MediaPlayer nicht.
Hast Du da noch eine Idee zu?

Gruß Tommi
BlackJack

@TommiB: Du hast *Dein* Modul jetzt aber nicht `vlc` genannt‽
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@TommiB: Der Name der Datei, die den Namen Mediaplayer aus dem Modul vlc importieren möchte, ist augenscheinlich vlc.py. Modulnamen sind Dateinamen abzüglich des .py. Es wird in diesem Modul also versucht, einen Namen aus sich selbst zu importieren. Das kann nicht funktionieren.

Ich vermute, diese Datei hast du selber dort angelegt. Dort werden nämlich von pip idR. keine Module oder Packages installiert, sondern in <Python Installationsverzeichnis>\Lib\site-packages\.

Außerdem heißt das Python Verzeichnis plötzlich C:\Python34, obwohl du oben geschrieben hattest, du würdest Python 2.7 verwenden.

Mein Rat: alles deinstallieren, ggf. alle übriggebliebenen Verzeichnisse von Hand löschen und alles neu installieren. Dein Programm sollte auf keinen Fall im Python Verzeichnis oder in einem Verzeichnis darunter liegen, sondern irgendwo außerhalb, zB., in C:\Dokumente und Einstellungen\<Dein Name>\Eigene Dateien\Projekte\<Dein Programm>\. Oder wie immer das jetzt in Windows heißt. Außerdem darf deine Programmdatei natürlich nicht vlc.py heißen, oder wie sonst ein Modul oder Package, das du importieren möchtest oder das zur Standard Bibliothek gehört.
In specifications, Murphy's Law supersedes Ohm's.
TommiB
User
Beiträge: 41
Registriert: Montag 9. Februar 2015, 18:15

Hey BJack,
Boa, ist man manchmal doof... Stimmt... Natürlich habe ich es vlc genannt....
Jetzt läuft es!!

Gruß Tommi
TommiB
User
Beiträge: 41
Registriert: Montag 9. Februar 2015, 18:15

Hallo Pillmuncher,
auf meinen alten Rechner funktionierte das einfach nicht.
ich hatte noch einen ganz frisch eingerichteten Mini ITX Rechner mit Win7.
Dort habe ich dann Python 3.4 neu aufgespielt.

Da läuft es drauf.

Gruß Tommi
TommiB
User
Beiträge: 41
Registriert: Montag 9. Februar 2015, 18:15

Hallo,

ich habe es geschafft, VLC in pygame einzubinden.
Ist natürlich nicht von mir. Habe ich im Netz gefunden und für meine Zwecke umgebaut.

Code: Alles auswählen

import os, sys, vlc, pygame

pygame.init()
screen = pygame.display.set_mode((800,600),pygame.NOFRAME)
pygame.display.get_wm_info()
vlcInstance = vlc.Instance()
media = vlcInstance.media_new('rtmp://83.169.58.36/live/Stream3')
player = vlcInstance.media_player_new()
win_id = pygame.display.get_wm_info()['window']
player.set_hwnd(win_id)
player.set_media(media)
pygame.mixer.quit()

player.play()

while player.get_state() != vlc.State.Ended:
        for event in pygame.event.get():
                if event.type == pygame.QUIT:
                        player.stop()
                        pygame.quit()
                        sys.exit(2)
                if event.type == pygame.KEYDOWN:
                        player.stop()
                        pygame.quit()
                        sys.exit(2)
Ich würde so ein Fenster gerne auf dem 2. Monitor haben. Ich hatte schon gelesen, daß Pygame keinen zweiten/dritten Monitor unterstützt.

Auf der Suche bin ich auf Pyglet gestoßen.
Könnte man den VLC Player auch in Pyglet einbinden?

Gruß Tommi
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Was willst du genau machen?
Willst du nur einen Stream mit ein bisschen GUI anzeigen? Dann würde ich wx, qt empfehlen (wx ist es panel.GetHandel() iirc). Ob das PyGlet auch kann, keine Ahnung.

Wenn du mehr machen willst, Stream in GL Szene anzeigen, dann wirds komplizierter.
the more they change the more they stay the same
TommiB
User
Beiträge: 41
Registriert: Montag 9. Februar 2015, 18:15

Hallo Dav1d,
Ja, ich möchte einen Streamserver regelmäßig abfragen, ob ein Stream anliegt.
Wenn ein Stream anliegt, möchte ich den Stream auf dem 2. oder 3. Monitor in Vollbild ausgeben.

Gruß Tommi
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Das sollte mit wx recht einfach gehen. Fenster machen, Fullscreen machen (ShowFullscreen), ein Panel im Fenster. das Handle (panel.Handle) an VLC weiterreichen.
the more they change the more they stay the same
Antworten