Tämä yksinkertainen GUI-projekti opettaa sinulle mediatiedostoja ja monialustaista ohjelmointia.

Videosoittimen rakentaminen voi auttaa sinua nauttimaan suosikkivideoistasi mukautetussa teemassa ja tyylissä. Voit tehdä videoiden toistosta sujuvampaa, suunnitella sovelluksesi painikkeita ja valikoita ja lisätä mitä tahansa toimintoja.

Tämä projekti antaa sinulle myös käytännön kokemusta monikäyttöisten työpöytäsovellusten rakentamisesta, multimedian käsittelystä ja tapahtumien käsittelystä. Tutustu kuinka voit tehdä videomediasoittimen Tkinterin, VLC: n ja datetime-moduulin avulla.

Tkinter-, VLC- ja Datetime-moduuli

Tkinterin avulla voit luoda työpöytäsovelluksia. Se tarjoaa erilaisia ​​widgetejä, kuten painikkeita, tarroja ja tekstiruutuja, jotka helpottavat sovellusten, kuten yksinkertainen GUI-kalenteri, laskin tai a tehtävälistan johtaja. Asenna Tkinter avaamalla pääte ja suorittamalla:

pip install tkinter

The python-vlc moduuli on Python-sidos VLC (VideoLAN Client) -mediasoitinkirjastolle. Voit käyttää tätä moduulia toteuttamaan

VLC: n ominaisuudet ja rakenna oma räätälöity mediasoitin. Asenna VLC suorittamalla:

pip install python-vlc

The treffiaika moduuli on sisäänrakennettu Pythoniin ja tarjoaa luokkia ja toimintoja edustamaan erilaisia ​​päivämääriä, kellonaikoja, aikavälejä ja vyöhykkeitä.

Löydät tämän projektin lähdekoodin siitä GitHub-arkisto.

Tuo tarvittavat moduulit. Määritä luokka, MediaPlayerApp. Määrittele konstruktorimenetelmä ja kutsu se alustaaksesi sovelluksen pääikkunan. Aseta videomediasoittimen otsikko, mitat ja taustaväri. Soita alusta_soitin menetelmä.

import tkinter as tk
import vlc
from tkinter import filedialog
from datetime import timedelta

classMediaPlayerApp(tk.Tk):
def__init__(self):
super().__init__()
self.title("Media Player")
self.geometry("800x600")
self.configure(bg="#f0f0f0")
self.initialize_player()

Määritä menetelmä, alusta_soitin. Luo VLC-mediasoittimen esiintymä, jotta voit käyttää sen toimintoja. Luo tämän ilmentymän avulla mediasoitinobjekti, jonka avulla voit hallita median toistoa. Alusta muuttuja, nykyinen tiedosto seurataksesi parhaillaan toistettavaa videota. Aseta toistotilat ja soita create_widgets menetelmä.

definitialize_player(self):
self.instance = vlc.Instance()
self.media_player = self.instance.media_player_new()
self.current_file = None
self.playing_video = False
self.video_paused = False
self.create_widgets()

Määrittele create_widgets menetelmä. Luo kanvas-widget ja siirrä pääelementti, johon se sijoitetaan, sen taustaväri, leveys ja korkeus. Luo Valitse tiedosto -painiketta valitaksesi videotiedoston, jonka haluat toistaa. Aseta pääelementti, sen näytettävä teksti, kirjasintyylit ja komento, jonka sen tulee suorittaa, kun napsautat sitä.

Luo tunniste, joka näyttää kuluneen ajan ja videon keston. Aseta pääelementti, teksti, kirjasintyylit, fontin väri ja taustaväri. Luo kehys videon toiston ohjaamiseksi ja anna sille taustaväri.

defcreate_widgets(self):
self.media_canvas = tk.Canvas(self, bg="black", width=800, height=400)
self.media_canvas.pack(pady=10, fill=tk.BOTH, expand=True)
self.select_file_button = tk.Button(
self,
text="Select File",
font=("Arial", 12, "bold"),
command=self.select_file,
)
self.select_file_button.pack(pady=5)
self.time_label = tk.Label(
self,
text="00:00:00 / 00:00:00",
font=("Arial", 12, "bold"),
fg="#555555",
bg="#f0f0f0",
)
self.time_label.pack(pady=5)
self.control_buttons_frame = tk.Frame(self, bg="#f0f0f0")
self.control_buttons_frame.pack(pady=5)

Määrittele pelata painike, Tauko painike, Lopettaa painike, Pikakelaus eteenpäin -painiketta ja Kelaa taaksepäin -painiketta. Luo videon edistymispalkki-widget. Aseta pääelementti, johon haluat sijoittaa sen, tapa päivittää videon toistokohta, taustaväri ja paksuus.

