波形写入功能不起作用,我做错了啥?

Posted

技术标签:

【中文标题】波形写入功能不起作用,我做错了啥?【英文标题】:wave write function not working, what am I doing wrong?波形写入功能不起作用,我做错了什么? 【发布时间】:2021-07-30 00:38:20 【问题描述】:

我正在尝试将充满 .wav 文件的文件夹的现有采样率减半。这是我发现的唯一方法,但它不起作用。读取部分工作正常,直到 f.close(),然后 wave.write 部分导致错误。

import wave
import contextlib
import os

for file_name in os.listdir(os.getcwd()):
    if file_name.endswith(".wav"):
        with contextlib.closing(wave.open(file_name, 'rb')) as f:
            rate = f.getframerate()
            new_rate = rate/2
            f.close()
            with contextlib.closing(wave.open(file_name, 'wb')) as f:
                rate = f.setframerate(new_rate)

这是我运行时的输出。

Traceback (most recent call last):
  File "C:\Users\hsash\OneDrive\Desktop\used AR1-20210513T223533Z-001 - Copy (2)\sounds\python code.py", line 36, in <module>
    rate = f.setframerate(new_rate)
  File "C:\Users\hsash\AppData\Local\Programs\Python\Python39\lib\contextlib.py", line 303, in __exit__
    self.thing.close()
  File "C:\Users\hsash\AppData\Local\Programs\Python\Python39\lib\wave.py", line 444, in close
    self._ensure_header_written(0)
  File "C:\Users\hsash\AppData\Local\Programs\Python\Python39\lib\wave.py", line 462, in _ensure_header_written
    raise Error('# channels not specified')
wave.Error: # channels not specified

【问题讨论】:

也许 setframerate 失败是因为你传递的是浮点数而不是整数? 对两个不同的open 调用使用两个不同的变量可能是个好主意。 @MarkRansom 我认为这并不重要。异常在不同的地方抛出,与事物的类型无关 【参考方案1】:

上面写着#channels not specified。当您打开要写入的波形文件时,python 将所有标头字段设置为零,而与文件的当前状态无关。

为了确保保存其他字段,您需要在第一次阅读时从旧文件中复制它们。

在下面的 sn-p 中,我使用 getparamssetparams 复制标题字段,我使用 readframeswriteframes 复制波形数据。

import wave
import contextlib
import os

for file_name in os.listdir(os.getcwd()):
    if file_name.endswith(".wav"):
        with contextlib.closing(wave.open(file_name, 'rb')) as f:
            rate = f.getframerate()
            params = f.getparams()

            frames = f.getnframes()
            data = f.readframes(frames)


            new_rate = rate/2
            f.close()
            with contextlib.closing(wave.open(file_name, 'wb')) as f:
                f.setparams(params)
                f.setframerate(new_rate)
                f.writeframes(data)

【讨论】:

以上是关于波形写入功能不起作用,我做错了啥?的主要内容,如果未能解决你的问题,请参考以下文章

为啥通知组在android中不起作用?我做错了啥?

我想在 android 应用程序中发布 geosever 层,使用 arcgis SDK,我已经完成了代码但它不起作用,请告诉我我做错了啥?

使用 API 不起作用,我在这里做错了啥?

Jumbotron 背景图像不起作用。我究竟做错了啥?

在 PHP 中,使用 DomDocument getElementByID 不起作用?我究竟做错了啥?

jquery delete parent 在整条线上都不起作用!我究竟做错了啥? [关闭]