当然!以下是一个示例 Docker 镜像,它支持网页上传一个 .m4u
文件,并将其转换为 MP3。这个示例使用Audio-Converter-Python
首先,创建一个新的目录来存放你的项目文件:
mkdir m4u_to_mp3_converter
cd m4u_to_mp3_converter
然后,在你的项目目录中创建一个 Dockerfile
:
### docker build -t m4u_to_mp3_converter .
# 使用官方的 Python 基础镜像
FROM python:3.9-slim
# 设置工作目录
WORKDIR /app
# 安装必要的依赖
RUN apt-get update && apt-get install -y \
ffmpeg \
&& rm -rf /var/lib/apt/lists/*
# 复制应用程序代码到镜像中
COPY . /app
# 安装 Python 依赖
RUN pip install --no-cache-dir -r requirements.txt
# 暴露端口
EXPOSE 5000
在你的项目目录中创建一个 requirements.txt
文件,并添加以下内容:
annotated-types==0.6.0
anyio==4.3.0
certifi==2024.2.2
charset-normalizer==3.3.2
click==8.1.7
colorama==0.4.6
decorator==4.4.2
dnspython==2.6.1
email_validator==2.1.1
exceptiongroup==1.2.1
fastapi==0.111.0
fastapi-cli==0.0.3
ffmpeg==1.4
h11==0.14.0
httpcore==1.0.5
httptools==0.6.1
httpx==0.27.0
idna==3.7
imageio==2.34.1
imageio-ffmpeg==0.4.9
Jinja2==3.1.4
markdown-it-py==3.0.0
MarkupSafe==2.1.5
mdurl==0.1.2
moviepy==1.0.3
numpy==1.26.4
orjson==3.10.3
pillow==10.3.0
proglog==0.1.10
pydantic==2.7.1
pydantic_core==2.18.2
pydub==0.25.1
Pygments==2.18.0
python-dotenv==1.0.1
python-multipart==0.0.9
PyYAML==6.0.1
requests==2.31.0
rich==13.7.1
shellingham==1.5.4
sniffio==1.3.1
starlette==0.37.2
tqdm==4.66.4
typer==0.12.3
typing_extensions==4.11.0
ujson==5.10.0
urllib3==2.2.1
uvicorn==0.29.0
watchfiles==0.21.0
websockets==12.0
然后,创建一个 app.py
文件,用于处理文件上传和转换:
from fastapi import FastAPI, File, UploadFile, Response
from pydub import AudioSegment
import os
app = FastAPI()
ALLOWED_EXTENSIONS = {'m4a', 'wma', 'wav'}
def allowed_file(filename):
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
def convert_to_mp3(input_file):
audio = AudioSegment.from_file(input_file)
mp3_file_path = os.path.splitext(input_file)[0] + ".mp3"
audio.export(mp3_file_path, format="mp3")
return mp3_file_path
@app.post("/convert/")
async def convert_file(file: UploadFile = File(...)):
if not allowed_file(file.filename):
return {"error": "Invalid file format. Allowed formats: m4a, wma, wav"}
if not os.path.exists("temp"):
os.makedirs("temp")
input_file_path = f"temp/{file.filename}"
with open(input_file_path, "wb") as buffer:
buffer.write(await file.read())
mp3_file_path = convert_to_mp3(input_file_path)
os.remove(input_file_path)
return {
"message": "File converted successfully",
"converted_file": mp3_file_path,
"download_link": f"/download/{os.path.basename(mp3_file_path)}"
}
@app.get("/download/{file_name}")
async def download_file(file_name: str, response: Response):
file_path = f"temp/{file_name}"
if os.path.exists(file_path):
response.headers["Content-Disposition"] = f"attachment; filename={file_name}"
response.headers["Content-Type"] = "audio/mpeg"
with open(file_path, "rb") as file:
content = file.read()
return Response(content, media_type="audio/mpeg")
else:
return {"error": "File not found"}
现在,你可以使用以下命令来构建和运行 Docker 镜像:
##创建镜像
docker build -t m4u_to_mp3_converter .
##路由器用这个
docker build --network host -t m4u_to_mp3_converter .
docker run -it -p 35300:8000 --name mp3conv m4u_to_mp3_converter /bin/bash
uvicorn convert:app --reload --host 0.0.0.0 --port 8000
你可以在浏览器中访问 http://localhost:35300
,然后上传一个 .m4u
文件。上传成功后,你会收到转换后的 MP3 文件。
请注意,这个示例是一个简单的实现,可能需要根据实际需求进行调整和优化。
最后一次更新于2024-09-27