import os
from pydub import AudioSegment
def add_watermark(input_audio, watermark_audio, position_ms):
"""
在指定位置插入音频水印
:param input_audio: 原始音频 (AudioSegment 对象)
:param watermark_audio: 水印音频 (AudioSegment 对象)
:param position_ms: 插入水印的时间点(毫秒)
:return: 添加水印后的音频 (AudioSegment 对象)
"""
if position_ms + len(watermark_audio) > len(input_audio):
raise ValueError("水印音频超出原始音频长度")
output_audio = input_audio.overlay(watermark_audio, position=position_ms)
return output_audio
def convert_mp3_to_m4a(input_dir, output_dir, watermark_file, position_ms=30000, bitrate="64k"):
"""
将指定目录下的 MP3 文件批量转码为 M4A 格式,并在指定时间点插入音频水印
:param input_dir: 输入 MP3 文件目录
:param output_dir: 输出 M4A 文件目录
:param watermark_file: 水印音频文件路径
:param position_ms: 插入水印的时间点(毫秒,默认 30000 毫秒,即 30 秒)
:param bitrate: 输出音频的比特率(默认 64kbps)
"""
if not os.path.exists(output_dir):
os.makedirs(output_dir)
watermark = AudioSegment.from_file(watermark_file)
for filename in os.listdir(input_dir):
if filename.endswith(".mp3"):
input_file = os.path.join(input_dir, filename)
output_file = os.path.join(output_dir, filename.replace(".mp3", ".m4a"))
audio = AudioSegment.from_mp3(input_file)
try:
audio = add_watermark(audio, watermark, position_ms)
audio.export(output_file, format="ipod", bitrate=bitrate)
print(f"转码完成:{output_file}")
except ValueError as e:
print(f"跳过文件 {filename}:{e}")
if __name__ == "__main__":
input_dir = "/music/mp3/"
output_dir = "/music/m4a/"
watermark_file = "watermark.mp3"
watermark_position = 30000
if not os.path.exists(input_dir):
print(f"错误:输入目录 {input_dir} 不存在")
else:
convert_mp3_to_m4a(
input_dir=input_dir,
output_dir=output_dir,
watermark_file=watermark_file,
position_ms=watermark_position,
bitrate="64k"
)