使用lame以多进程方式转码wav为mp3
前言
lame以单进程的方式转码wav文件,之前量少,足够使用。如今每日wav文件数量极多,单进程的效率就不够用了,所以这里使用脚本的方式,启动多个lame进程转码wav文件。
code01: auto_lame.sh
lame进程数最大不超过CPU核数。
修改好路径后就可以执行了。
#!/usr/bin/env bash
# update:2021-05-25
# description: 根据CPU核数,多进程转码wav录音
set -eu
# 年月日
target_day=$(date -d "15 days ago" "+%d")
target_month=$(date -d "15 days ago" "+%m")
target_year=$(date -d "15 days ago" "+%Y")
# 先清理临时文件
rm -f /root/scripts/shelllogs/auto_lame/tmpls.log*
mkdir -p /root/scripts/shelllogs/auto_lame/
logfile_ls="/root/scripts/shelllogs/auto_lame/tmpls.log"
# 待录音转码的路径
folder_path="/home/Records/${target_year}/${target_month}/${target_day}"
# 文件数量
file_num=$(ls ${folder_path} | wc -l)
# cpu核数
cpu_cores=$(lscpu | grep "CPU(s):" | head -1 | awk '{print $2}')
# convert_wav 从文件中取文件名
convert_wav() {
for file in $(cat $1)
do
lame --quiet ${file}
done
}
# 使用find获取文件的绝对路径
find ${folder_path} -name "*wav" > ${logfile_ls}
# 按CPU核数切分文件
split_line=$((${file_num}/${cpu_cores}))
split -d -${split_line} ${logfile_ls} /root/scripts/shelllogs/auto_lame/tmpls.log_
# 多进程执行
for i in $(ls /root/scripts/shelllogs/auto_lame/tmpls.log_*)
do
convert_wav ${i} &
done
code02: auto_lame.py
试了一下用python队列,效果也不赖,不会出现shell脚本中某个分片文件读完后就减少进程数的问题。而且灵活性也提高了一些,可以通过消费者数量控制进程数。
使用示例:python3 auto_lame.py /home/records/2021/05
import os
import sys
from queue import Queue
import threading
# 类:消费者队列
class Consumer(threading.Thread):
def __init__(self,file_queue,*args,**kargs):
super(Consumer,self).__init__(*args,**kargs)
self.file_queue = file_queue
def run(self) -> None:
while True:
if self.file_queue.empty():
break
filename = self.file_queue.get()
cmd_lame = "lame --quiet " + filename
os.system(cmd_lame)
def main():
# 声明队列,并将wav文件的路径put到队列中
file_queue = Queue(500000)
with open("tmpls.log", 'r', encoding="utf-8") as fobj:
for i in fobj.readlines():
file_queue.put(i)
# 生成10个消费者队列
for i in range(10):
t = Consumer(file_queue)
t.start()
if __name__ == '__main__':
try:
# 通过命令行参数获取wav路径
filepath = sys.argv[1]
except IndexError:
print("路径参数无效")
cmd_find = "find " + filepath + " -iname '*wav' > tmpls.log"
os.system(cmd_find)
main()
本文来自博客园,作者:花酒锄作田,转载请注明原文链接:https://www.cnblogs.com/XY-Heruo/p/14809094.html