会员登录 立即注册

搜索

随机播放媒体文件

[复制链接]
崎山小鹿 发表于 2024-10-18 21:22:04 | 显示全部楼层 |阅读模式
崎山小鹿
2024-10-18 21:22:04 2051 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私信
以墨运商,以商助墨。

查看:2051 | 回复:4

  • 在村子中央建立图书馆

    昨天成绩斐然,收获两栋漂亮海滨别墅,和一个高级瞭望塔,但同时损失惨重,村民损失九

    阅读:0|2024-12-22
  • 墨家小镇文化与经济

    文化建设: 墨家十要 旗帜: 八卦 双鱼戏水 经济建设: 麦田、 甘蔗田

    阅读:156|2024-12-20
  • 墨者的面具

    仿照三星堆的面具做头像

    阅读:151|2024-12-19
  • 从出生地前往墨家小镇集合

    装饰一下出生地 现在有路标了,通过路标让会员找到我们的村庄,一路要非常小心不

    阅读:239|2024-12-18
  • 墨家盾牌和武器

    盾牌上有墨家的标志,武器上也有墨家的特色

    阅读:231|2024-12-17
  • 安全的保险箱

    每个人都一个自己的箱子,只有自己能开启。且死亡不掉落! 对着一个上方没有红石导

    阅读:240|2024-12-17
  • 我的世界之墨家旗帜

    如何在我的世界里创建独特的旗帜呢? 将图片生成像素画 https://chuiliu.github.io/d

    阅读:295|2024-12-16
  • 给服务器增加组件

    给服务器增加组件,例如:墨家旗帜 租赁服务器如何使用mod? 答:目前我的世界纯净

    阅读:356|2024-12-15
  • 用手机玩墨山游侠

    用手机玩墨山游侠 各大应用市场都可以下载我的世界游戏,启动之后 选择【开始游戏】

    阅读:366|2024-12-15
  • 墨山游侠服务器开启

    在网易上开启创服之旅 服务器号:25744989 我们先用游戏版本:1.12.2 来测试,看

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

手机APP

官方微博

官方微信

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