Post

Python 脚本,提取视频的音频,并按同样的目录结构保存

Python 脚本,提取视频的音频,并按同样的目录结构保存

Python 脚本,提取视频的音频,并按同样的目录结构保存

  • -i 输入目录(递归搜索视频)
  • -o 输出目录(保持相同的目录结构)
  • 自动识别常见视频格式(如 .mp4, .mkv, .mov 等)
  • 提取视频中的音频(保留原始音频编码,不转码,速度快)
  • 如果需要可以改成转成统一格式(比如 .mp3

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import os
import argparse
import subprocess
from pathlib import Path

# 支持的视频扩展名
VIDEO_EXTS = {".mp4", ".mkv", ".mov", ".avi", ".flv", ".wmv", ".webm"}

def extract_audio(input_path: Path, output_path: Path):
    """使用 ffmpeg 从视频提取音频"""
    output_path.parent.mkdir(parents=True, exist_ok=True)

    # 如果想直接用原始音频编码(不转码)
    cmd = [
        "ffmpeg", "-i", str(input_path),
        "-vn",  # 不要视频流
        "-acodec", "copy",  # 保留原音频编码
        str(output_path)
    ]

    try:
        subprocess.run(cmd, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        print(f"[OK] {input_path} -> {output_path}")
    except subprocess.CalledProcessError as e:
        print(f"[FAIL] {input_path},错误:{e.stderr.decode(errors='ignore')}")

def main():
    parser = argparse.ArgumentParser(description="递归提取目录中所有视频的音频,保持目录结构")
    parser.add_argument("-i", "--input", required=True, help="输入视频目录")
    parser.add_argument("-o", "--output", required=True, help="输出音频目录")
    parser.add_argument("-f", "--format", default="m4a", help="输出音频格式(默认 m4a)")

    args = parser.parse_args()

    input_dir = Path(args.input).resolve()
    output_dir = Path(args.output).resolve()

    for video_path in input_dir.rglob("*"):
        if video_path.is_file() and video_path.suffix.lower() in VIDEO_EXTS:
            # 计算相对路径
            relative_path = video_path.relative_to(input_dir)
            # 输出路径:保持目录结构,只改后缀
            output_path = output_dir / relative_path.with_suffix(f".{args.format}")
            extract_audio(video_path, output_path)

if __name__ == "__main__":
    main()

使用示例

1
python extract_audio.py -i /path/to/videos -o /path/to/audios
  • 默认输出 .m4a 格式(如果原视频是 AAC 编码,速度非常快)
  • 想要转成 mp3:
1
python extract_audio.py -i /path/to/videos -o /path/to/audios -f mp3

注意

  • 需要系统已安装 ffmpeg
  • 如果原视频音频编码和目标格式不匹配,-acodec copy 会失败,可以改成转码:
1
"-acodec", "libmp3lame"  # 转成 mp3

This post is licensed under CC BY 4.0 by the author.