wave.error: # 未指定频道
Posted
技术标签:
【中文标题】wave.error: # 未指定频道【英文标题】:wave.error: # channels not specified 【发布时间】:2017-12-09 20:04:38 【问题描述】:我正在尝试使用 wave 模块编辑 wav 文件的长度。但是,我似乎无处可去,因为我不断收到与未指定通道数相同的错误。尽管如此,当我写一些东西来查看通道数时,我仍然会收到该错误,或者当我尝试设置通道数时,如下所示:
def editLength(wavFile):
file = wave.open(wavFile, 'w')
file.setnchannels(file.getnchannels())
x = file.getnchannels()
print (x)
【问题讨论】:
你有没有想过这个问题?我遇到了同样的问题。 @TylerCrompton 也许你可以使用我的答案? @steviestickman, 拉了一会儿头发后,我发现我在错误的对象上调用了setnchannels()
。 :|
【参考方案1】:
来自https://docs.python.org/3.7/library/wave.html#wave.open
wave.open(file, mode=None)
If file is a string, open the file by that name, otherwise treat it as a file-like
object.
mode can be:
'rb' Read only mode.
'wb' Write only mode.
Note that it does not allow read/write WAV files.
您尝试从 WAV 文件中读取和写入,文件对象在第一个 file.getnchannels()
时已未指定通道数。
def editLength(wavFile):
with open(wavFile, "rb") as file:
x = file.getnchannels()
print(x)
如果你想编辑文件,你应该首先从原始文件中读取并写入临时文件。然后将临时文件复制到原始文件上。
【讨论】:
【参考方案2】:从文档中可能不是很明显:https://docs.python.org/3/library/wave.html
Wave_write 对象希望您明确设置对象的所有参数。
经过一些试验和错误后,我能够读取我的 wav 文件并将特定持续时间写入磁盘。
例如,如果我有一个具有 2 个通道的 44.1k 采样率 wav 文件...
import wave
with wave.open("some_wavfile.wav", "rb") as handle:
params = handle.getparams()
# only read the first 10 seconds of audio
frames = handle.readframes(441000)
print(handle.tell())
print(params)
params = list(params)
params[3] = len(frames)
print(params)
with wave.open("output_wavfile.wav", "wb") as handle:
handle.setparams(params)
handle.writeframes(frames)
这应该会给你留下一个看起来像这样的标准输出。
441000
_wave_params(nchannels=2, sampwidth=2, framerate=44100, nframes=10348480, comptype='NONE', compname='not compressed')
[2, 2, 44100, 1764000, 'NONE', 'not compressed']
这里的 nframes 是 1764000 可能是因为 nchannels=2 和 sampwidth=2,所以 1764000/4=441000(我猜) 奇怪的是,setparams 能够接受一个列表而不是一个元组。 ffprobe 为输出文件显示了 10 秒的音频,对我来说听起来很完美。
【讨论】:
以上是关于wave.error: # 未指定频道的主要内容,如果未能解决你的问题,请参考以下文章
PLC200,不知道为啥老是 提示未找到指定的访问点,请大神赐教