会员登录 立即注册

搜索

随机播放媒体文件

[复制链接]
崎山小鹿 发表于 2024-10-18 21:22:04 | 显示全部楼层 |阅读模式
崎山小鹿
2024-10-18 21:22:04 4092 4 看全部
用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 = [f for f in os.listdir(folder) if f.endswith(('.mp3', '.wav', '.ogg'))]
    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 = [f for f in os.listdir(folder) if f.endswith(('.mp3', '.wav', '.ogg'))]
    if 0 <= index < len(files):
        pygame.mixer.music.pause()  # 暂停文件夹1的音乐
        print(f"线程暂停,开始播放:{folder}:{index}")
        pygame.mixer.music.load(os.path.join(folder, files[index]))
        pygame.mixer.music.play()
        while pygame.mixer.music.get_busy():
            pass  # 等待音乐播放完
        pygame.mixer.music.unpause()  # 播放完后恢复文件夹1的音乐

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

def list_media_files(folder):
    """列出文件夹内的媒体文件"""
    files = [f for f in os.listdir(folder) if f.endswith(('.mp3', '.wav', '.ogg'))]
    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)
天不生墨翟,万古如长夜!以墨运商,以商助墨。金双石科技长期招聘科技研发人才!微信:qishanxiaolu   电话:15876572365   公司:深圳市金双石科技有限公司
回复

使用道具 举报

 楼主| 崎山小鹿 发表于 2024-10-18 21:34:38 | 显示全部楼层
崎山小鹿
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()
天不生墨翟,万古如长夜!以墨运商,以商助墨。金双石科技长期招聘科技研发人才!微信:qishanxiaolu   电话:15876572365   公司:深圳市金双石科技有限公司
回复

使用道具 举报

 楼主| 崎山小鹿 发表于 2024-10-18 21:45:11 | 显示全部楼层
崎山小鹿
2024-10-18 21:45:11 看全部
用python实现一个功能,有两个文件夹,文件内都放有若干个MP4文件,要求程序控制播放器随机播放文件1里的MP4文件,当键盘输入文件夹2内文件序号时,播放文件夹2内对应的MP4文件,播放完后回到随机播放文件夹1内的mp4文件。
天不生墨翟,万古如长夜!以墨运商,以商助墨。金双石科技长期招聘科技研发人才!微信:qishanxiaolu   电话:15876572365   公司:深圳市金双石科技有限公司
回复

使用道具 举报

 楼主| 崎山小鹿 发表于 2024-10-18 22:19:51 | 显示全部楼层
崎山小鹿
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 = [f for f in os.listdir(folder) if f.endswith('.mp4')]
    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 = [f for f in os.listdir(folder) if f.endswith('.mp4')]
    if 0 <= index < len(files):
        video = VideoFileClip(os.path.join(folder, files[index]))
        video.preview()  # 播放指定视频
    else:
        print("序号超出范围。")

def list_media_files(folder):
    """列出文件夹内的 MP4 文件"""
    files = [f for f in os.listdir(folder) if f.endswith('.mp4')]
    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)
天不生墨翟,万古如长夜!以墨运商,以商助墨。金双石科技长期招聘科技研发人才!微信:qishanxiaolu   电话:15876572365   公司:深圳市金双石科技有限公司
回复

使用道具 举报

 楼主| 崎山小鹿 发表于 2024-10-19 00:55:16 | 显示全部楼层
崎山小鹿
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 = [f for f in os.listdir(folder) if f.endswith('.mp4')]
    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 = [f for f in os.listdir(folder) if f.endswith('.mp4')]
    if 0 <= index < len(files):
        player.play_video(os.path.join(folder, files[index]))
    else:
        print("序号超出范围。")

def list_media_files(folder):
    """列出文件夹内的 MP4 文件"""
    files = [f for f in os.listdir(folder) if f.endswith('.mp4')]
    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)
天不生墨翟,万古如长夜!以墨运商,以商助墨。金双石科技长期招聘科技研发人才!微信:qishanxiaolu   电话:15876572365   公司:深圳市金双石科技有限公司
回复

使用道具 举报

  • 您可能感兴趣
您需要登录后才可以回帖 登录 | 立即注册 |

本版积分规则 返回列表

管理员给TA私信
以墨运商,以商助墨。

查看:4092 | 回复:4

  • 墨山游侠之生存区的农场

    有玩家一直说饿,现在有农场了就能提供源源不断的面包,希望能供养整个城市! 招聘

    阅读:343|2025-02-11
  • 墨山游侠之熊孩子侦测器

    熊孩子在创造区拿了岩浆就会被困在传送点,房主会收到警报立刻远程处理。 第一个命

    阅读:386|2025-02-10
  • 墨山游侠之熊孩子岛

    给了玩家一个创造区,同时也给系统带来了沉重的压力 为了让熊孩子在墨山游侠中获得

    阅读:427|2025-02-09
  • 我的世界命令方块执行多条指令

    在《我的世界》(Minecraft)的 命令方块 里,不能直接换行执行多条指令,但有几种方

    阅读:604|2025-02-04
  • 墨山游侠之八卦小镇

    阅读:965|2025-01-23
  • 墨山游侠之给玩家指定区域

    在默认为冒险模式的游戏地图里开辟一块生存区一块创造区。 命令块实现(/tp 命令)

    阅读:1181|2025-01-20
  • 墨山游侠之先天八卦

    墨道两家是打断骨头连着筋 先天八卦1 先天八卦2 喜欢先天八卦的朋友可以到里面

    阅读:1022|2025-01-19
  • 墨山游侠之领地

    如何在游戏里面设置领地? 领地管理权杖 叶枫的领地权杖 按F11可以切换鼠标,点击

    阅读:1083|2025-01-18
  • 墨山游侠之末地传送门

    找到末地传送门了,大家都可以通过田横岛的五百义士墓传送到达

    阅读:731|2025-01-16
  • 墨山游侠之墨子五行记

    《墨子五行记》序 混沌初开,乾坤始奠,道家言 “万物负阴而抱阳,冲气以为和”,追

    阅读:677|2025-01-16
金双石科技,软件开发20年,技术行业领先,您的满意,就是我们的目标,认真负责,开拓进取,让成品物超所值
关于我们
公司简介
发展历程
联系我们
本站站务
友情链接
新手指南
内容审核
商家合作
广告合作
商家入驻
新闻合作

手机APP

官方微博

官方微信

联系电话:15876572365 地址:深圳市宝安区西乡街道宝民二路宝民花园 ( 粤ICP备2021100124号-1 ) 邮箱:qishanxiaolu@qq.com
QQ|Powered by Discuz! X3.5 © 2001-2024 Discuz! Team.
快速回复 返回顶部 返回列表