【CI130x 离在线】Linux平台从命名管道接收PCM格式数据并转为WAV文件——Python脚本实现

news/2025/11/22 0:16:37/文章来源:https://www.cnblogs.com/FBsharl/p/19254874

我来为您提供一个完整的解决方案,使用Python实现从命名管道读取PCM数据并转换为WAV文件。

方案概述

我将使用Python实现,因为它有良好的音频处理库支持。程序会监听命名管道,当检测到数据流时开始录制,在数据流中断时自动结束并保存为WAV文件。

#!/usr/bin/env python3
"""
PCM数据采集和WAV转换程序
从命名管道 /tmp/VCM_Send 读取PCM数据并转换为WAV文件
PCM格式: 16kHz, 单声道, 16bit
"""import os
import sys
import time
import signal
import wave
import argparse
from pathlib import Pathclass PCMtoWAVConverter:def __init__(self, pipe_path, output_dir, sample_rate=16000, channels=1, sample_width=2):self.pipe_path = pipe_pathself.output_dir = Path(output_dir)self.sample_rate = sample_rateself.channels = channelsself.sample_width = sample_width# 创建输出目录self.output_dir.mkdir(exist_ok=True)# 确保命名管道存在self._ensure_pipe_exists()self.is_recording = Falseself.current_data = bytearray()def _ensure_pipe_exists(self):"""确保命名管道存在,如果不存在则创建"""if not os.path.exists(self.pipe_path):print(f"创建命名管道: {self.pipe_path}")os.mkfifo(self.pipe_path)elif not os.path.ispipe(self.pipe_path):print(f"错误: {self.pipe_path} 存在但不是命名管道")sys.exit(1)def generate_filename(self):"""生成基于时间戳的输出文件名"""timestamp = time.strftime("%Y%m%d_%H%M%S")return self.output_dir / f"recording_{timestamp}.wav"def save_as_wav(self, data, filename):"""将PCM数据保存为WAV文件"""try:with wave.open(str(filename), 'wb') as wav_file:wav_file.setnchannels(self.channels)wav_file.setsampwidth(self.sample_width)wav_file.setframerate(self.sample_rate)wav_file.writeframes(data)file_size = len(data)duration = file_size / (self.sample_rate * self.channels * self.sample_width)print(f"已保存: {filename} (时长: {duration:.2f}秒, 大小: {file_size}字节)")except Exception as e:print(f"保存WAV文件时出错: {e}")def monitor_pipe(self, silence_timeout=3.0, chunk_size=1024):"""监控命名管道并录制数据参数:silence_timeout: 静默超时时间(秒),超过此时间无数据则认为录制结束chunk_size: 每次读取的数据块大小"""print(f"开始监控命名管道: {self.pipe_path}")print(f"参数: 采样率={self.sample_rate}Hz, 声道数={self.channels}, 位深度={self.sample_width*8}bit")print(f"静默超时: {silence_timeout}秒")print("按 Ctrl+C 停止程序")last_data_time = Nonetry:while True:# 以二进制模式打开命名管道with open(self.pipe_path, 'rb') as pipe:print("检测到数据流,开始录制...")self.is_recording = Trueself.current_data = bytearray()last_data_time = time.time()try:while True:data = pipe.read(chunk_size)current_time = time.time()if data:self.current_data.extend(data)last_data_time = current_timeelse:# 检查是否超时if current_time - last_data_time > silence_timeout:print("检测到数据流结束")break# 短暂休眠避免CPU占用过高time.sleep(0.1)except BrokenPipeError:print("管道连接中断")# 保存录制的数据if len(self.current_data) > 0:filename = self.generate_filename()self.save_as_wav(bytes(self.current_data), filename)self.is_recording = Falseexcept KeyboardInterrupt:print("\n程序被用户中断")except Exception as e:print(f"监控过程中出错: {e}")def continuous_monitor(self, silence_timeout=3.0, chunk_size=1024):"""持续监控模式,每次数据流都会创建新的WAV文件"""print("进入持续监控模式...")self.monitor_pipe(silence_timeout, chunk_size)def signal_handler(sig, frame):"""处理Ctrl+C信号"""print('\n程序退出')sys.exit(0)def main():parser = argparse.ArgumentParser(description='从命名管道读取PCM数据并转换为WAV文件')parser.add_argument('--pipe', default='/tmp/VCM_Send', help='命名管道路径 (默认: /tmp/VCM_Send)')parser.add_argument('--output', default='./recordings', help='输出目录 (默认: ./recordings)')parser.add_argument('--timeout', type=float, default=3.0, help='静默超时时间(秒) (默认: 3.0)')parser.add_argument('--chunk-size', type=int, default=1024, help='读取块大小 (默认: 1024)')args = parser.parse_args()# 注册信号处理signal.signal(signal.SIGINT, signal_handler)# 创建转换器实例converter = PCMtoWAVConverter(pipe_path=args.pipe,output_dir=args.output,sample_rate=16000,channels=1,sample_width=2)# 开始监控converter.continuous_monitor(silence_timeout=args.timeout,chunk_size=args.chunk_size)if __name__ == "__main__":main()

