Αυτό το απλό έργο GUI θα σας διδάξει για τα αρχεία πολυμέσων και τον προγραμματισμό πολλαπλών πλατφορμών.
Η δημιουργία ενός προγράμματος αναπαραγωγής βίντεο μπορεί να σας βοηθήσει να απολαύσετε τα αγαπημένα σας βίντεο σε προσαρμοσμένο θέμα και στυλ. Μπορείτε να κάνετε την αναπαραγωγή βίντεο πιο ομαλή, να σχεδιάσετε τα κουμπιά και τα μενού της εφαρμογής σας και να προσθέσετε όποια λειτουργικότητα θέλετε.
Αυτό το έργο θα σας προσφέρει επίσης πρακτική εμπειρία στη δημιουργία εφαρμογών επιφάνειας εργασίας πολλαπλών πλατφορμών, στην επεξεργασία πολυμέσων και στη διαχείριση συμβάντων. Ανακαλύψτε πώς μπορείτε να δημιουργήσετε ένα πρόγραμμα αναπαραγωγής πολυμέσων βίντεο χρησιμοποιώντας το Tkinter, το VLC και τη μονάδα ημερομηνίας.
Η ενότητα Tkinter, VLC και Datetime
Το Tkinter σάς επιτρέπει να δημιουργείτε εφαρμογές επιφάνειας εργασίας. Προσφέρει μια ποικιλία γραφικών στοιχείων όπως κουμπιά, ετικέτες και πλαίσια κειμένου που διευκολύνουν την ανάπτυξη εφαρμογών όπως ένα απλό ημερολόγιο GUI, μια αριθμομηχανή ή α
διαχειριστής λίστας υποχρεώσεων. Για να εγκαταστήσετε το Tkinter, ανοίξτε ένα τερματικό και εκτελέστε:pip install tkinter
ο python-vlc Η ενότητα είναι μια σύνδεση Python για τη βιβλιοθήκη του προγράμματος αναπαραγωγής πολυμέσων VLC (VideoLAN Client). Μπορείτε να χρησιμοποιήσετε αυτήν την ενότητα για να εφαρμόσετε το χαρακτηριστικά του VLC και δημιουργήστε το δικό σας προσαρμοσμένο πρόγραμμα αναπαραγωγής πολυμέσων. Για να εγκαταστήσετε το VLC, εκτελέστε:
pip install python-vlc
ο ημερομηνία ώρα Η ενότητα είναι ενσωματωμένη στην Python και παρέχει κλάσεις και συναρτήσεις για να αντιπροσωπεύουν διαφορετικές ημερομηνίες, ώρες, διαστήματα και ζώνες.
Μπορείτε να βρείτε τον πηγαίο κώδικα αυτού του έργου σε αυτό Αποθετήριο GitHub.
Εισαγάγετε τις απαιτούμενες ενότητες. Ορίστε μια τάξη, MediaPlayer App. Ορίστε τη μέθοδο κατασκευής και καλέστε την για να αρχικοποιήσετε το κύριο παράθυρο της εφαρμογής. Ορίστε τον τίτλο, τις διαστάσεις και το χρώμα φόντου της συσκευής αναπαραγωγής πολυμέσων βίντεο. Καλέστε το startize_player μέθοδος.
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()
Ορίστε μια μέθοδο, startize_player. Δημιουργήστε μια παρουσία του προγράμματος αναπαραγωγής πολυμέσων VLC για αλληλεπίδραση με τις λειτουργίες του. Χρησιμοποιώντας αυτήν την περίπτωση, δημιουργήστε ένα αντικείμενο αναπαραγωγής πολυμέσων που μπορείτε να χρησιμοποιήσετε για να διαχειριστείτε την αναπαραγωγή πολυμέσων. Αρχικοποιήστε μια μεταβλητή, το παρόν αρχείο για να παρακολουθείτε το βίντεο που αναπαράγεται αυτήν τη στιγμή. Ρυθμίστε τις καταστάσεις αναπαραγωγής και καλέστε το create_widgets μέθοδος.
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()
Ορίστε το create_widgets μέθοδος. Δημιουργήστε ένα γραφικό στοιχείο καμβά και περάστε το γονικό στοιχείο για να το τοποθετήσετε, το χρώμα του φόντου, το πλάτος και το ύψος του. Δημιουργώ ένα Επιλέξτε Αρχείο κουμπί για να επιλέξετε το αρχείο βίντεο που θέλετε να παίξετε. Ορίστε το γονικό στοιχείο, το κείμενο που πρέπει να εμφανίζεται, τα στυλ γραμματοσειράς και την εντολή που πρέπει να εκτελείται όταν κάνετε κλικ σε αυτό.
Δημιουργήστε μια ετικέτα για να εμφανίσετε τον χρόνο που πέρασε και τη διάρκεια του βίντεο. Ορίστε το γονικό στοιχείο, το κείμενο, τα στυλ γραμματοσειράς, το χρώμα γραμματοσειράς και το χρώμα του φόντου. Δημιουργήστε ένα πλαίσιο για να ελέγξετε την αναπαραγωγή του βίντεο και δώστε του ένα χρώμα φόντου.
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)
Ορίστε το Παίζω κουμπί, το Παύση κουμπί, το Να σταματήσει κουμπί, το Γρήγορη προώθηση κουμπί και το Πίσω κουμπί. Δημιουργήστε ένα γραφικό στοιχείο γραμμής προόδου βίντεο. Ορίστε το γονικό στοιχείο στο οποίο θέλετε να το τοποθετήσετε, τη μέθοδο ενημέρωσης της θέσης αναπαραγωγής βίντεο, το χρώμα φόντου και το πάχος.
Οργανώστε όλα αυτά τα στοιχεία με κατάλληλη επένδυση και προς τις δύο κατευθύνσεις.
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)
Ορίστε μια μέθοδο, select_file. Ανοίξτε ένα παράθυρο διαλόγου αρχείου για να επιλέξετε ένα αρχείο βίντεο με το οποίο .mp4 ή .avi επέκταση. Εάν επιλέξετε οποιοδήποτε αρχείο, φορτώστε τη διαδρομή του και ενημερώστε την ετικέτα χρόνου με τη διάρκειά του. Ξεκινήστε την αναπαραγωγή του επιλεγμένου βίντεο.
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()
Ορίστε μια μέθοδο, get_duration_str που θα χρησιμοποιήσετε για να υπολογίσετε τη συνολική διάρκεια του βίντεο. Εάν η εφαρμογή παίζει ένα βίντεο, λάβετε τη διάρκειά του σε χιλιοστά του δευτερολέπτου και μετατρέψτε το σε ΩΩ: ΜΜ: ΣΣ μορφή. Εάν δεν αναπαράγεται βίντεο, επιστρέψτε 00:00:00 ως προεπιλεγμένη τιμή.
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"
Ορίστε μια μέθοδο, παίξε το βίντεο. Εάν δεν αναπαράγεται ένα βίντεο, δημιουργήστε ένα νέο αντικείμενο πολυμέσων χρησιμοποιώντας την επιλεγμένη διαδρομή αρχείου. Συσχετίστε τα μέσα με τον καμβά που δημιουργήθηκε νωρίτερα και ξεκινήστε την αναπαραγωγή του βίντεο. Ενημερώστε το playing_video κατάσταση να Αληθής.
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
Ορίστε μια μέθοδο, γρήγορη προώθηση. Εάν αναπαράγεται ένα βίντεο, λάβετε τον τρέχοντα χρόνο που έχει παρέλθει και προσθέστε 10.000 χιλιοστά του δευτερολέπτου σε αυτό. Ρυθμίστε τη νέα ώρα αναπαραγωγής. Ομοίως, ορίστε μια μέθοδο, επανατύλιξη που αφαιρεί 10.000 χιλιοστά του δευτερολέπτου.
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)
Ορίστε μια μέθοδο, pause_video. Εάν είχατε ξεκινήσει την αναπαραγωγή βίντεο και το είχατε διακόψει, καλέστε το παίζω τρόπος για να το επαναλάβετε. Διαφορετικά, καλέστε το παύση μέθοδο και ενημερώστε το UI ανάλογα και στις δύο περιπτώσεις.
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")
Ορίστε μια μέθοδο, να σταματήσει. Εάν αναπαράγεται ένα βίντεο, σταματήστε το και επαναφέρετε την ετικέτα ώρας. Ορίστε μια μέθοδο, set_video_position. Εάν αναπαράγεται ένα βίντεο, ανακτήστε τη συνολική διάρκεια και υπολογίστε την επιθυμητή θέση σε χιλιοστά του δευτερολέπτου. Ρυθμίστε το χρόνο αναπαραγωγής βίντεο στην υπολογιζόμενη θέση.
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)
Ορίστε μια μέθοδο, update_video_progress. Εάν αναπαράγεται ένα βίντεο, ανακτήστε τη συνολική διάρκεια και τον τρέχοντα χρόνο αναπαραγωγής και υπολογίστε το ποσοστό προόδου. Ενημερώστε τη γραμμή προόδου χρησιμοποιώντας αυτήν την υπολογιζόμενη τιμή. Μορφοποιήστε την τρέχουσα ώρα και τη συνολική διάρκεια στο ΩΩ: ΜΜ: ΣΣ μορφή.
Προγραμματίστε αυτή τη μέθοδο να εκτελεστεί ξανά μετά από 1.000 χιλιοστά του δευτερολέπτου. Αυτό δημιουργεί έναν βρόχο που ενημερώνει συνεχώς την πρόοδο του βίντεο και τις χρονικές ετικέτες κατά την αναπαραγωγή του βίντεο.
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)
Ορίστε μια τάξη, VideoProgressBar που κληρονομεί από tk. Κλίμακα widget. Ορίστε έναν κατασκευαστή που ορίζει την αρχική κατάσταση και συμπεριφορά της γραμμής προόδου. Ρυθμίστε το επιδεικτική αξία επιλογή να Ψευδής για να αποφύγετε την εμφάνιση της τρέχουσας τιμής.
Αρχικοποιήστε την πρόοδο με εύρος από 0 έως 100. Ρυθμίστε τον προσανατολισμό, το μήκος, την εντολή που πρέπει να εκτελεστεί και την προσαρμογή στη γραμμή προόδου. Συνδέστε ένα συμβάν στη γραμμή προόδου έτσι ώστε όταν κάνετε κλικ σε αυτό, να εκτελεί το στο κλικ μέθοδος.
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)
Ορίστε μια μέθοδο, στο κλικ. Ελέγξτε εάν η γραμμή προόδου δεν είναι απενεργοποιημένη και υπολογίζει τη νέα τιμή με βάση τη θέση του κλικ. Ενημερώστε την τιμή της γραμμής προόδου ανάλογα.
defon_click(self, event):
if self.cget("state") == tk.NORMAL:
value = (event.x / self.winfo_width()) * 100
self.set(value)
Δημιουργήστε ένα παράδειγμα του MediaPlayer App τάξη και καλέστε το update_video_progress μέθοδος. ο mainloop() Η συνάρτηση λέει στην Python να εκτελέσει τον βρόχο συμβάντων Tkinter και να ακούει συμβάντα μέχρι να κλείσει το παράθυρο.
if __name__ == "__main__":
app = MediaPlayerApp()
app.update_video_progress()
app.mainloop()
Κατά την εκτέλεση του προγράμματος, εμφανίζεται το πρόγραμμα αναπαραγωγής πολυμέσων βίντεο. Περιέχει το Επιλέξτε Αρχείο κουμπί, τις ετικέτες ώρας, τα κουμπιά για τον έλεγχο της αναπαραγωγής βίντεο και μια γραμμή προόδου βίντεο.
Όταν επιλέγετε ένα βίντεο, θα αναπαράγεται αυτόματα από την αρχή, ενημερώνοντας την ώρα έναρξης και τη διάρκεια των ετικετών χρόνου.
Στο χτύπημα του Παύση κουμπί, το βίντεο διακόπτεται και αλλάζει σε ΒΙΟΓΡΑΦΙΚΟ κουμπί. Κάνοντας κλικ στο Γρήγορη προώθηση κουμπί, το βίντεο μεταβαίνει κατά 10 δευτερόλεπτα.
Ομοίως, στο χτύπημα του Πίσω κουμπί, πηγαίνει πίσω 10 δευτερόλεπτα. Πατώντας το Να σταματήσει κουμπί, η αναπαραγωγή βίντεο σταματά. Μπορείτε να σύρετε ή να κάνετε κλικ σε οποιαδήποτε περιοχή στη γραμμή προόδου για να μετακινηθείτε σε οποιοδήποτε μέρος του βίντεο και η ετικέτα χρόνου διαβάζει τον χρόνο που έχει παρέλθει.
Μπορείτε να βελτιώσετε αυτό το πρόγραμμα αναπαραγωγής πολυμέσων βίντεο προσθέτοντας μια επιλογή φόρτωσης και εμφάνισης υποτίτλων. Θα μπορούσατε επίσης να εξετάσετε λειτουργίες όπως η αλλαγή της αναλογίας διαστάσεων, ο έλεγχος της έντασης ήχου και η επαναφορά μέρους του βίντεο.
Για να εφαρμόσετε αυτές τις δυνατότητες, μπορείτε να εξερευνήσετε τη λειτουργική μονάδα Pygame. Το Pygame είναι ευέλικτο, εύκολο στη χρήση και ενσωματώνεται καλά με το Tkinter. Η βιβλιοθήκη επιτρέπει την προσαρμογή, έχει διαδραστικές λειτουργίες και μπορεί να εκτελεστεί σε οποιαδήποτε πλατφόρμα.