Contents

Cách xây dựng trình phát video đa phương tiện bằng Python

Xây dựng trình phát video có thể giúp bạn thưởng thức các video yêu thích của mình theo chủ đề và phong cách tùy chỉnh. Bạn có thể giúp phát lại video mượt mà hơn, thiết kế các nút và menu của ứng dụng cũng như thêm bất kỳ chức năng nào bạn muốn.

Cam kết hiện tại sẽ cung cấp sự quen thuộc thực tế với việc phát triển các ứng dụng máy tính để bàn đa nền tảng, cũng như khả năng xử lý nội dung đa phương tiện thành thạo và quản lý tương tác người dùng thông qua xử lý sự kiện. Bằng cách sử dụng Tkinter, VLC và mô-đun datetime, dự án này mang đến cơ hội tạo một trình phát đa phương tiện video chức năng.

Mô-đun Tkinter, VLC và Datetime

Tkinter là môi trường phát triển tích hợp (IDE) để tạo giao diện người dùng đồ họa (GUIs) bằng Python. Với phạm vi đầy đủ các tiện ích tích hợp như nút, nhãn và hộp văn bản, nhà phát triển có thể dễ dàng xây dựng các ứng dụng phức tạp, bao gồm nhưng không giới hạn ở giao diện lịch cơ bản, máy tính hoặc thậm chí là hệ thống quản lý tác vụ. Để thiết lập Tkinter trên máy tính của bạn, chỉ cần khởi chạy dấu nhắc lệnh và nhập lệnh cài đặt.

 pip install tkinter 

Mô-đun python-vlc là một giao diện tạo điều kiện giao tiếp giữa các ứng dụng Python và thư viện trình phát phương tiện VLC. Điều này cho phép các nhà phát triển khai thác toàn bộ tiềm năng của bộ tính năng mở rộng của VLC trong các dự án của họ bằng cách tích hợp nó với cơ sở mã của họ. Để lấy gói python-vlc, hãy thực hiện lệnh sau:

 pip install python-vlc 

Mô-đun datetime trong Python cung cấp một loạt các lớp và hàm cho phép người dùng làm việc với nhiều định dạng ngày và giờ khác nhau, cũng như thực hiện các thao tác liên quan đến múi giờ. Tính năng này cho phép thao tác và tính toán hiệu quả dữ liệu tạm thời trong các chương trình Python.

Xây dựng cấu trúc của Video Media Player

Mã nguồn của dự án này có sẵn trên kho lưu trữ GitHub của nó, có thể được truy cập bằng cách điều hướng đến URL tương ứng.

Thật vậy, để thực hiện tầm nhìn của chúng tôi về một trình phát đa phương tiện trực quan và hấp dẫn, trước tiên chúng tôi phải nhập các mô-đun cần thiết để cho phép chúng tôi tạo ra trải nghiệm như vậy. Đặc biệt, chúng ta sẽ định nghĩa một lớp mới gọi là MediaPlayerApp , lớp này sẽ đóng vai trò là nền tảng cho giao diện người dùng của ứng dụng của chúng ta. Sau khi được xác định, chúng ta sẽ gọi phương thức khởi tạo của nó để thiết lập trạng thái ban đầu của cửa sổ ứng dụng chính, bao gồm đặt tiêu đề, xác định kích thước và chỉ định màu nền của trình phát phương tiện video. Cuối cùng, chúng ta sẽ tiến hành gọi phương thức initialize\_player để đảm bảo rằng tất cả các thành phần được khởi tạo đúng cách trước khi bất kỳ tương tác nào diễn ra.

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

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