使用方法

  1. 保存脚本

sudo chmod +x pcm_to_wav.py
  1. 运行程序

# 基本用法
python3 pcm_to_wav.py# 自定义参数
python3 pcm_to_wav.py --output /path/to/output --timeout 5.0 --chunk-size 2048
  1. 向管道发送数据测试

# 在一个终端运行采集程序
python3 pcm_to_wav.py# 在另一个终端发送测试数据
cat test.pcm > /tmp/VCM_Send

自动启动脚本(systemd服务)

创建systemd服务文件 /etc/systemd/system/pcm-recorder.service

[Unit]
Description=PCM to WAV Recorder
After=network.target[Service]
Type=simple
User=root
ExecStart=/usr/bin/python3 /path/to/pcm_to_wav.py --output /var/recordings --timeout 5.0
Restart=always
RestartSec=5[Install]
WantedBy=multi-user.target

启用服务:

sudo systemctl daemon-reload
sudo systemctl enable pcm-recorder.service
sudo systemctl start pcm-recorder.service

技术特点

  1. 自动结束检测:使用超时机制检测数据流结束

  2. 持续监控:程序会持续运行,每次数据流都会创建新的WAV文件

  3. 错误处理:完善的异常处理机制

  4. 灵活配置:支持命令行参数配置

  5. 文件命名:基于时间戳的自动文件命名

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/972644.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年11月GEO服务商综合评测:哪家服务效果更优?

本文基于2025年中国信通院行业公开数据和权威第三方Gartner报告,结合推荐对象参考内容,从专业能力、服务品质、技术实力等维度筛选10个推荐对象,旨在提供客观参考。 评选标准:科学维度下的全面审视 本次评选绝非主…

2025年11月GEO公司深度盘点:哪家强?TOP10热度榜权威揭晓

本文基于2025年中国信通院行业公开数据和权威第三方Gartner报告,结合推荐对象参考内容,从专业能力、服务品质、技术实力等维度筛选10个推荐对象,旨在提供客观参考。 评选标准:科学维度下的全面审视 本次评选绝非主…

2025年11月GEO服务商怎么选?终极对比TOP10推荐指南

本文基于2025年中国信通院行业公开数据和权威第三方Gartner报告,结合推荐对象参考内容,从专业能力、服务品质、技术实力等维度筛选10个推荐对象,旨在提供客观参考。 评选标准:科学维度下的全面审视 本次评选绝非主…

CF1863D-Two-Colored Dominoes

CF1863D-Two-Colored Dominoes 题目大意 你有一个 \(n*m\) 的棋盘,这些棋盘上有一些多米诺骨牌,每个骨牌覆盖相邻的两个格子,没有两个骨牌会重叠。 你要把这些骨牌涂上黑白两种颜色,并满足以下条件对于每个多米诺…

2025年11月GEO公司深度盘点:怎么选?十大服务商权威发布

本文基于2025年中国信通院行业公开数据和权威第三方Gartner报告,结合推荐对象参考内容,从专业能力、服务品质、技术实力等维度筛选10个推荐对象,旨在提供客观参考。 评选标准:科学维度下的全面审视 本次评选绝非主…

