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,不知道为啥老是 提示未找到指定的访问点,请大神赐教

未发现数据源名称并且未指定默认驱动程序

未指定暗淡时图像未填充画布[重复]

未找到指定的sqlserver

当文件中明确指定 executionRoleArn 时,为啥我会收到关于未指定的错误?

如果未指定,则 argparse 存储 false