前言

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. 2022-09-26:以下go语言代码输出什么?A:{“Time“: “2020-12-20T00:00:00Z“, “N“: 5 };B:“2020-12-20T00:00:00Z“;C:{“N“:

    2022-09-26:以下go语言代码输出什么?A:{"Time": "2020-12-20T00:00:00Z", "N": 5 }:B: ...

  2. 2022-09-04:以下go语言代码输出什么?A:不能编译;B:45;C:45.2;D:45.0。 package main import ( “fmt“ ) func main() {

    2022-09-04:以下go语言代码输出什么?A:不能编译:B:45:C:45.2:D:45.0. package main import ( "fmt" ) func main ...

  3. python 之路,致那些年,我们依然没搞明白的编码

    摘自:金角大王https://www.cnblogs.com/alex3714/articles/7550940.html 本节内容 编码回顾 编码转换 Python的bytes类型 编码回顾 在备编 ...

  4. ToolStrip1

    Private Sub ToolStrip1_ItemClicked(sender As Object, e As ToolStripItemClickedEventArgs) Handles Too ...

  5. 如何进行测试分析与设计-HTSM启发式测试策略模型 | 京东云技术团队

    测试,没有分析与设计就失去了灵魂: 测试人员在编写用例之前,该如何进行测试分析与设计呢?上次在<测试的底层逻辑>中讲到了[输入输出测试模型],还讲到了[2W+1H测试分析法],但2W1H分 ...

  6. Midjourney|文心一格prompt教程[进阶篇]:Midjourney Prompt 高级参数、各版本差异、官方提供常见问题

    Midjourney|文心一格prompt教程[进阶篇]:Midjourney Prompt 高级参数.各版本差异.官方提供常见问题 1.Midjourney Prompt 高级参数 Quality ...

  7. C端用户体验度量实战篇-京东快递小程序体验度量全面升级

    本文通过介绍体验度量模型升级研究过程.研究方法及研究结果等内容,结合实际C端产品应用,观测新模型运行周期的表现,验证了其在高速发展的业务形态和日益变化的用户需求上的适用性和有效性.我们从体验价值为导向 ...

  8. Python潮流周刊#4:Python 2023 语言峰会

    你好,我是猫哥.这里记录每周值得分享的 Python 及通用技术内容,本期是特别加更版,聚焦于 Python 官方 2023 年语言峰会的系列博客. 博客原文:https://pythoncat.to ...

  9. 初识volatile

    案例1:是否存在我不是我的问题 flag==!flag     flag是boolean类型 了解volatile 概念 1.volatile如何保证内存可见性 2.volatile如何禁止指令重排序 ...

  10. 终于把 7 年前的 Docker Hub 账号恢复了

    折腾 docker,向 Docker Hub 提交镜像的时候发现原来自己在 2014 年就已经注册过 Docker Hub 的账号了,而且在 https://hub.docker.com/u/shen ...