2025年11月GEO服务商怎么选?深度盘点TOP10专业解析

本文基于2025年中国信通院行业公开数据和权威第三方Gartner报告,结合推荐对象参考内容,从专业能力、服务品质、技术实力等维度筛选10个推荐对象,旨在提供客观参考。 评选标准:科学维度下的全面审视 本次评选绝非主…

docker-- 遇到服务无法访问,排查记录

在调试一个Docker容器时,我遇到了一个看似简单却容易让人困惑的小问题。记录下这个过程,希望能帮助遇到类似情况的朋友。问题背景 一开始是启动了 docker 里的一个服务,访问时页面显示拒绝连接但 docker 上确实是启…

4. 2025年11月GEO服务商深度盘点:十大专业机构对比分析与选择策略

本文基于2025年中国信通院行业公开数据和权威第三方Gartner报告,结合推荐对象参考内容,从专业能力、服务品质、技术实力等维度筛选10个推荐对象,旨在提供客观参考。 评选标准:科学维度下的全面审视 本次评选绝非主…

2025年11月GEO服务商选择指南:哪家好权威推荐

本文基于2025年中国信通院行业公开数据和权威第三方Gartner报告,结合推荐对象参考内容,从专业能力、服务品质、技术实力等维度筛选10个推荐对象,旨在提供客观参考。 评选标准:科学维度下的全面审视 本次评选绝非主…

2025年11月GEO服务商怎么选?终极对比TOP10评测报告

本文基于2025年中国信通院行业公开数据和权威第三方Gartner报告,结合推荐对象参考内容,从专业能力、服务品质、技术实力等维度筛选10个推荐对象,旨在提供客观参考。 评选标准:科学维度下的全面审视 本次评选绝非主…

苹果手机传文件到 windows 电脑

苹果手机传文件到 windows 电脑 同一局域网下 1. 创建新文件夹设置共享添加一个 everyone 用户,权限为:读取 / 写入,点击共享2. 找到并记录 ip 地址 注意:网络配置文件类型为 专用网络才可以共享 ipconfig:无限以…

飞书弹窗报错 Failed to load DLL from D:\installed_app\Feishu\app\frame.dll, System Error Code = 5

尝试了<以管理员身份运行飞书>、<检查frame.dll文件权限>、<重新安装飞书>和<卸载飞书>方法,都不好使。 最后安装到了C盘默认路径,就不报错了。 应该是飞书的bug。飞书官网的解决方法是:问…

Vision Transformer (ViT) 原理及解读

ViT论文中提到,因为Transformer模型在NLP领域得到了广泛的应用,并被证明效果非常好,那自然而然的想法是将其应用到图像领域里来。 然而直接将2维的图片按像素拉成1维,序列长度太长,所以ViT的解决思路是把一张图片…

2025.11.21

今天学习构建vue项目,并且将vue项目导入idea中

关于Git的多分支使用

多人协同开发过程中需要创建新的本地分支以避免和其他人产生冲突,记录一下操作内容: 创建并切换到新的本地分支 # 在主分支确保主分支更新 git checkout main git pull origin main# 创建并切换到新分支 git checkou…

高中数学核心素养记忆口诀,从简到难,方便您记忆和理解

高中数学六大核心素养是:数学抽象、逻辑推理、数学建模、直观想象、数学运算、数据分析。版本一:六字三言口诀(最简版) 抽推建模,直算分数。抽:数学抽象 推:逻辑推理 建模:数学建模 直:直观想象 算:数学运算…

杂题选做 25.11

上升序列有两个长度为 \(n\) 的单调不降序列 \(a,b\),你可以对 \(a\) 进行不超过 \(m\) 次操作: • 选择一个下标 \(i\) 和一个整数 \(x\),把 \(a_i\) 变成 \(a_i+x\)。这里 𝑥 可以是负数。 操作一次的代价为 \(…

【第8章 数据分析基础】让AI帮你可视化一个数据集

课本中的源码 http://qr.cmpedu.com/CmpBookResource/download_resource.do?id=179708 Step1. 问AI寻找一个自己想要可视化的数据库,比如北京大学处理的1998年的人民日报文章,其他数据库大家可以下载后,上传到boh…