使用lame以多进程方式转码wav为mp3

简介: 使用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()
相关文章
|
3月前
|
数据管理 Python 内存技术
python WAV音频文件处理—— (2)处理PCM音频-- waveio包
python WAV音频文件处理—— (2)处理PCM音频-- waveio包
67 15
|
3月前
|
存储 Python 内存技术
python WAV音频文件处理—— (1)读写WAV文件
python WAV音频文件处理—— (1)读写WAV文件
98 14
|
4月前
|
编解码 计算机视觉 索引
使用ffmpeg MP4转 m3u8并播放 实测!!
使用ffmpeg MP4转 m3u8并播放 实测!!
240 1
|
编解码 API 内存技术
|
存储 编解码 JSON
MP4封装格式
MP4封装格式介绍及解释,本文介绍 mp4 里面各种 box 的作用,包括 mdat box, moov box,mdhd box 等等。
379 0
|
编解码 算法 数据格式
iOS音视频开发 - 音频编码格式(pcm、wav、mp3、aac、ogg)
我们通常从音乐App(如:网易云音乐)听歌时,会看到一首歌需要的存储空间大概是10M左右,对于手机磁盘来说这是可以接受的。但在网络中实时在线传播的话,这个数据量可能就太大了,所以必须对其进行压缩编码。
|
算法 Windows 内存技术
程序人生 - 音频格式 PCM、WAV、MP3 区别
程序人生 - 音频格式 PCM、WAV、MP3 区别
1396 0
利用ffmpeg 转mp4 格式
脚本内容如下直接复制即可 命名 convert2MP4.bat [Asm] 纯文本查看 复制代码 ? 01 02 03 04 05 06 07 08 09 10 @echo off title 视频批量无损转mp4 set path=D:ffmpeg/bin/ffmpeg.exe;%path% for /f "delims=" %%i in ('dir /b /a-d /s "*.%1"') do echo ffmpeg -i "%%i" -y -qscale 0 -vcodec libx264 "%cd%\%%~ni.mp4" ping -n 5 127.0.0.
268 0