Järjestä kaikki nämä elementit sopivilla pehmusteilla molempiin suuntiin.

 self.play_button = tk.Button(
self.control_buttons_frame,
text="Play",
font=("Arial", 12, "bold"),
bg="#4CAF50",
fg="white",
command=self.play_video,
)
self.play_button.pack(side=tk.LEFT, padx=5, pady=5)
self.pause_button = tk.Button(
self.control_buttons_frame,
text="Pause",
font=("Arial", 12, "bold"),
bg="#FF9800",
fg="white",
command=self.pause_video,
)
self.pause_button.pack(side=tk.LEFT, padx=10, pady=5)
self.stop_button = tk.Button(
self.control_buttons_frame,
text="Stop",
font=("Arial", 12, "bold"),
bg="#F44336",
fg="white",
command=self.stop,
)
self.stop_button.pack(side=tk.LEFT, pady=5)
self.fast_forward_button = tk.Button(
self.control_buttons_frame,
text="Fast Forward",
font=("Arial", 12, "bold"),
bg="#2196F3",
fg="white",
command=self.fast_forward,
)
self.fast_forward_button.pack(side=tk.LEFT, padx=10, pady=5)
self.rewind_button = tk.Button(
self.control_buttons_frame,
text="Rewind",
font=("Arial", 12, "bold"),
bg="#2196F3",
fg="white",
command=self.rewind,
)
self.rewind_button.pack(side=tk.LEFT, pady=5)
self.progress_bar = VideoProgressBar(
self, self.set_video_position, bg="#e0e0e0", highlightthickness=0
)
self.progress_bar.pack(fill=tk.X, padx=10, pady=5)

Määritä menetelmä, Valitse tiedosto. Avaa tiedoston valintaikkuna valitaksesi videotiedoston .mp4 tai .avi laajennus. Jos valitset minkä tahansa tiedoston, lataa sen polku ja päivitä aikatunniste sen kestolla. Aloita valitun videon toisto.

defselect_file(self):
file_path = filedialog.askopenfilename(
filetypes=[("Media Files", "*.mp4 *.avi")]
)
if file_path:
self.current_file = file_path
self.time_label.config(text="00:00:00 / " + self.get_duration_str())
self.play_video()

Määritä menetelmä, get_duration_str jota käytät videon kokonaiskeston laskemiseen. Jos sovellus toistaa videota, hae sen kesto millisekunteina ja muunna se videoksi HH: MM: SS muoto. Jos videota ei toisteta, palaa 00:00:00 oletusarvona.

defget_duration_str(self):
if self.playing_video:
total_duration = self.media_player.get_length()
total_duration_str = str(timedelta(milliseconds=total_duration))[:-3]
return total_duration_str
return"00:00:00"

Määritä menetelmä, toista video. Jos videota ei toisteta, luo uusi mediaobjekti käyttämällä valittua tiedostopolkua. Yhdistä media aiemmin luotuun kankaaseen ja aloita videon toisto. Päivitä play_video valtiolle Totta.

defplay_video(self):
ifnot self.playing_video:
media = self.instance.media_new(self.current_file)
self.media_player.set_media(media)
self.media_player.set_hwnd(self.media_canvas.winfo_id())
self.media_player.play()
self.playing_video = True

Määritä menetelmä, nopea_eteenpäin. Jos videota toistetaan, tarkista nykyinen kulunut aika ja lisää siihen 10 000 millisekuntia. Aseta uusi toistoaika. Samoin määritä menetelmä, kelaa taaksepäin joka vähentää 10 000 millisekuntia.

deffast_forward(self):
if self.playing_video:
current_time = self.media_player.get_time() + 10000
self.media_player.set_time(current_time)

defrewind(self):
if self.playing_video:
current_time = self.media_player.get_time() - 10000
self.media_player.set_time(current_time)

Määritä menetelmä, tauko_video. Jos olet aloittanut videon toiston ja keskeyttänyt sen, soita numeroon pelata tapa jatkaa sitä. Muussa tapauksessa soita tauko menetelmä ja päivitä käyttöliittymä molemmissa tapauksissa vastaavasti.

defpause_video(self):
if self.playing_video:
if self.video_paused:
self.media_player.play()
self.video_paused = False
self.pause_button.config(text="Pause")
else:
self.media_player.pause()
self.video_paused = True
self.pause_button.config(text="Resume")

Määritä menetelmä, lopettaa. Jos videota toistetaan, pysäytä se ja nollaa aikamerkintä. Määritä menetelmä, set_video_position. Jos videota toistetaan, hae kokonaiskesto ja laske haluttu sijainti millisekunteina. Aseta videon toistoaika laskettuun kohtaan.

