前言
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()