Hàm khởi tạo\_player() chịu trách nhiệm thiết lập trình phát đa phương tiện bằng cách tạo một phiên bản của thư viện trình phát đa phương tiện VLC, thư viện này cung cấp nhiều chức năng khác nhau để quản lý phát lại âm thanh và video. Chức năng này cũng tạo ra một đối tượng QMediaPlayer mới, đóng vai trò là thành phần giao diện người dùng để kiểm soát phát lại phương tiện. Để duy trì bản ghi của tệp video hiện đang phát, một biến có tên current\_file được giới thiệu. Biến này sẽ được sử dụng trong các bước tiếp theo để đảm bảo quá trình chuyển đổi liền mạch giữa các video khác nhau trong khi chơi trò chơi. Ngoài ra, chức năng này đặt trạng thái phát lại ban đầu thành’đã dừng’, cho phép người dùng bắt đầu phát lại từ đầu khi muốn. Cuối cùng, phương thức create\_widgets() được gọi để thiết lập các thành phần giao diện người dùng đồ họa tương ứng với từng nút trên thiết bị điều khiển từ xa.

     def initialize_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() 

tạo tiện ích canvas bằng cách lấy phần tử gốc đã chỉ định và đặt các thuộc tính của nó, chẳng hạn như định vị trên màn hình bằng cách sử dụng place, xác định kích thước của nó như chiều rộng và chiều cao, cùng với việc áp dụng mã định danh duy nhất cho mục đích tham khảo. Ngoài ra, hãy xây dựng một nút chọn tệp thông qua quá trình khởi tạo, đặt các thuộc tính của nó bao gồm phần tử gốc, nhãn văn bản mà nó sẽ hiển thị, các tham số kiểu dáng cho giao diện và hành động được chỉ định sẽ được thực thi khi người dùng tương tác bằng cách nhấp vào nút.

Đảm bảo rằng một nhãn thích hợp được tạo để hiển thị cả thời gian hiện tại và tổng thời lượng của video, đồng thời đặt thành phần chính, điều chỉnh kiểu văn bản, xác định màu phông chữ và xác định màu nền. Ngoài ra, hãy thiết lập một vùng có viền với bóng nền cụ thể để điều chỉnh tiến trình phát lại của video.

     def create_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) 

Kết hợp chức năng xác định các nút phát, tạm dừng, dừng, tua nhanh, tua lại cùng với việc tạo tiện ích thanh tiến trình video trong ứng dụng trình phát video canvas HTML5. Ngoài ra, hãy chỉ định vùng chứa chính mong muốn cho vị trí của các phần tử này, cũng như phương pháp được chỉ định để cập nhật vị trí phát lại của video, màu nền ưa thích cho thanh tiến trình và độ dày tương ứng của nó.

Đảm bảo rằng tất cả các thành phần này được bố trí hài hòa, có khoảng cách vừa đủ ở hai bên.

         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) 

Xây dựng chức năng Video Media Player

Kết hợp đoạn mã được cung cấp bên dưới để xác định phương pháp select\_file mở hộp thoại tệp để cho phép người dùng chọn tệp video MP4 hoặc AVI. Sau đó, phương pháp này sẽ sử dụng thời lượng của tệp đã chọn để cập nhật màn hình dòng thời gian và bắt đầu phát lại phương tiện đã chọn.

     def select_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() 

Để xác định tổng thời lượng của video, tôi đề xuất triển khai một chức năng mới có tên get\_duration\_str tính toán giá trị này dựa trên việc ứng dụng hiện có đang phát video hay không. Nếu ứng dụng thực sự đang phát video, chúng ta có thể truy xuất thời lượng của video tính bằng mili giây và sau đó chuyển đổi nó thành định dạng thời gian tiêu chuẩn bao gồm giờ, phút và giây (HH:MM:SS). Ngược lại, nếu không có video nào được phát, chúng ta nên đặt giá trị mặc định cho get\_duration\_str00:00:00.

     def get_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" 

Xác định một phương thức gọi là “play\_video” để kiểm tra xem video hiện có đang được phát trên khung vẽ hay không. Nếu không có video nào hiện đang phát, hãy tạo một đối tượng phương tiện mới bằng cách chỉ định đường dẫn tệp của nó trong biến “đã chọn\_file\_path”. Sau đó, liên kết đối tượng phương tiện này với phiên bản canvas đã tạo trước đó và bắt đầu phát lại video. Cuối cùng, cập nhật giá trị của trạng thái “đang phát\_video” để cho biết rằng video đã bắt đầu phát.

     def play_video(self):
        if not 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 