defstop(self):
if self.playing_video:
self.media_player.stop()
self.playing_video = False
self.time_label.config(text="00:00:00 / " + self.get_duration_str())

defset_video_position(self, value):
if self.playing_video:
total_duration = self.media_player.get_length()
position = int((float(value) / 100) * total_duration)
self.media_player.set_time(position)

Määritä menetelmä, update_video_progress. Jos videota toistetaan, hae kokonaiskesto ja nykyinen toistoaika sekä laske edistymisprosentti. Päivitä edistymispalkki käyttämällä tätä laskettua arvoa. Muotoile nykyinen aika ja kokonaiskesto HH: MM: SS muoto.

Ajoita tämä menetelmä käynnistymään uudelleen 1 000 millisekunnin kuluttua. Tämä luo silmukan, joka päivittää jatkuvasti videon edistymistä ja aikatunnisteita videon toiston aikana.

defupdate_video_progress(self):
ifself.playing_video:
total_duration = self.media_player.get_length()
current_time = self.media_player.get_time()
progress_percentage = (current_time / total_duration) * 100
self.progress_bar.set(progress_percentage)
current_time_str = str(timedelta(milliseconds=current_time))[:-3]
total_duration_str = str(timedelta(milliseconds=total_duration))[:-3]
self.time_label.config(text=f"{current_time_str}/{total_duration_str}")
self.after(1000, self.update_video_progress)

Määritä luokka, VideoProgressBar joka perii tk. Mittakaava widget. Määritä konstruktori, joka määrittää edistymispalkin alkutilan ja toiminnan. Aseta Näytä arvo vaihtoehto Väärä välttääksesi nykyisen arvon näyttämisen.

Aloita edistyminen välillä 0–100. Aseta suunta, pituus, komento, joka sen on suoritettava, ja mukautus edistymispalkkiin. Sido tapahtuma etenemispalkkiin siten, että kun napsautat sitä, se suorittaa klikkaamalla menetelmä.

classVideoProgressBar(tk.Scale):
def__init__(self, master, command, **kwargs):
kwargs["showvalue"] = False
super().__init__(
master,
from_=0,
to=100,
orient=tk.HORIZONTAL,
length=800,
command=command,
**kwargs,
)
self.bind("", self.on_click)

Määritä menetelmä, klikkaamalla. Tarkista, ettei edistymispalkkia ole poistettu käytöstä, ja laskee uuden arvon napsautuksen sijainnin perusteella. Päivitä edistymispalkin arvo vastaavasti.

defon_click(self, event):
if self.cget("state") == tk.NORMAL:
value = (event.x / self.winfo_width()) * 100
self.set(value)

Luo esiintymä MediaPlayerApp luokkaa ja soita update_video_progress menetelmä. The mainloop() -toiminto käskee Pythonia suorittamaan Tkinterin tapahtumasilmukan ja kuuntelemaan tapahtumia, kunnes suljet ikkunan.

if __name__ == "__main__":
app = MediaPlayerApp()
app.update_video_progress()
app.mainloop()

Kun ohjelma suoritetaan, videomediasoitin ponnahtaa esiin. Se sisältää Valitse tiedosto -painike, aikamerkinnät, videon toiston ohjauspainikkeet ja videon edistymispalkki.

Kun valitset videon, se toistetaan automaattisesti alusta alkaen ja päivitetään aloitusaika ja aikatunnisteiden kesto.

Kun osuu Tauko -painiketta, video pysähtyy ja muuttuu muotoon Jatkaa -painiketta. Napsauttamalla Pikakelaus eteenpäin -painiketta, video siirtyy 10 sekuntia eteenpäin.

Samoin osuessaan Kelaa taaksepäin -painiketta, se palaa 10 sekuntia taaksepäin. Painamalla Lopettaa -painiketta, videon toisto pysähtyy. Voit vetää tai napsauttaa mitä tahansa etenemispalkin aluetta siirtyäksesi mihin tahansa videon osaan, ja aikatunniste lukee kuluneen ajan.

Voit parantaa tätä videomediasoitinta lisäämällä vaihtoehdon tekstityksen lataamiseen ja näyttämiseen. Voit myös harkita ominaisuuksia, kuten kuvasuhteen muuttaminen, äänenvoimakkuuden säätäminen ja videon osan silmukka.

Voit ottaa nämä ominaisuudet käyttöön tutustumalla Pygame-moduuliin. Pygame on monipuolinen, helppokäyttöinen ja integroituu hyvin Tkinteriin. Kirjasto mahdollistaa räätälöinnin, siinä on interaktiivisia ominaisuuksia ja sitä voidaan käyttää millä tahansa alustalla.