会员登录 立即注册

搜索

随机播放媒体文件

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

查看:854 | 回复:4

  • 高真实感的人物形象SyncTalk

    SyncTalk是一种基于NeRF的高同步性说话人合成方法,专门针对提升说话人视频真实感和

    阅读:53|2024-11-20
  • wav2lip-384x384  训练

    Wav2Lip是一种基于深度学习的人物口型生成技术,它可以将音频信号转化为对应的人物

    阅读:307|2024-11-14
  • 去掉视频中的字幕-牛片网字幕抹除

    有时候我们需要去掉视频中的字幕,可以使用牛片网的字幕抹除功能 项目地址:https://w

    阅读:377|2024-11-07
  • 程序员的出图神器ComfyUI

    ComfyUI 是一个强大且模块化的 Stable Diffusion 操作界面,与我们熟知的 WebUI 在底

    阅读:419|2024-11-05
  • 平面2D数字人王者DH_live

    每个人都能用的数字人 一、项目地址:https://github.com/kleinlee/DH_live 目前我们

    阅读:648|2024-11-05
  • 向日葵智能阳光导入系统

    向日葵智能阳光导入系统,方便部署在野外、山坡,沼泽给光线不足的地区带去阳光,有了

    阅读:427|2024-11-05
  • 大饼AI变声

    你想男声变女声吗?你想女声变男声吗?实现声音自由可以使用大饼AI变声。 官网地址:h

    阅读:372|2024-11-04
  • 变声软件VTUBESOUND

    软件地址:https://www.vtubesound.com/ 主要功能: 软件目前支持Windows所有版本

    阅读:412|2024-11-04
  • 诚聘版主

    有人在论坛发了十几篇广告,幸好及时发现并全部删除, 诚聘版主,欢迎喜欢这个网站

    阅读:452|2024-11-02
  • 可视化神经网络训练tensorflow.org

    通过图像和动画的形式,解释深度学习是如何一步步简化复杂的事物的。 能够设置数据

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

手机APP

官方微博

官方微信

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