刚刚在整理文件夹时,我顺手打开了一个文件夹,惊讶地发现里面有竟然有78个.mp3文件,仔细一看才发现它们是我准备俄语考试时的听力音频。
我大脑瞬间高速运转:这些文件为何在这里?要删还是留?上次还有好多没听完的。在我犹豫不决的时候,突然有个想法在我脑海闪现:为什么不把所有文件都合并成一个,同时提取文本内容呢?这样在听音频时,如果有听不懂的地方还能看看文本,对学习会更有帮助。
说干就干,我先明确了需求:把当前目录下的78个.mp3文件合并成一个文件。
我首先考虑将所有文件拖入剪辑软件中进行处理,但一想到有78个文件,导入到剪辑软件中还得一个一个拼接,想想头都大了。幸好之前用过ffmpeg合并视频,这不就派上用场了。
现在我们进一步明确了需求:用ffmpeg把当前目录下的78个.mp3文件合并成一个文件。
在开始实现之前,先查看这篇文章[FFmpeg] 拼接音频。根据文章的内容,首先我们需要把目录下所有的.mp3文件按照file 'x.mp3'的格式逐行写入到concat.txt文件中,然后执行下面的代码,就能得到一个合并后的output.mp3文件。
ffmpeg -f concat -i concat.txt -c copy "output.mp3"
进一步拆解需求,现在我们需要遍历当前目录下所有的.mp3文件,并按照file 'x.mp3'的格式逐行写入到concat.txt文件中。
是一个一个手动收入吗?78个,开玩笑?😝
NO!NO!NO!
这时,我们的Python小伙伴请求出战。
好!那你就来吧!
说来就来,先新建main.py,然后双击打开,三下五除二,很快啊,代码写完了,完整代码如下:
import os
def scan_and_write_mp3(directory):
# 检查目录是否存在
if not os.path.exists(directory):
print("目录不存在")
return
# 检查目录是否是一个文件夹
if not os.path.isdir(directory):
print("输入路径不是一个目录")
return
# 打开concat.txt文件以写入模式
with open(os.path.join(directory, 'concat.txt'), 'w') as concat_file:
# 遍历目录
for root, dirs, files in os.walk(directory):
for file in files:
# 检查文件是否是.mp3文件
if file.endswith('.mp3'):
# 将文件名写入concat.txt文件
concat_file.write("file '"+ file +"'\n")
print("writing is done")
# 指定要扫描的目录路径
# directory_to_scan = r'C:\path\to\your\directory' # 使用原始字符串
# 这里输入你的目录
directory_to_scan = "C:/path/to/your/directory" # 这里输入你的目录,使用 \ 会报错
# 调用函数进行扫描和写入
scan_and_write_mp3(directory_to_scan)
是骡子是马,让我们在vscode中‘溜’一下,很快不到1秒钟,终端打印出了以下信息:
[Running] python -u "c:\Users\test\Desktop\est\main.py"
writing is done
[Done] exited with code=0 in 0.098 seconds
同时我们目录里也出现了concat.txt文件,双击打开,这正是我们想要的:
file '01.mp3'
file '02.mp3'
…………
file '78.mp3'
接下来就简单多了,打开CMD窗口,输入以下代码,按下回车,等待程序跑完:
ffmpeg -f concat -i concat.txt -c copy "output.mp3"
窗口输出了以下信息:
size= 188183kB time=01:20:17.57 bitrate= 320.0kbits/s speed=3.07e+03x
最后,让我们双击打开output.mp3文件,时间轴1:20:16,舒服了~