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 工具包。