使用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()
posted @ 2021-05-25 15:48  花酒锄作田  阅读(182)  评论(0编辑  收藏  举报