崎山小鹿 发表于 2024-10-18 21:22:04

随机播放媒体文件

用python实现一个功能,有两个文件夹,文件内都放有若干个媒体文件,要求程序控制播放器随机播放文件1里的媒体文件,当键盘输入文件夹2内文件序号时,播放文件夹2内对应的媒体文件,播放完后回到随机播放文件夹1内的媒体文件

import os
import random
import pygame
import threading

# 初始化pygame
pygame.mixer.init()

def play_media_from_folder(folder, stop_event):
    """随机播放文件夹内的媒体文件"""
    files =
    while not stop_event.is_set():
      if files:
            selected_file = random.choice(files)
            pygame.mixer.music.load(os.path.join(folder, selected_file))
            pygame.mixer.music.play()
            while pygame.mixer.music.get_busy() and not stop_event.is_set():
                pass# 等待音乐播放完


def play_specific_media(folder, index):
    """播放指定序号的媒体文件"""
    files =
    if 0 <= index < len(files):
      pygame.mixer.music.pause()# 暂停文件夹1的音乐
      print(f"线程暂停,开始播放:{folder}:{index}")
      pygame.mixer.music.load(os.path.join(folder, files))
      pygame.mixer.music.play()
      while pygame.mixer.music.get_busy():
            pass# 等待音乐播放完
      pygame.mixer.music.unpause()# 播放完后恢复文件夹1的音乐

    else:
      print("序号超出范围。")

def list_media_files(folder):
    """列出文件夹内的媒体文件"""
    files =
    for i, file in enumerate(files):
      print(f"{i}: {file}")
    return files

def main(folder1, folder2):
    stop_event = threading.Event()# 控制播放线程的停止
    # 启动随机播放线程
    thread = threading.Thread(target=play_media_from_folder, args=(folder1, stop_event), daemon=True)
    thread.start()
   
    print("文件夹2内的媒体文件:")
    media_files = list_media_files(folder2)

    print("输入文件夹2内文件的序号播放对应媒体,输入 'exit' 退出:")
   
    while True:
      command = input()
      if command.lower() == 'exit':
            stop_event.set()# 设置停止事件,结束播放线程
            break
      try:
            index = int(command)
            stop_event.set()
            play_specific_media(folder2, index)
            stop_event.clear()
            thread = threading.Thread(target=play_media_from_folder, args=(folder1, stop_event), daemon=True)
            thread.start()

      except ValueError:
            print("无效的输入,请输入正确的序号。")
      except IndexError:
            print("无效的序号,请再试一次。")

if __name__ == '__main__':
    folder1 = 'm1'# 替换为文件夹1的路径
    folder2 = 'm2'# 替换为文件夹2的路径
    main(folder1, folder2)

崎山小鹿 发表于 2024-10-18 21:34:38

pip install pygame
pip install opencv-python numpy


#打开视频没有声音
def play_video(video_path):
    # 打开视频文件
    cap = cv2.VideoCapture(video_path)

    if not cap.isOpened():
      print("无法打开视频文件。")
      return

    while True:
      # 逐帧读取视频
      ret, frame = cap.read()
      if not ret:
            break# 视频播放完毕

      # 显示当前帧
      cv2.imshow('Video', frame)

      # 按键控制,按 'q' 退出
      if cv2.waitKey(25) & 0xFF == ord('q'):
            break

    # 释放视频捕捉对象
    cap.release()
    cv2.destroyAllWindows()

崎山小鹿 发表于 2024-10-18 21:45:11

用python实现一个功能,有两个文件夹,文件内都放有若干个MP4文件,要求程序控制播放器随机播放文件1里的MP4文件,当键盘输入文件夹2内文件序号时,播放文件夹2内对应的MP4文件,播放完后回到随机播放文件夹1内的mp4文件。

崎山小鹿 发表于 2024-10-18 22:19:51

如果需要播放 MP4 文件并且有声音,可以使用 moviepy 库,它支持视频和音频的播放。以下是使用 moviepy 播放 MP4 文件的示例代码:
pip install moviepy




import os
import random
import threading
from moviepy.editor import VideoFileClip

def play_media_from_folder(folder, stop_event):
    """随机播放文件夹内的 MP4 文件"""
    files =
    while not stop_event.is_set():
      if files:
            selected_file = random.choice(files)
            video = VideoFileClip(os.path.join(folder, selected_file))
            video.preview()# 播放视频
            if stop_event.is_set():# 检查是否需要停止
                break