Để triển khai chức năng tua nhanh cho trình phát video trong Python, chúng ta có thể tạo hai phương thức-fast\_forwardrewind. Cái trước sẽ tăng thời gian phát lại hiện tại bằng cách thêm 10.000 mili giây vào nó trong khi cái sau sẽ giảm thời gian phát lại bằng cách trừ đi một lượng tương đương từ nó.

     def fast_forward(self):
        if self.playing_video:
            current_time = self.media_player.get_time() \+ 10000
            self.media_player.set_time(current_time)

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

Kết hợp chức năng tạm dừng và phát video trong giao diện ứng dụng của bạn bằng cách triển khai phương pháp gọi là “tạm dừng\_video”. Phương thức này sẽ chịu trách nhiệm xử lý các tương tác của người dùng liên quan đến việc phát video. Bước đầu tiên là xác định xem video đã bị tạm dừng trước đó hay chưa. Nếu video đang được phát và tạm thời bị dừng, thì hãy gọi phương thức"phát"để tiếp tục từ nơi video dừng lại. Ngược lại, nếu video chưa bao giờ được bắt đầu hoặc dừng trước đó, thì phương thức"tạm dừng"sẽ được gọi với các bản cập nhật thích hợp cho giao diện người dùng phản ánh hành động này.

     def pause_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") 

Để truyền đạt hiệu quả văn bản đã cho theo cách tinh tế hơn, tôi khuyên bạn nên diễn đạt lại nó như sau:> “Để quản lý phát lại video một cách hiệu quả, hãy triển khai hai phương pháp trong mã của bạn. Đầu tiên,‘dừng’, sẽ tạm dừng mọi quá trình phát lại video đang diễn ra và đặt lại dấu thời gian liên quan. Thứ hai, ‘set\_video\_position’, sẽ xác định xem một video hiện đang được phát lại hay không. Trong trường hợp này, nó sẽ tính toán vị trí mong muốn tính bằng mili giây dựa trên tổng thời lượng của video và đặt thời gian phát lại tương ứng.

     def stop(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())

    def set_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) 

Để truyền đạt hiệu quả thông tin mong muốn trong khi vẫn duy trì giọng điệu chuyên nghiệp, tôi khuyên bạn nên diễn đạt lại văn bản đã cho như sau: javascriptfunction updateVideoProgress() {//Kiểm tra xem video có đang phát không if (isPlaying) {//Truy xuất tổng thời lượng của video video tính bằng giâyconst totalDuration=getTotalDuration();//Tính phần trăm tiến trình dựa trên các giá trị đã truy xuất ProgressPercentage + “%”);//Định dạng thời gian hiện tại và tổng thời lượng cho mục đích hiển thịconst formattedCurrentTime=

Để thực hiện lặp lại phương pháp này sau mỗi 1.000 mili giây, do đó tạo ra một vòng lặp vô hạn tiếp tục cập nhật nhãn thời gian và tiến trình của video trong khi phát lại, vui lòng lên lịch cho thao tác này như sau:

     def update_video_progress(self):
        if self.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) 

Chắc chắn! Đây là nỗ lực của tôi trong việc diễn giải các hướng dẫn bằng ngôn ngữ trang trọng hơn:pythonclass VideoProgressBar(tk.Scale):def init (self, master=None, **kwargs):super(). init (master, **kwargs)# thiết lập trạng thái ban đầu và hành vi của tiến trình barself[‘orient’]=‘horizontal’self[’tickinterval’]=-1self[‘command’]=noneself[‘showgrid’]=Falseself[‘showlabel’]=Trueself[‘sliderrelief’]=‘groove’self[‘start’]=0self[’end’]=100# đặt tùy chọn giá trị hiển thị thành Sai để tránh hiển thị

