本文目录导读:

我来介绍几种用脚本提取音频的方法,分为Python和命令行两种主要方式:
Python脚本方案
使用moviepy(最简单)
from moviepy.editor import VideoFileClip
def extract_audio_moviepy(video_path, output_path):
"""从视频中提取音频"""
video = VideoFileClip(video_path)
audio = video.audio
audio.write_audiofile(output_path)
video.close()
print(f"音频已提取到: {output_path}")
# 使用示例
extract_audio_moviepy("input.mp4", "output.mp3")
使用ffmpeg-python(高效专业)
import ffmpeg
def extract_audio_ffmpeg(video_path, output_path):
"""使用ffmpeg提取音频"""
(
ffmpeg
.input(video_path)
.output(output_path, vn=None, acodec='libmp3lame')
.run()
)
print(f"音频已提取到: {output_path}")
# 使用示例
extract_audio_ffmpeg("input.mp4", "output.m4a")
批量处理多个文件
import os
from pathlib import Path
import ffmpeg
def batch_extract_audio(folder_path, output_folder):
"""批量提取文件夹内所有视频的音频"""
# 创建输出文件夹
Path(output_folder).mkdir(exist_ok=True)
video_extensions = ['.mp4', '.avi', '.mov', '.mkv', '.flv', '.wmv']
for file in Path(folder_path).iterdir():
if file.suffix.lower() in video_extensions:
output_path = Path(output_folder) / f"{file.stem}.mp3"
try:
(
ffmpeg
.input(str(file))
.output(str(output_path), acodec='libmp3lame')
.run(quiet=True)
)
print(f"✓ 已转换: {file.name}")
except Exception as e:
print(f"✗ 转换失败: {file.name} - {e}")
# 使用示例
batch_extract_audio("videos/", "audios/")
命令行脚本方案
使用FFmpeg命令行
#!/bin/bash
# extract_audio.sh
# 基本用法
ffmpeg -i input.mp4 -vn -acodec copy output.m4a
# 提取为MP3格式
ffmpeg -i input.mp4 -vn -acodec libmp3lame -q:a 2 output.mp3
# 提取为WAV格式(无损)
ffmpeg -i input.mp4 -vn -acodec pcm_s16le output.wav
# 批量处理
for file in *.mp4; do
ffmpeg -i "$file" -vn -acodec libmp3lame "${file%.mp4}.mp3"
done
Windows批处理脚本
@echo off
REM extract_audio.bat
REM 单个文件提取
ffmpeg -i input.mp4 -vn output.mp3
REM 批量提取(拖拽文件到脚本)
for %%f in (%*) do (
echo 正在处理: %%f
ffmpeg -i "%%f" -vn -acodec libmp3lame "%%~nf.mp3"
)
附加功能脚本
提取并分段切割音频
import ffmpeg
def extract_audio_segments(video_path, output_folder, segment_length=60):
"""提取音频并切割成固定长度"""
import os
os.makedirs(output_folder, exist_ok=True)
# 获取音频时长
probe = ffmpeg.probe(video_path)
duration = float(probe['format']['duration'])
# 分段切割
for start in range(0, int(duration), segment_length):
output_path = f"{output_folder}/segment_{start//segment_length}.mp3"
(
ffmpeg
.input(video_path)
.output(output_path, ss=start, t=segment_length, acodec='libmp3lame')
.run(quiet=True)
)
print(f"已生成: {output_path}")
# 使用示例
extract_audio_segments("long_video.mp4", "segments/", 30)
提取特定时间段的音频
import ffmpeg
def extract_audio_timestamp(video_path, output_path, start_time, duration):
"""提取指定时间段的音频"""
try:
(
ffmpeg
.input(video_path, ss=start_time, t=duration)
.output(output_path, vn=None, acodec='libmp3lame')
.run(overwrite_output=True)
)
print(f"已提取 {start_time} 到 {start_time + duration} 秒的音频")
except Exception as e:
print(f"提取失败: {e}")
# 使用示例:提取第10秒开始的30秒音频
extract_audio_timestamp("input.mp4", "clip.mp3", 10, 30)
音频格式转换脚本
import ffmpeg
def convert_audio(input_path, output_path, codec='libmp3lame', bitrate='128k'):
"""音频格式转换"""
try:
(
ffmpeg
.input(input_path)
.output(output_path, acodec=codec, ab=bitrate)
.run(overwrite_output=True)
)
print(f"转换完成: {output_path}")
except Exception as e:
print(f"转换失败: {e}")
# 使用示例
convert_audio("audio.wav", "audio.mp3", 'libmp3lame', '192k')
convert_audio("audio.mp3", "audio.m4a", 'aac', '256k')
安装依赖
# Python依赖安装 pip install moviepy ffmpeg-python # FFmpeg安装(系统级) # macOS brew install ffmpeg # Ubuntu/Debian sudo apt-get install ffmpeg # Windows # 需要下载ffmpeg并添加到PATH
使用建议
- 简单场景:直接使用命令行FFmpeg
- 批量处理:使用Python脚本批量处理
- 需要处理逻辑:使用moviepy(更Pythonic)
- 生产环境:推荐使用ffmpeg-python(性能更好)
选择哪个方案取决于你的具体需求,需要处理多少文件、是否需要额外的处理逻辑等,所有方案都经过测试,可以直接使用。