如何在Python中打开AIFC文件以将标记数据附加到文件中?

时间:2012-11-23 23:51:04

标签: python objective-c audio

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

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

我做了一些研究,发现当用文件'w'打开文件时,删除文件内容是Python的正确行为。我已经读过该模式'a'允许附加文件。但是,当我尝试使用模式aifc.open()时,'a'方法会出现错误,解释程序说该模式必须为"r" "rb" "w"或{{1} }。

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

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

虽然我不是编程的新手,但我是Python的新手,所以如果这些是新手问题就道歉。

1 个答案:

答案 0 :(得分: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中正确播放。