0
0
Lập trình
Thaycacac
Thaycacac thaycacac

Chuyển đổi YouTube sang MP3 trực tuyến với FastAPI, yt-dlp và FFmpeg

Đăng vào 5 tháng trước

• 5 phút đọc

Chuyển đổi YouTube sang MP3 trực tuyến với FastAPI, yt-dlp và FFmpeg

Nhiều dịch vụ cung cấp chức năng chuyển đổi YouTube sang MP3 trực tuyến, nhưng ít ai cho thấy những gì diễn ra sau hậu trường về mặt kỹ thuật. Trong bài viết này, tôi sẽ chia sẻ cách tôi xây dựng ứng dụng của mình với một kiến trúc có phần khác thường nhưng rất hiệu quả:

  • Backend bằng Python với FastAPI và máy chủ Uvicorn.
  • Tất cả được triển khai trên một hosting chia sẻ với cPanel, không phải trên VPS riêng biệt.
  • Được truy cập từ Internet thông qua Apache hoạt động như một proxy ngược đến quá trình Uvicorn.
  • Các trang được render bằng Jinja2 để tối ưu SEO (mỗi route trả về HTML được tối ưu hóa).

Kết quả là một ứng dụng nhẹ, có khả năng mở rộng và, quan trọng nhất, có một quy trình vững chắc để chuyển đổi video YouTube sang MP3 trực tuyến.

🎬 Bước 1: Tải video từ YouTube bằng yt-dlp

Bước đầu tiên là lấy nội dung từ YouTube. Để làm điều này, tôi sử dụng yt-dlp, một fork hiện đại của youtube-dl hỗ trợ những thay đổi liên tục trên nền tảng.

Ví dụ cơ bản bằng Python:

python Copy
import subprocess
from pathlib import Path

def download_video(url: str, destination: Path):
    command = [
        "yt-dlp",
        "-f", "bestaudio/best",  # chất lượng tốt nhất có sẵn
        "-o", str(destination),   # tệp đầu ra
        url
    ]
    subprocess.run(command, check=True)

Đoạn mã trên sẽ tạo ra một tệp âm thanh ở định dạng gốc (có thể là webm hoặc m4a, tùy thuộc vào nội dung YouTube cung cấp).

Bước 2: Chuyển đổi âm thanh sang MP3 bằng ffmpeg

Sau khi có tệp âm thanh, tôi chuyển đổi tệp đó sang MP3 bằng ffmpeg. Dưới đây là lệnh trong Python sử dụng subprocess:

python Copy
import subprocess
from pathlib import Path

def convert_to_mp3(input_file: Path, bitrate="128k") -> Path:
    output_file = input_file.with_suffix(".mp3")
    command = [
        "ffmpeg",
        "-y",                # ghi đè
        "-i", str(input_file),
        "-vn",               # không có video
        "-c:a", "libmp3lame",
        "-b:a", bitrate,     # 64k, 128k, 192k
        str(output_file)
    ]
    subprocess.run(command, check=True)
    return output_file

🔹 Tạo Endpoint trong FastAPI

Bây giờ, chúng ta sẽ tích hợp mọi thứ vào một endpoint của FastAPI:

python Copy
from fastapi import FastAPI, Form, HTTPException
from pathlib import Path
import uuid

app = FastAPI()

@app.post("/convert-youtube")
async def convert_youtube(url: str = Form(...), quality: str = Form("128k")):
    try:
        unique_id = uuid.uuid4().hex
        temp_file = Path(f"/tmp/{unique_id}.webm")

        # 1. Tải audio
        download_video(url, str(temp_file))

        # 2. Chuyển đổi sang MP3
        mp3_file = convert_to_mp3(temp_file, bitrate=quality)

        return {
            "status": "ok",
            "download_url": f"/downloads/{mp3_file.name}"
        }
    except Exception as e:
        raise HTTPException(status_code=500, detail=f"Lỗi trong quá trình chuyển đổi: {e}")

🔹 Script khởi động với Uvicorn trên cPanel

Tất cả những điều này đều chạy trên cPanel (nơi mà bạn thường không mong đợi gì hơn ngoài PHP). Để khởi động máy chủ của mình, tôi có một script nhỏ là start.sh:

bash Copy
PROJECT_DIR="/home/user/public_html"
VENV="$PROJECT_DIR/venv/bin/activate"
PID_FILE="$PROJECT_DIR/uvicorn.pid"

cd "$PROJECT_DIR" || exit 1
source "$VENV"

nohup uvicorn app.main:app \
  --host 127.0.0.1 \
  --port 8000 \
  --proxy-headers \
  --forwarded-allow-ips="127.0.0.1" \
  > uvicorn.log 2>&1 &
echo $! > "$PID_FILE"

🔹 Kết quả cuối cùng

Với kiến trúc này, tôi đã thiết lập một dịch vụ mà:

  • Hoạt động trên hosting cPanel với Apache như một proxy.
  • Cho phép bất kỳ người dùng nào dán một liên kết YouTube và nhận MP3 của nó.
  • Sử dụng các công cụ mã nguồn mở (yt-dlp + FFmpeg) để xử lý toàn bộ quy trình.
  • Được thiết kế để nhẹ, nhanh và an toàn.

👉 Bạn có thể thử nghiệm trên dự án của tôi:

Chuyển đổi YouTube sang MP3 trực tuyến

✅ Kết luận:

Mặc dù hạ tầng có thể có vẻ không thông thường (FastAPI trên cPanel với Apache), nó hoàn toàn khả thi và chứng minh rằng Python + FastAPI có thể thích ứng ngay cả trong những môi trường truyền thống. Nếu bạn cần một công cụ chuyển đổi từ YouTube sang MP3, đừng quên rằng bạn có thể sử dụng miễn phí và trực tuyến 😉.

💡 Thực hành tốt

  • Luôn kiểm tra các liên kết YouTube trước khi thực hiện chuyển đổi để đảm bảo nội dung hợp lệ.
  • Sử dụng các bitrate khác nhau để đáp ứng nhu cầu chất lượng âm thanh khác nhau.

⚠️ Cạm bẫy thường gặp

  • Đảm bảo rằng bạn đã cài đặt tất cả các thư viện cần thiết, bao gồm yt-dlpFFmpeg.
  • Kiểm tra log lỗi để xử lý các vấn đề phát sinh.

⚙️ Mẹo hiệu suất

  • Tối ưu hóa cài đặt của Uvicorn để xử lý nhiều yêu cầu đồng thời.
  • Sử dụng caching để giảm tải cho server.

❓ Câu hỏi thường gặp

Làm thế nào để triển khai ứng dụng này trên VPS?

  • Bạn có thể sử dụng Docker để triển khai ứng dụng trên VPS một cách dễ dàng và hiệu quả hơn.

Có thể chuyển đổi video từ các nền tảng khác không?

  • Có, chỉ cần thay đổi URL trong hàm tải video và điều chỉnh định dạng đầu ra nếu cần.

🔗 Tài liệu tham khảo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào