Seite 1 von 1

Movie - Befehle mit für mich logischen Informationen

Verfasst: 28.12.2020 12:18
von kartmanne
HI, Frohe Weihnachten,

ich versuche gerade mittels der movie-befehle einen Film abzuspielen und eine scrollbar als positionsanzeiger und-einsteller zu benutzen.

Das movie ist ein mp4 mit 29.97fps und 10s Länge.

Mittels playmovie() wird's auch im angegebenen Fenster abgespielt.

Jedoch sind folgende Infos für mich nicht plausibel:
- movieinfo(0,0)= 29 (sollten wohl eher 30 sein, da 29.97fps, abgeschnitten, na gut)
- movielength(0)=299 (sollte die Länge in frames sein, also...10s*29.97 = 299.7, abgeschnitten, na gut)
- am Ende des Movies: moviestatus(0) = 99066689. Das sollte doch (nahezu) der letzte frame sein, also sollte der Wert rundum bei oder kurz vor 299 liegen. Hmmm... leicht daneben.

in der pb-Hilfe zu movieinfo() steht, dass die Ausgabe die Anzahl frames pro Sekunde (*1000) ist. Hat das movie dann also eigentlich 10s*29.97*1000 =299700 frames? Oder ist der Status am Ende des Movies als 99066689/1000 = 99067 zu interpretieren? Passt auch nicht zusammen.

Kurzum, kann mir jemand erläutern, wie ich die movielänge und die aktuelle Abspielposition so verrechnen kann, das das plausibel ist?

PB 5.71 auf einer immer noch laufenden XP-Kiste :-)

Re: Movie - Befehle mit für mich logischen Informationen

Verfasst: 29.12.2020 18:26
von kartmanne
HI,

nach ein bischen rumprobieren...

Kann es sein, dass moviestatus() die Abspielposition linear zu der Gesamtlänge (Filmlänge in Sekunden *1000*1000) bestimmt?

Ich habe das mit avi, mp4 unterschiedlicher Länge (in Sekunden) und unterschiedlich encodeter fps (29.97, 15, 23) (codec H.246) so herausgefunden.

Nachteil ist, dass die Gesamtlänge aus movielenght() und movieinfo() nicht berechenbar ist, wenn z.B. die encodete Frame-Rate nicht ganzzahlig ist.

Re: Movie - Befehle mit für mich logischen Informationen

Verfasst: 29.12.2020 20:03
von ccode_new
Hi kartmanne,

ich fasse mich kurz:
Der Ausgabe "moviestatus(0) = 99066689" kannst du nicht trauen.
(Anbei: Meisten erhalte ich da nur Werte die im negativen Bereich liegen.)

Insgesamt sollten die Moviebefehle eigentlich mal für alle Betriebssysteme aktualisiert werden.

Einige aktuell gute Alternativen wären die Nutzung der vlc-lib, oder ffmpeg/ffplay.
(Unter MacOS aber z.B. die "AVKit/AVFoundation")


Cool das du noch Windows XP nutzt.