Bắt đầu khởi tạo thanh tiến trình bằng cách chỉ định phạm vi từ 0 đến 100, đặt hướng, xác định độ dài của thanh tiến trình và áp dụng các tùy chỉnh cho thanh tiến trình. Ngoài ra, hãy liên kết một trình xử lý sự kiện với thanh tiến trình để khi tương tác với người dùng, nó sẽ kích hoạt phương thức on\_click được chỉ định để xử lý các quá trình tiếp theo.

 class VideoProgressBar(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("<Button-1>", self.on_click) 

Kết hợp chức năng của trình xử lý sự kiện “on\_click” bằng cách triển khai nó trong cơ sở mã. Mục tiêu là xác định xem thanh tiến trình đã được bật để tương tác hay chưa, sau đó tính toán giá trị cập nhật cho thanh tiến trình dựa trên vị trí mà người dùng đã nhấp vào. Cuối cùng, cập nhật giá trị được hiển thị của thanh tiến trình với giá trị mới được tính toán này.

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

Vui lòng tạo một phiên bản mới của lớp MediaPlayerApp và gọi phương thức update\_video\_progress() của nó trong ngữ cảnh của GUI Tkinter. Ngoài ra, hãy đảm bảo rằng hàm mainloop() được gọi để bắt đầu vòng lặp sự kiện và duy trì hoạt động cho đến khi người dùng đóng cửa sổ.

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

Kiểm tra các tính năng khác nhau của Video Media Player

Khi thực thi ứng dụng, giao diện phương tiện video sẽ xuất hiện với tùy chọn “Chọn tệp” được tích hợp kèm theo một loạt các điều khiển thân thiện với người dùng như chỉ báo thời gian, công cụ quản lý phát lại và biểu diễn trực quan về tiến trình của video, tất cả được gói gọn trong một giao diện trực quan. khuôn khổ hấp dẫn.

/vi/images/start-screen-of-video-media-player.jpg

Khi chọn một video, nó sẽ bắt đầu phát lại ngay từ đầu, đồng thời điều chỉnh cả dấu thời gian bắt đầu và nhãn thời lượng để phản ánh thời gian đã trôi qua.

/vi/images/video-playing-on-video-media-player.jpg

Khi nhấn phím “Tạm dừng”, phương tiện trực quan sẽ bị treo trong khi chuyển sang tùy chọn “Tiếp tục”. Bằng cách chọn tính năng “Chuyển tiếp nhanh”, phần trình bày nghe nhìn sẽ tăng lên trong khoảng thời gian mười giây.

Theo cách tương tự, khi nhấn nút “Tua lại”, video sẽ tua lại mười giây. Nút “Dừng” kết thúc hoàn toàn quá trình phát lại video. Người dùng có khả năng điều khiển thanh tiến trình để điều hướng đến các điểm cụ thể trong video. Khi thanh tiến trình di chuyển dọc theo chiều dài của nó, thời gian được hiển thị phản ánh thời lượng đã trôi qua kể từ phần đầu của video.

/vi/images/pause-buttons-turns-to-resume-button-if-video-is-paused.jpg

Nâng cao ứng dụng Video Media Player

Để cải thiện chức năng của trình phát đa phương tiện video này, bạn có thể muốn bao gồm một tính năng cho phép người dùng truy cập và hiển thị các tùy chọn phụ đề. Ngoài ra, các cải tiến tiềm năng khác có thể liên quan đến việc điều chỉnh kích thước màn hình, điều chỉnh mức âm thanh và lặp lại các phân đoạn cụ thể của video.

Để kết hợp những khả năng đó, người ta có thể đi sâu vào lĩnh vực thư viện Pygame. Pygame là một công cụ thân thiện với người dùng, có khả năng thích ứng cao, kết hợp liền mạch với Tkinter. Gói tài nguyên này mang đến cơ hội cho cấu hình được cá nhân hóa, giới thiệu một loạt các yếu tố tương tác và hoạt động hoàn hảo trên tất cả các nền tảng.