前言

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

使用lame以多进程方式转码wav为mp3的更多相关文章

  1. OAuth2.0学习(1-6)授权方式3-密码模式(Resource Owner Password Credentials Grant)

    授权方式3-密码模式(Resource Owner Password Credentials Grant) 密码模式(Resource Owner Password Credentials Grant ...

  2. 刨根究底字符编码之十——Unicode字符集的编码方式以及码点、码元

    Unicode字符集的编码方式以及码点.码元 一.字符编码方式CEF的选择 1. 由于Unicode字符集非常大,有些字符的编号(码点值)需要两个或两个以上字节来表示,而要对这样的编号进行编码,也必须 ...

  3. Java中正负数的存储方式-正码 反码和补码

    Java中正负数的存储方式-正码 反码和补码 正码 我们以int 为例,一个int占用4个byte,32bits 0 存在内存上为 00000000 00000000 00000000 0000000 ...

  4. 基于ffmpeg不同编码方式转码后的psnr对比

    一.测试说明: 源文件:1080psrc.mp4 时长:900秒 源文件信息:Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080 [S ...

  5. WIN32下使用DirectSound接口的简单音频播放器(支持wav和mp3)

    刚好最近接触了一些DirectSound,就写了一个小程序练练手,可以用来添加播放基本的wav和mp3音频文件的播放器.界面只是简单的GDI,dxsdk只使用了DirectSound8相关的接口. D ...

  6. 简单风格 在线音乐播放器(支持wav,MP3等)

    找了两天终于找到了,支持wav,MP3,其他格式没有测试. 1.修复了jQuery判断ie的bug, 2.修复播放循环 下载地址: http://pan.baidu.com/s/1o6upwHs

  7. javaCV开发详解之7:让音频转换更加简单,实现通用音频编码格式转换、重采样等音频参数的转换功能(以pcm16le编码的wav转mp3为例)

    javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...

  8. 基于emWin的WAV,MP3软解软件播放器,带类似千千静听频谱,含uCOS-III和FreeRTOS两个版本

    第9期:WAV,MP3软解播放器,带类似千千静听频谱配套例子:V6-916_STemWin提高篇实验_WAV,MP3软解播放器,带类似千千静听频谱(uCOS-III)V6-917_STemWin提高篇 ...

  9. Linux应用和系统库的2种安装方式---源码安装tarball和二进制rpm包

    一.应用程序和系统库从哪里来? 两种机制,源码安装和二进制安装. 二.源码安装 tarball 1.核心思想是:利用开源代码,自己编译生成应用程序或者库,要求系统上必须已安装TMG(tar, make ...

  10. Tornado学习笔记(三) 请求方式/状态码

    本章我们来学习 Tornado 支持的请求方式 请求方式 Tornado支持任何合法的HTTP请求(GET.POST.PUT.DELETE.HEAD.OPTIONS).你可以非常容易地定义上述任一种方 ...

随机推荐

  1. 文心一言 VS chatgpt (5)-- 算法导论2.2 3~4题

    三.再次考虑线性查找问题(参见练习 2.1-3).假定要查找的元素等可能地为数组中的任意元素,平均需要检查输入序列的多少元素?最坏情况又如何呢?用0记号给出线性查找的平均情况和最坏情况运行时间.证明你 ...

  2. only仅显示一些字段

    only仅显示一些字段 仅显示nickname,age两列的数据 Student.objects.all().only('nickname','age')

  3. JDBC-Utils层的简单运用

    项目中JDBC的Utils层运行需要以下六个步骤 //1.定义属性为空 private static String driver = null; private static String url = ...

  4. LLM探索:GPT概念与几个常用参数 Top-k, Top-p, Temperature

    前言 上一篇文章介绍了几个开源LLM的环境搭建和本地部署,在使用ChatGPT接口或者自己本地部署的LLM大模型的时候,经常会遇到这几个参数,本文简单介绍一下~ temperature top_p t ...

  5. python如何利用算法解决业务上的【分单问题】

    分单是很多企业日常工作中非常典型的一项内容,它非常复杂,但同时又极为重要,如何合理的分单是企业管理中一个很重要的课题. 之所以说分单很复杂,是因为影响单据该分给谁,分多少量这个事儿本身就有太多的影响因 ...

  6. ThreadLocal 的应用及原理

    1. 是什么 JDK 对 ThreadLocal 类的描述为: 此类提供线程局部变量.这些变量与普通变量的不同之处在于,每个访问一个变量的线程(通过其get或set方法)都有自己的.独立初始化的变量副 ...

  7. js 之二 事件对象

    事件对象 /当事件的响应函数被触发时,浏览器每次都会讲一个事件对象作为实参传递响应函数; 在事件对象中封装了当前事件相关的一切信息,比如:鼠标的,键盘的操作 // 当鼠标在areaDiv中移动时,在s ...

  8. 系统MySQL服务无法启动报错1067的四种解决方法win7系统MySQL服务无法启动报错1067的四种解决方法

        有些win7系统用户在登陆mysql或者重装mysql时出现"无法启动MYSQL服务,错误1067",而且重启.修复注册表都没办法解决问题.那么遇到MySQL服务无法启动问 ...

  9. CANoe工具的安装

    CANoe是德国Vector公司为汽车总线的开发而设计的一款总线开发环境,全称叫CAN open environment,用于分析和模拟CAN(Controller Area Network)和LIN ...

  10. FPGA加速技术在人机交互界面中的应用及优化

    目录 引言 随着人工智能.云计算.大数据等技术的发展,人机交互界面的重要性也越来越凸显.作为用户与计算机之间的桥梁,人机交互界面的性能和效率直接影响用户的体验和使用效果.为了优化人机交互界面的性能,我 ...