FFmpeg 是一个开源的跨平台音视频处理框架,在多媒体领域堪称 “神器”。它如同一个万能工具箱,涵盖了录制、转换、流化等一系列音视频处理功能,支持诸如 AVI、MP4、MOV、FLV、WMV、MPEG、MKV 等海量音视频格式,并且能在 Windows、macOS、Linux 等多种操作系统上稳定运行。
最初由法国计算机程序员 Fabrice Bellard 于 2000 年创建,这个项目的名称是 “FF”(代表 “Fast Forward”,快进之意)与 “mpeg”(流行的视频压缩标准 MPEG,即运动图像专家组)的组合。后来由 Michael Niedermayer 接手并持续开发,众多来自 MPlayer 项目的开发者也参与其中,为 FFmpeg 添砖加瓦,使其逐渐成长为功能完备的强大工具。
—— 知乎 Felix
因为版权之争,很多在喜马拉雅上发布的优质免费专辑,可能会被平台下架,于是我选择下载备份,本地保存要经历三步:
第一步,检测文件格式:
def check_audio_format(file_path):
with open(file_path, 'rb') as f:
header = f.read(8) # 读取前8个字节
# MP3 文件通常以 ID3 标签开头
if header[:3] == b'ID3':
return 'MP3'
# M4A 文件通常以 ftyp 标签开头
elif header[4:8] == b'ftyp':
return 'M4A'
else:
return 'Unknown format'
# 示例用法
file_path = '/Volumes/Extreme SSD 1/Backup/Time/2506/正念之道/正念之道-00-开篇介绍'
audio_format = check_audio_format(file_path)
print(audio_format)
UltraEdit 打开 M4A 文件:

第二步,批量修改 ID3 信息:
MP3 版:
#!/bin/bash
# 指定目录
DIR="/Volumes/Extreme SSD 1/Backup/Time/2506/20天学会粤语基础篇"
# 指定 artist
ARTIST="范俊军 肖荣钦"
# 遍历目录下的所有 MP3 文件
for FILE in "$DIR"/*.mp3; do
# 获取文件名(不带后缀)
FILENAME=$(basename "$FILE" .mp3)
# 获取文件夹名
ALBUM=$(basename "$DIR")
# 使用 ffmpeg 修改 ID3v2 信息
ffmpeg -i "$FILE" -metadata title="$FILENAME" -metadata album="$ALBUM" -metadata artist="$ARTIST" -codec copy "${FILE}.temp.mp3"
# 使用 id3v2 修改 ID3v1 信息
# id3v2 -t "$FILENAME" -a "$ARTIST" -A "$ALBUM" "${FILE}.temp.mp3"
# 替换原文件
mv "${FILE}.temp.mp3" "$FILE"
done
echo "ID3 信息修改完成!"
M4A 版:
#!/bin/bash
# 指定目录
DIR="/Users/Christen/Downloads/百度/乐府诗集"
# 指定 artist
ARTIST="Various Artists"
# 遍历目录下的所有 m4a 文件
for FILE in "$DIR"/*.m4a; do
# 获取文件名(不带后缀)
FILENAME=$(basename "$FILE" .m4a)
# 获取文件夹名
ALBUM=$(basename "$DIR")
# 使用 ffmpeg 修改元数据
ffmpeg -i "$FILE" -metadata title="$FILENAME" -metadata album="$ALBUM" -metadata artist="$ARTIST" -codec copy "${FILE}.temp.m4a"
# 替换原文件
mv "${FILE}.temp.m4a" "$FILE"
done
echo "m4a 文件元数据修改完成!"
Windows 版本,同时兼容 MP3 和 M4A 文件:
@echo off
setlocal enabledelayedexpansion
:: 检查FFMPEG是否存在
where ffmpeg >nul 2>nul
if %errorlevel% neq 0 (
echo 错误:未找到FFMPEG。请确保FFMPEG已安装并添加到系统PATH中。
goto :eof
)
:: 设置音频文件目录(请修改为实际目录)
set "audio_dir=D:\Music\MyAlbum"
:: 设置作者信息(请修改为实际作者)
set "artist=John Doe"
:: 获取目录名作为专辑名
for %%a in ("%audio_dir%") do set "album=%%~nxa"
echo 专辑名: %album%
echo 作者: %artist%
echo.
:: 计数器
set mp3_count=0
set m4a_count=0
:: 处理MP3文件
echo 正在处理MP3文件...
for %%f in ("%audio_dir%\*.mp3") do (
set /a mp3_count+=1
:: 获取文件名作为标题
set "title=%%~nf"
:: 显示当前处理的文件
echo 正在处理MP3文件 !mp3_count!: "%%~nf.mp3"
:: 使用FFMPEG添加/更新ID3信息
ffmpeg -i "%%f" -c copy -metadata title="!title!" -metadata artist="%artist%" -metadata album="%album%" -id3v2_version 3 "temp_%%~nf.mp3" -hide_banner -loglevel error
if !errorlevel! equ 0 (
del /f /q "%%f"
ren "temp_%%~nf.mp3" "%%~nf.mp3"
echo 已成功更新ID3信息
) else (
echo 更新失败
del /f /q "temp_%%~nf.mp3" 2>nul
)
echo.
)
:: 处理M4A文件
echo 正在处理M4A文件...
for %%f in ("%audio_dir%\*.m4a") do (
set /a m4a_count+=1
:: 获取文件名作为标题
set "title=%%~nf"
:: 显示当前处理的文件
echo 正在处理M4A文件 !m4a_count!: "%%~nf.m4a"
:: 使用FFMPEG添加/更新M4A元数据(AAC/MP4容器)
ffmpeg -i "%%f" -c copy -metadata title="!title!" -metadata artist="%artist%" -metadata album="%album%" "temp_%%~nf.m4a" -hide_banner -loglevel error
if !errorlevel! equ 0 (
del /f /q "%%f"
ren "temp_%%~nf.m4a" "%%~nf.m4a"
echo 已成功更新元数据
) else (
echo 更新失败
del /f /q "temp_%%~nf.m4a" 2>nul
)
echo.
)
:: 显示统计信息
set /a total_count=mp3_count + m4a_count
echo 处理完成! 共处理了 %total_count% 个文件(MP3: %mp3_count%, M4A: %m4a_count%)。
pause
以上脚本都依赖 FFmpeg 工具包。