first commit
This commit is contained in:
100
README.md
Normal file
100
README.md
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
# 跨平台媒体播放器
|
||||||
|
|
||||||
|
一个基于 Python 的图形化媒体播放器,可在 **Windows / Linux / macOS** 上运行。
|
||||||
|
支持音频与视频播放、播放列表、循环模式、变速播放,以及完整的键盘快捷键。
|
||||||
|
**无需安装任何第三方播放软件**:内置纯 Python 解码内核(PyAV + sounddevice),
|
||||||
|
pip 安装依赖后即可直接播放视频。
|
||||||
|
|
||||||
|
## 功能特性
|
||||||
|
|
||||||
|
- 播放 / 暂停 / 停止、上一首 / 下一首
|
||||||
|
- 前进 / 后退(10 秒或 60 秒)与进度条点击拖动定位
|
||||||
|
- 音量调节、静音,0.5x - 2.0x 变速播放
|
||||||
|
- 三种循环模式:关 / 单曲循环 / 列表循环
|
||||||
|
- 播放列表管理(打开文件、打开文件夹、删除条目、双击播放)
|
||||||
|
- 自动记忆播放列表:退出后自动保存,下次启动自动恢复(含上次播放的曲目高亮)
|
||||||
|
- 播放列表右键菜单:播放选中 / 删除选中 / 清空全部(macOS 亦支持 Ctrl+点击)
|
||||||
|
- 视频内嵌到主窗口播放(纯 Python 内核;VLC 内核下 Windows / Linux 内嵌,
|
||||||
|
macOS 使用独立视频窗口)
|
||||||
|
- 命令行直接传入文件或文件夹即可播放
|
||||||
|
|
||||||
|
## 安装
|
||||||
|
|
||||||
|
要求:Python 3.8 及以上(自带 tkinter)。
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pip install -r requirements.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
播放内核说明(按优先级自动选择):
|
||||||
|
|
||||||
|
1. **VLC 内核**(`python-vlc`):若电脑上安装了 VLC 播放器则优先使用,
|
||||||
|
支持变速播放。
|
||||||
|
2. **纯 Python 内核**(PyAV + sounddevice):无需安装任何软件,pip 装完
|
||||||
|
依赖即可播放音视频,画面显示在主窗口内;不支持变速播放。
|
||||||
|
3. **pygame 内核**:以上依赖都缺失时的兜底,仅支持音频文件。
|
||||||
|
|
||||||
|
若想使用 VLC 内核,可自行安装 VLC:Windows 从
|
||||||
|
<https://www.videolan.org/vlc/> 下载;macOS 执行 `brew install --cask vlc`;
|
||||||
|
Linux(Debian/Ubuntu)执行 `sudo apt install vlc`。
|
||||||
|
|
||||||
|
## 运行
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python media_player.py
|
||||||
|
python media_player.py 音乐/ 电影.mp4 song.mp3
|
||||||
|
```
|
||||||
|
|
||||||
|
也可以使用一键启动脚本(会自动激活名为 `mediaplayer` 的 conda 环境):
|
||||||
|
|
||||||
|
- **Windows**:双击 `启动播放器_Windows.bat`
|
||||||
|
- **Linux**:双击 `启动播放器_Linux.sh`,或在终端执行 `bash 启动播放器_Linux.sh`
|
||||||
|
- **macOS**:终端执行 `conda activate mediaplayer && python media_player.py`
|
||||||
|
|
||||||
|
脚本会自动在 PATH 及常见安装目录中查找 conda,激活 `mediaplayer` 环境后启动
|
||||||
|
播放器;若环境未创建,请先执行:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
conda create -n mediaplayer python=3.12
|
||||||
|
conda activate mediaplayer
|
||||||
|
pip install -r requirements.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
## 快捷键
|
||||||
|
|
||||||
|
| 快捷键 | 功能 |
|
||||||
|
| --- | --- |
|
||||||
|
| `Space` | 播放 / 暂停 |
|
||||||
|
| `←` / `→` | 后退 / 前进 10 秒 |
|
||||||
|
| `Shift+←` / `Shift+→` | 后退 / 前进 60 秒 |
|
||||||
|
| `↑` / `↓` | 音量 +5 / -5 |
|
||||||
|
| `M` | 静音 / 恢复 |
|
||||||
|
| `Ctrl+←` / `Ctrl+→` | 上一首 / 下一首(macOS 亦支持 `Command+← / →`) |
|
||||||
|
| `N` / `P` | 下一首 / 上一首 |
|
||||||
|
| `[` / `]` | 减速 / 加速(0.5x - 2.0x) |
|
||||||
|
| `L` | 切换循环模式(关 / 单曲 / 列表) |
|
||||||
|
| `F` | 视频全屏切换 |
|
||||||
|
| `Esc` | 退出全屏 |
|
||||||
|
| `Ctrl+O` | 打开文件(macOS 亦支持 `Command+O`) |
|
||||||
|
| `Ctrl+Shift+O` | 打开文件夹(macOS 亦支持 `Command+Shift+O`) |
|
||||||
|
| `Enter` | 播放列表中选中的曲目 |
|
||||||
|
| `Delete` | 从播放列表移除所选曲目 |
|
||||||
|
| `S` | 停止 |
|
||||||
|
|
||||||
|
播放列表的右键菜单支持:**播放选中曲目**、**删除选中曲目**、**清空播放列表**。
|
||||||
|
播放列表保存在用户主目录的 `.mediaplayer_playlist.json` 中,删除该文件即可
|
||||||
|
清除记忆。
|
||||||
|
|
||||||
|
## 常见问题
|
||||||
|
|
||||||
|
- **状态栏显示“纯 Python 解码内核”**:说明未检测到 VLC,程序正在使用内置的
|
||||||
|
纯 Python 内核播放,无需额外安装任何软件,视频照常可用;仅变速(0.5x-2.0x)
|
||||||
|
不可用。
|
||||||
|
- **状态栏显示“pygame 音频模式”**:说明连纯 Python 内核的依赖(av、
|
||||||
|
sounddevice、numpy、Pillow)也未安装,程序回退为纯音频模式(视频不可用)。
|
||||||
|
执行 `pip install -r requirements.txt` 后重启程序即可播放视频。
|
||||||
|
- **提示找不到内核**:说明既没有 `python-vlc` 也没有 `pygame`,请执行
|
||||||
|
`pip install -r requirements.txt`;若已安装 `python-vlc` 仍提示,请确认 VLC 本体已安装。
|
||||||
|
- **Linux 缺少 tkinter**:`sudo apt install python3-tk`(Debian/Ubuntu)。
|
||||||
|
- **Linux 下视频没有嵌入主窗口**:多见于 Wayland 环境,程序会自动改用独立视频窗口。
|
||||||
|
- **macOS 视频显示在独立窗口**:这是平台限制,属正常行为,`F` 键仍可全屏。
|
||||||
1387
media_player.py
Normal file
1387
media_player.py
Normal file
File diff suppressed because it is too large
Load Diff
6
requirements.txt
Normal file
6
requirements.txt
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
av>=12.0
|
||||||
|
sounddevice>=0.4.6
|
||||||
|
numpy>=1.26
|
||||||
|
Pillow>=10.0
|
||||||
|
python-vlc>=3.0.18
|
||||||
|
pygame>=2.5.0
|
||||||
43
start_linux.sh
Executable file
43
start_linux.sh
Executable file
@@ -0,0 +1,43 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# 媒体播放器启动脚本(Linux)
|
||||||
|
# 自动激活名为 mediaplayer 的 conda 环境并启动播放器
|
||||||
|
|
||||||
|
cd "$(dirname "$0")"
|
||||||
|
|
||||||
|
# 1. 如果 conda 已在 PATH 中,直接使用它的基础目录
|
||||||
|
if command -v conda >/dev/null 2>&1; then
|
||||||
|
CONDA_BASE="$(conda info --base 2>/dev/null)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 2. 否则在常见安装位置查找
|
||||||
|
if [ -z "${CONDA_BASE:-}" ]; then
|
||||||
|
for base in "$HOME/anaconda3" "$HOME/miniconda3" /opt/anaconda3 /opt/miniconda3; do
|
||||||
|
if [ -f "$base/etc/profile.d/conda.sh" ]; then
|
||||||
|
CONDA_BASE="$base"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "${CONDA_BASE:-}" ] || [ ! -f "$CONDA_BASE/etc/profile.d/conda.sh" ]; then
|
||||||
|
echo "[错误] 未找到 conda,请先安装 Anaconda 或 Miniconda。"
|
||||||
|
read -r -p "按回车键退出..." _
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 3. 加载 conda 的 shell 函数并激活环境
|
||||||
|
source "$CONDA_BASE/etc/profile.d/conda.sh"
|
||||||
|
if ! conda activate mediaplayer; then
|
||||||
|
echo "[错误] 激活 mediaplayer 环境失败,请确认已创建该环境。"
|
||||||
|
read -r -p "按回车键退出..." _
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 4. 确认环境已激活(防止意外使用系统 Python)
|
||||||
|
if ! python -c "import sys; sys.exit(0 if 'mediaplayer' in sys.prefix else 1)"; then
|
||||||
|
echo "[错误] mediaplayer 环境未正确激活。"
|
||||||
|
read -r -p "按回车键退出..." _
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
exec python media_player.py "$@"
|
||||||
38
start_windows.bat
Normal file
38
start_windows.bat
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
@echo off
|
||||||
|
chcp 65001 >nul
|
||||||
|
setlocal
|
||||||
|
cd /d "%~dp0"
|
||||||
|
|
||||||
|
rem 查找 conda:优先使用 PATH 中的 conda,否则在常见安装目录中查找
|
||||||
|
set "CONDA_BASE="
|
||||||
|
where conda >nul 2>nul
|
||||||
|
if not errorlevel 1 (
|
||||||
|
for /f "delims=" %%i in ('conda info --base') do set "CONDA_BASE=%%i"
|
||||||
|
)
|
||||||
|
if not defined CONDA_BASE (
|
||||||
|
for %%C in ("%USERPROFILE%\anaconda3" "%USERPROFILE%\miniconda3" "%ProgramData%\Anaconda3" "%ProgramData%\Miniconda3" "C:\anaconda3" "C:\miniconda3") do (
|
||||||
|
if exist "%%~C\Scripts\activate.bat" set "CONDA_BASE=%%~C"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
if not defined CONDA_BASE (
|
||||||
|
echo [错误] 未找到 conda,请先安装 Anaconda 或 Miniconda。
|
||||||
|
pause
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
call "%CONDA_BASE%\Scripts\activate.bat" mediaplayer
|
||||||
|
if errorlevel 1 (
|
||||||
|
echo [错误] 激活 mediaplayer 环境失败,请确认已创建该环境。
|
||||||
|
pause
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
python -c "import sys; sys.exit(0 if 'mediaplayer' in sys.prefix else 1)" >nul 2>nul
|
||||||
|
if errorlevel 1 (
|
||||||
|
echo [错误] mediaplayer 环境未正确激活。
|
||||||
|
pause
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
python media_player.py %*
|
||||||
|
if errorlevel 1 pause
|
||||||
Reference in New Issue
Block a user