def play_specific_media(folder, index):
    """播放指定序号的 MP4 文件"""
    files =
    if 0 <= index < len(files):
      video = VideoFileClip(os.path.join(folder, files))
      video.preview()# 播放指定视频
    else:
      print("序号超出范围。")

def list_media_files(folder):
    """列出文件夹内的 MP4 文件"""
    files =
    for i, file in enumerate(files):
      print(f"{i}: {file}")
    return files

def main(folder1, folder2):
    stop_event = threading.Event()# 控制播放线程的停止
    # 启动随机播放线程
    thread = threading.Thread(target=play_media_from_folder, args=(folder1, stop_event), daemon=True)
    thread.start()
   
    print("文件夹2内的 MP4 文件:")
    list_media_files(folder2)

    print("输入文件夹2内文件的序号播放对应媒体,输入 'exit' 退出:")
   
    while True:
      command = input()
      if command.lower() == 'exit':
            stop_event.set()# 设置停止事件,结束播放线程
            break
      try:
            index = int(command)
            stop_event.set()# 暂停随机播放
            thread.join()   # 等待随机播放线程结束
            play_specific_media(folder2, index)
            stop_event.clear()# 清除停止事件,恢复随机播放
            thread = threading.Thread(target=play_media_from_folder, args=(folder1, stop_event), daemon=True)
            thread.start()      # 重新启动随机播放线程
      except ValueError:
            print("无效的输入,请输入正确的序号。")
      except IndexError:
            print("无效的序号,请再试一次。")

if __name__ == '__main__':
    folder1 = 'path/to/folder1'# 替换为文件夹1的路径
    folder2 = 'path/to/folder2'# 替换为文件夹2的路径
    main(folder1, folder2)

崎山小鹿 发表于 2024-10-19 00:55:16

#使用vlc播放视频

import os
import random
import threading
import vlc
import time

class VideoPlayer:
    def __init__(self):
      self.instance = vlc.Instance()
      self.player = self.instance.media_player_new()

    def play_video(self, video_path):
      """使用 VLC 播放视频和音频"""
      if not os.path.exists(video_path):
            print(f"文件不存在: {video_path}")
            return
      
      # 停止任何当前正在播放的媒体
      if self.player.is_playing():
            self.player.stop()

      # 加载并播放新的视频文件
      media = self.instance.media_new(video_path)
      self.player.set_media(media)
      self.player.play()

      # 等待视频加载并播放
      time.sleep(1)

      # 等待播放结束
      while self.player.is_playing():
            time.sleep(0.1)

    def stop(self):
      """停止播放"""
      if self.player.is_playing():
            self.player.stop()

def play_media_from_folder(folder, player, stop_event):
    """随机播放文件夹内的 MP4 文件"""
    files =
    while not stop_event.is_set():
      if files:
            selected_file = random.choice(files)
            player.play_video(os.path.join(folder, selected_file))

def play_specific_media(folder, player, index):
    """播放指定序号的 MP4 文件"""
    files =
    if 0 <= index < len(files):
      player.play_video(os.path.join(folder, files))
    else:
      print("序号超出范围。")

def list_media_files(folder):
    """列出文件夹内的 MP4 文件"""
    files =
    for i, file in enumerate(files):
      print(f"{i}: {file}")
    return files

def main(folder1, folder2):
    stop_event = threading.Event()# 控制播放线程的停止
    player = VideoPlayer()# 创建一个播放器实例

    # 启动随机播放线程
    thread = threading.Thread(target=play_media_from_folder, args=(folder1, player, stop_event), daemon=True)
    thread.start()

    print("文件夹2内的 MP4 文件:")
    list_media_files(folder2)

    print("输入文件夹2内文件的序号播放对应媒体,输入 'exit' 退出:")
   
    while True:
      command = input()
      if command.lower() == 'exit':
            stop_event.set()# 设置停止事件,结束播放线程
            player.stop()   # 停止播放器
            break
      try:
            index = int(command)
            stop_event.set()# 暂停随机播放
            thread.join()   # 等待随机播放线程结束
            play_specific_media(folder2, player, index)
            stop_event.clear()# 清除停止事件,恢复随机播放
            thread = threading.Thread(target=play_media_from_folder, args=(folder1, player, stop_event), daemon=True)
            thread.start()      # 重新启动随机播放线程
      except ValueError:
            print("无效的输入,请输入正确的序号。")
      except IndexError:
            print("无效的序号,请再试一次。")

if __name__ == '__main__':
    folder1 = 'm1'# 替换为文件夹1的路径
    folder2 = 'm2'# 替换为文件夹2的路径
    main(folder1, folder2)
页: [1]
查看完整版本: 随机播放媒体文件