会员登录 立即注册

搜索

随机播放媒体文件

[复制链接]
崎山小鹿 发表于 2024-10-18 21:22:04 | 显示全部楼层 |阅读模式
崎山小鹿
2024-10-18 21:22:04 16578 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   公司:深圳市金双石科技有限公司
回复

使用道具 举报

  • 您可能感兴趣
  • 墨山游侠-墨山降魔药水
    墨山游侠-墨山降魔药水
    有没有一种药水,能将敌方单位变成我方单位呢?墨山降魔药水就是能将劫掠兽、掠夺者、
    06-17
  • 墨山游侠的NPC
    墨山游侠的NPC
    NPC的好处是比较亲切,信息容量大,可以安排任务也可以做交易,NPC相对于建筑来说它占
    03-27
  • 墨山游侠-墨山写字笔
    墨山游侠-墨山写字笔
    墨山写字笔 很多时候玩家想在某地做一个标记,或者留下一段感悟写字笔就非常有用了。
    06-30
  • 墨山游侠之ATM机
    墨山游侠之ATM机
    ### 在 Minecraft 基岩版 里,你可以使用 命令方块 来制作一个 ATM 机,实现绿宝石
    02-24
  • 墨山游侠-墨山炼魔塔
    墨山游侠-墨山炼魔塔
    有了这个在保证村庄安全的同时给村庄带来源源不断的收入!塔的影响范围半径150格,附
    07-23
您需要登录后才可以回帖 登录 | 立即注册 |

本版积分规则 返回列表

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

查看:16578 | 回复:4

  • 墨山游侠-墨山炼魔塔

    有了这个在保证村庄安全的同时给村庄带来源源不断的收入!塔的影响范围半径150格,附

    阅读:251|2025-07-23
  • 墨山游侠部门规划

    NPC设计: 使用预设零件架构编程实现了对话和任务功能,可通过配置零件快速搭建NPC

    阅读:368|2025-07-18
  • 墨山游侠墨子模型

    网上有很多很优秀的墨子照片: 我们能否使用AI生存模型呢?

    阅读:343|2025-07-17
  • 墨子图书馆III

    这是第三座墨子图书馆,由墨山游侠团队超级英雄小安创作。如果你也喜欢墨子,关注我们

    阅读:409|2025-07-13
  • 墨山游侠-圣安大教堂

    圣安大教堂是由墨山游侠团队超级英雄小安所做,圣安大教堂以其极高的艺术价值让世人惊

    阅读:400|2025-07-13
  • 墨山游侠-聚贤山庄

    中国古代建筑群,历时三个月倾情打造 视频: 下载地址:

    阅读:375|2025-07-12
  • MiniSNS是什么

    MiniSNS是一款支持多端(App、小程序、H5、PC)的社区程序,基于 Laravel框架 开发,

    阅读:335|2025-07-11
  • SDGun社区是用什么语言开发的,是什么架构

    SDGun社区是一个聚集了射击竞技、射击娱乐和军事潮流爱好者的平台。它提供了新品爆料

    阅读:408|2025-07-07
  • 墨山游侠-墨山写字笔

    墨山写字笔 很多时候玩家想在某地做一个标记,或者留下一段感悟写字笔就非常有用了。

    阅读:667|2025-06-30
  • 墨山游侠-自定义画

    方法1: 找到 textures/painting 文件夹中的 kz.png(早期)或多个 painting 图(

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

手机APP

官方微博

官方微信

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