Nimm die Werte von MovieLength(#movie) als 100% an.
Denn bei MovieLength(#movie) / MovieInfo(#movie, 0) kommst du ja zumindest in etwa auf die echte Abspielzeit.
Aber ansonsten sind diese Integer-Werte echt unpräzise.
Und das hier:
Kann es sein, dass moviestatus() die Abspielposition linear zu der Gesamtlänge (Filmlänge in Sekunden *1000*1000) bestimmt?
..kann nicht stimmen.

Nutze mciSendString_

http://forums.purebasic.com/english/vie ... 14&t=59923

Beste PureBasic-Video-Lösungen (Nativ) für Windows, MacOS:

Für Windows (WMP) - Nativ (ohne K-Lite, eingebundene Browser, etc.)
http://forums.purebasic.com/english/vie ... 4&p=558591
Für MacOS - Nativ (AVKit)
https://www.purebasic.fr/english/viewto ... 19&t=59977
Für Linux:
?

Re: Movie - Befehle mit für mich logischen Informationen

Verfasst: 30.12.2020 17:45
von kartmanne
HI,

merci für die Tips!

Ich bevorzuge die pb-Bordmittel, da ich auf der XP-Kiste programmire und einige Anwendungen auf drauf laufen sollen - mein "Arbeitsgerät" aber ein Macbook mit MacOSX ist. Ein paar BS-spezifische Dinge sind ok, aber den code quasi doppelt schreiben mag ich eher nicht, was fast immer rauskommt, wenn nativer code benutzt wird.

Da die movie-Blibliotheken anscheinend nicht verlässlich sind... probier ich mal, die Mediadateien aus dem pb-executable an einen auf dem BS vorhandenen Player zu übergeben (der sollte das Thema beherrschen ;-) ).

Re: Movie - Befehle mit für mich logischen Informationen

Verfasst: 30.12.2020 23:30
von ccode_new
Du kannst auch:
Gesamtlaenge = MovieLength(film)/MovieInfo(film,0)*10000000; ???????? 10000000
(Oder du nimmst deine Formel)
verwenden,
wenn dir die Korrektheit der Abspiellänge egal ist und du nur einen Bezugspunkt für deine Scrollbar brauchst.

Hier auch mal noch ein Beispiel:
http://forums.purebasic.com/english/vie ... =4&t=65851

Re: Movie - Befehle mit für mich logischen Informationen

Verfasst: 31.12.2020 10:31
von kartmanne
HI,

ja danke für's Beispiel suchen :-)

So hab ich das bisher (abgespekt) gemacht. Richtig, es reicht, wenn ich durch Klicken in der scrollbar i.e. die Abspielposition auch verändern kann. Das reicht. Ich nutze den Faktor 1.000.000, was ja eben der ermitelte Zusammenhang zu sein scheint.

Übergabe per Runprogramm() krieg ich noch nicht hin, braucht sicher noch etwas positive "Lernkurve" über die Zusammenhänge :-)

Ein mp3 wird weder mit der misic-Lib noch mit der sound-lib erkannt (sound plug-ins gestartet). Aber mit der movie-lib. Wäre ja cool, könnte ich ja auch diese medien damit abspielen, ohne Verzweigungen zu programmieren. Blöd: die movie-lib kann keine Abspielposition für mp3 handhaben (vermutlich, weil es keinen video-stream gibt). Damit laufen also die mp3s einfach ab, können aber nicht in der Abspielposition verändert werden. Nunja.

Re: Movie - Befehle mit für mich logischen Informationen

Verfasst: 31.12.2020 12:54
von ccode_new
Das Hauptproblem scheint ja:
MovieInfo(..)
zu sein.

(Also die Ermittelung der Bilder/Sekunde)

Versuche mal das hier:

Code: Alles auswählen

If InitMovie() = 0
  MessageRequester("Error", "Can't initialize movie playback !", 0) 
  End
EndIf

MovieName$ = OpenFileRequester("Choose the movie to play", "", "Movie files|*.avi;*.mpg|All Files|*.*", 0)
If MovieName$
  If LoadMovie(0, MovieName$)
  
    OpenWindow(0, 100, 150, MovieWidth(0), MovieHeight(0), "PureBasic - Movie")
    
    Open$ = "OPEN " + Chr(34)+MovieName$+Chr(34) + " Type MPEGVIDEO Alias PB"                                                         
    mciSendString_(Open$,0,0,0)                       
    mciSendString_("load PB " + MovieName$ ,0,0,0)
    a$=Space(#MAX_PATH)
    mciSendString_("status PB frame rate",@a$,#MAX_PATH,0)
    Debug "Movie Frame Rate : "+ StrD(Val(a$)/1000) +"  Frame/Sec"
    mciSendString_("Close PB",0,0,0)
    
    PlayMovie(0, WindowID(0))

    laenge=MovieLength(0)/(Val(a$)/1000)
    MovieSeek(0, (laenge)*10000000)

    Debug MovieStatus(0)
    ;StopMovie(0)
    
    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  Else
    MessageRequester("Error", "Can't load the movie...", 0)
  EndIf
EndIf