1

我已经在 Mac 上将名为 Python 的模块导入aifc到 Python 中,我正在运行 Python 3.3 和 Mac OS X 10.8.2。

我试图简单地将标记数据从一个 aifc 文件复制到另一个 aifc 文件。我可以成功打开第一个文件并读取标记数据,效果很好。但是当我打开第二个 aifc 文件时,该方法aifc.open("file2.aifc", 'w')会立即删除该文件的所有内容。所以我最终得到了一个带有正确标记但没有音乐的 aifc 文件!

我做了一些研究,发现使用 mode 打开文件时删除文件的内容是 Python 的正确行为'w'。我读过该模式'a'允许附加文件。但是,aifc.open()当我尝试 mode 时,该方法给了我一个错误'a',解释器说 mode 必须是"r" "rb" "w"or "wb"

因此我被困住了——也许这是一个旧图书馆,我应该使用不同的东西。

如果是这样,有人可以指导我如何在 Python 中访问 Apple Objective C 库来操作音频文件。我认为有一个名为 Audio File Services 的库,但我不清楚如何在 Python 中使用它。

虽然我不是编程新手,但我是 Python 新手,如果这些是新手问题,我深表歉意。

4

1 回答 1

1

我自己也遇到过这个!

辅助函数明确地将aifc.open模式限制为“r”、“rb”、“w”和“wb”。这个模块中的类(Aifc_readAifc_write)似乎分别仅用于读取现有的 AIFC 文件或从头开始创建全新的 AIFC 文件。

这是我使用此模块提出的可读+可写 AIFC 文件实用程序:

import aifc
import sys


class AIFC(aifc.Aifc_write, aifc.Aifc_read):

    def __init__(self, f):
        aifc.Aifc_write.initfp(self, f)
        aifc.Aifc_read.initfp(self, f)


if (__name__ == "__main__"):
    f = open(sys.argv[1], "rb+")
    a = AIFC(f)

    # read test
    print("%s channels, %s bits, %s Hz sampling rate, %s frames" %
          (a.getnchannels(), a.getsampwidth() * 8, a.getframerate(),
           a.getnframes()))

    # write ("identity") test
    data = a.readframes(a.getnframes())
    a.setpos(0)
    a.writeframes(data)
    a.close()   # f.close()

它尚未经过广泛测试,但似乎确实可以解决问题。我已经通过它运行了几个原始 AIF,它们都在 Audacity 中正确播放。

于 2013-03-14T01:41:55.507 回答