2019-04-08 23:22:26 +08:00

1 line
21 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<div class="body" role="main"><div class="section" id="module-aifc"><h1><span class="yiyi-st" id="yiyi-10">22.2. <a class="reference internal" href="#module-aifc" title="aifc: Read and write audio files in AIFF or AIFC format."><code class="xref py py-mod docutils literal"><span class="pre">aifc</span></code></a> - 读取和写入AIFF和AIFC文件</span></h1><p><span class="yiyi-st" id="yiyi-11"><strong>源代码:</strong> <a class="reference external" href="https://hg.python.org/cpython/file/3.5/Lib/aifc.py">Lib / aifc.py</a></span></p><p><span class="yiyi-st" id="yiyi-12">此模块支持读写AIFF和AIFF-C文件。</span><span class="yiyi-st" id="yiyi-13">AIFF是音频交换文件格式用于将数字音频样本存储在文件中的格式。</span><span class="yiyi-st" id="yiyi-14">AIFF-C是包括压缩音频数据的能力的格式的较新版本。</span></p><div class="admonition note"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-15">注意</span></p><p class="last"><span class="yiyi-st" id="yiyi-16">一些操作只能在IRIX下工作在尝试导入<code class="xref py py-mod docutils literal"><span class="pre">cl</span></code>模块时,这些将引发<a class="reference internal" href="exceptions.html#ImportError" title="ImportError"><code class="xref py py-exc docutils literal"><span class="pre">ImportError</span></code></a>该模块仅在IRIX上可用。</span></p></div><p><span class="yiyi-st" id="yiyi-17">音频文件具有描述音频数据的多个参数。</span><span class="yiyi-st" id="yiyi-18">采样率或帧率是声音被采样的每秒的次数。</span><span class="yiyi-st" id="yiyi-19">通道数指示音频是单声道,立体声还是四声道。</span><span class="yiyi-st" id="yiyi-20">每个帧由每个通道一个样本组成。</span><span class="yiyi-st" id="yiyi-21">样本大小是每个样本的字节大小。</span><span class="yiyi-st" id="yiyi-22">Thus a frame consists of <code class="docutils literal"><span class="pre">nchannels</span> <span class="pre">*</span> <span class="pre">samplesize</span></code> bytes, and a seconds worth of audio consists of <code class="docutils literal"><span class="pre">nchannels</span> <span class="pre">*</span> <span class="pre">samplesize</span> <span class="pre">*</span> <span class="pre">framerate</span></code> bytes.</span></p><p><span class="yiyi-st" id="yiyi-23">例如CD质量音频具有两个字节16位的样本大小使用两个声道立体声并且具有44,100帧/秒的帧速率。</span><span class="yiyi-st" id="yiyi-24">这给出了4字节2 * 2的帧大小并且第二值的占用2 * 2 * 44100字节176,400字节</span></p><p><span class="yiyi-st" id="yiyi-25">模块<a class="reference internal" href="#module-aifc" title="aifc: Read and write audio files in AIFF or AIFC format."><code class="xref py py-mod docutils literal"><span class="pre">aifc</span></code></a>定义了以下函数:</span></p><dl class="function"><dt id="aifc.open"><span class="yiyi-st" id="yiyi-26"> <code class="descclassname">aifc.</code><code class="descname">open</code><span class="sig-paren">(</span><em>file</em>, <em>mode=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-27">打开AIFF或AIFF-C文件并返回对象实例方法如下所述。</span><span class="yiyi-st" id="yiyi-28">参数<em>文件</em>是命名文件的字符串或<a class="reference internal" href="../glossary.html#term-file-object"><span class="xref std std-term">file object</span></a></span><span class="yiyi-st" id="yiyi-29">当文件必须打开以便读取时,<em>mode</em>必须为<code class="docutils literal"><span class="pre">'r'</span></code><code class="docutils literal"><span class="pre">'rb'</span></code>,或<code class="docutils literal"><span class="pre">'w'</span></code> &gt;<code class="docutils literal"><span class="pre">'wb'</span></code>当文件必须打开才能写入。</span><span class="yiyi-st" id="yiyi-30">如果省略,则使用<code class="docutils literal"><span class="pre">file.mode</span></code>(如果存在),否则使用<code class="docutils literal"><span class="pre">'rb'</span></code></span><span class="yiyi-st" id="yiyi-31">当用于写入时,文件对象应该是可搜索的,除非你提前知道要写多少个样本,并使用<code class="xref py py-meth docutils literal"><span class="pre">writeframesraw()</span></code><code class="xref py py-meth docutils literal"><span class="pre">setnframes()</span></code></span><span class="yiyi-st" id="yiyi-32"><a class="reference internal" href="#aifc.open" title="aifc.open"><code class="xref py py-func docutils literal"><span class="pre">open()</span></code></a>函数可以在<a class="reference internal" href="../reference/compound_stmts.html#with"><code class="xref std std-keyword docutils literal"><span class="pre">with</span></code></a>语句中使用。</span><span class="yiyi-st" id="yiyi-33"><a class="reference internal" href="../reference/compound_stmts.html#with"><code class="xref std std-keyword docutils literal"><span class="pre">with</span></code></a>块完成时,调用<a class="reference internal" href="#aifc.aifc.close" title="aifc.aifc.close"><code class="xref py py-meth docutils literal"><span class="pre">close()</span></code></a>方法。</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-34"><span class="versionmodified">在版本3.4中已更改:</span>添加了对<a class="reference internal" href="../reference/compound_stmts.html#with"><code class="xref std std-keyword docutils literal"><span class="pre">with</span></code></a>语句的支持。</span></p></div></dd></dl><p><span class="yiyi-st" id="yiyi-35">当打开文件以进行读取时,<a class="reference internal" href="#aifc.open" title="aifc.open"><code class="xref py py-func docutils literal"><span class="pre">open()</span></code></a>返回的对象具有以下方法:</span></p><dl class="method"><dt id="aifc.aifc.getnchannels"><span class="yiyi-st" id="yiyi-36"> <code class="descclassname">aifc.</code><code class="descname">getnchannels</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-37">返回音频通道数单声道为1立体声为2</span></p></dd></dl><dl class="method"><dt id="aifc.aifc.getsampwidth"><span class="yiyi-st" id="yiyi-38"> <code class="descclassname">aifc.</code><code class="descname">getsampwidth</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-39">返回单个样本的字节大小。</span></p></dd></dl><dl class="method"><dt id="aifc.aifc.getframerate"><span class="yiyi-st" id="yiyi-40"> <code class="descclassname">aifc.</code><code class="descname">getframerate</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-41">返回采样率(每秒音频帧数)。</span></p></dd></dl><dl class="method"><dt id="aifc.aifc.getnframes"><span class="yiyi-st" id="yiyi-42"> <code class="descclassname">aifc.</code><code class="descname">getnframes</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-43">返回文件中的音频帧数。</span></p></dd></dl><dl class="method"><dt id="aifc.aifc.getcomptype"><span class="yiyi-st" id="yiyi-44"> <code class="descclassname">aifc.</code><code class="descname">getcomptype</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-45">返回一个长度为4的字节数组描述音频文件中使用的压缩类型。</span><span class="yiyi-st" id="yiyi-46">对于AIFF文件返回的值为<code class="docutils literal"><span class="pre">b'NONE'</span></code></span></p></dd></dl><dl class="method"><dt id="aifc.aifc.getcompname"><span class="yiyi-st" id="yiyi-47"> <code class="descclassname">aifc.</code><code class="descname">getcompname</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-48">返回一个字节数组可转换为音频文件中使用的压缩类型的人类可读的描述。</span><span class="yiyi-st" id="yiyi-49">对于AIFF文件返回的值为<code class="docutils literal"><span class="pre">b'not</span> <span class="pre">compressed'</span></code></span></p></dd></dl><dl class="method"><dt id="aifc.aifc.getparams"><span class="yiyi-st" id="yiyi-50"> <code class="descclassname">aifc.</code><code class="descname">getparams</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-51">传回<a class="reference internal" href="collections.html#collections.namedtuple" title="collections.namedtuple"><code class="xref py py-func docutils literal"><span class="pre">namedtuple()</span></code></a> <code class="docutils literal"><span class="pre">nchannels</span> <span class="pre">sampwidth</span> <span class="pre">framerate</span> <span class="pre">nframes t7&gt; <span class="pre">comptype</span> <span class="pre">compname</span></span></code>,相当于<code class="xref py py-meth docutils literal"><span class="pre">get*()</span></code></span></p></dd></dl><dl class="method"><dt id="aifc.aifc.getmarkers"><span class="yiyi-st" id="yiyi-52"> <code class="descclassname">aifc.</code><code class="descname">getmarkers</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-53">返回音频文件中的标记列表。</span><span class="yiyi-st" id="yiyi-54">标记由三个元素的元组组成。</span><span class="yiyi-st" id="yiyi-55">第一个是标记ID整数第二个是从数据开始的标记位置整数第三个是标记的名称字符串</span></p></dd></dl><dl class="method"><dt id="aifc.aifc.getmark"><span class="yiyi-st" id="yiyi-56"> <code class="descclassname">aifc.</code><code class="descname">getmark</code><span class="sig-paren">(</span><em>id</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-57">按照<a class="reference internal" href="#aifc.aifc.getmarkers" title="aifc.aifc.getmarkers"><code class="xref py py-meth docutils literal"><span class="pre">getmarkers()</span></code></a>中描述的返回元组,以获取给定的<em>id</em>的标记。</span></p></dd></dl><dl class="method"><dt id="aifc.aifc.readframes"><span class="yiyi-st" id="yiyi-58"> <code class="descclassname">aifc.</code><code class="descname">readframes</code><span class="sig-paren">(</span><em>nframes</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-59">读取并返回音频文件中的下一个<em>nframes</em>帧。</span><span class="yiyi-st" id="yiyi-60">返回的数据是一个字符串,包含每个帧的所有通道的未压缩样本。</span></p></dd></dl><dl class="method"><dt id="aifc.aifc.rewind"><span class="yiyi-st" id="yiyi-61"> <code class="descclassname">aifc.</code><code class="descname">rewind</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-62">回滚读指针。</span><span class="yiyi-st" id="yiyi-63">下一个<a class="reference internal" href="#aifc.aifc.readframes" title="aifc.aifc.readframes"><code class="xref py py-meth docutils literal"><span class="pre">readframes()</span></code></a>将从头开始。</span></p></dd></dl><dl class="method"><dt id="aifc.aifc.setpos"><span class="yiyi-st" id="yiyi-64"> <code class="descclassname">aifc.</code><code class="descname">setpos</code><span class="sig-paren">(</span><em>pos</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-65">查找指定的帧编号。</span></p></dd></dl><dl class="method"><dt id="aifc.aifc.tell"><span class="yiyi-st" id="yiyi-66"> <code class="descclassname">aifc.</code><code class="descname">tell</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-67">返回当前帧编号。</span></p></dd></dl><dl class="method"><dt id="aifc.aifc.close"><span class="yiyi-st" id="yiyi-68"> <code class="descclassname">aifc.</code><code class="descname">close</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-69">关闭AIFF文件。</span><span class="yiyi-st" id="yiyi-70">调用此方法后,对象将无法再使用。</span></p></dd></dl><p><span class="yiyi-st" id="yiyi-71">除了<code class="xref py py-meth docutils literal"><span class="pre">readframes()</span></code><code class="xref py py-meth docutils literal"><span class="pre">setpos()</span></code>之外,当文件打开以进行写入时,<a class="reference internal" href="#aifc.open" title="aifc.open"><code class="xref py py-func docutils literal"><span class="pre">open()</span></code></a>返回的对象具有上述所有方法。</span><span class="yiyi-st" id="yiyi-72">此外,存在以下方法。</span><span class="yiyi-st" id="yiyi-73">只有在相应的<code class="xref py py-meth docutils literal"><span class="pre">set*()</span></code>方法被调用后,才能调用<code class="xref py py-meth docutils literal"><span class="pre">get*()</span></code>方法。</span><span class="yiyi-st" id="yiyi-74">在第一个<code class="xref py py-meth docutils literal"><span class="pre">writeframes()</span></code><code class="xref py py-meth docutils literal"><span class="pre">writeframesraw()</span></code>之前,必须填入除帧数之外的所有参数。</span></p><dl class="method"><dt id="aifc.aifc.aiff"><span class="yiyi-st" id="yiyi-75"> <code class="descclassname">aifc.</code><code class="descname">aiff</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-76">创建AIFF文件。</span><span class="yiyi-st" id="yiyi-77">默认值是创建AIFF-C文件除非文件名以<code class="docutils literal"><span class="pre">'.aiff'</span></code>结尾默认值为AIFF文件。</span></p></dd></dl><dl class="method"><dt id="aifc.aifc.aifc"><span class="yiyi-st" id="yiyi-78"> <code class="descclassname">aifc.</code><code class="descname">aifc</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-79">创建AIFF-C文件。</span><span class="yiyi-st" id="yiyi-80">默认值是创建AIFF-C文件除非文件名以<code class="docutils literal"><span class="pre">'.aiff'</span></code>结尾默认值为AIFF文件。</span></p></dd></dl><dl class="method"><dt id="aifc.aifc.setnchannels"><span class="yiyi-st" id="yiyi-81"> <code class="descclassname">aifc.</code><code class="descname">setnchannels</code><span class="sig-paren">(</span><em>nchannels</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-82">指定音频文件中的通道数。</span></p></dd></dl><dl class="method"><dt id="aifc.aifc.setsampwidth"><span class="yiyi-st" id="yiyi-83"> <code class="descclassname">aifc.</code><code class="descname">setsampwidth</code><span class="sig-paren">(</span><em>width</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-84">指定音频采样的大小(以字节为单位)。</span></p></dd></dl><dl class="method"><dt id="aifc.aifc.setframerate"><span class="yiyi-st" id="yiyi-85"> <code class="descclassname">aifc.</code><code class="descname">setframerate</code><span class="sig-paren">(</span><em>rate</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-86">以每秒帧数指定采样频率。</span></p></dd></dl><dl class="method"><dt id="aifc.aifc.setnframes"><span class="yiyi-st" id="yiyi-87"> <code class="descclassname">aifc.</code><code class="descname">setnframes</code><span class="sig-paren">(</span><em>nframes</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-88">指定要写入音频文件的帧数。</span><span class="yiyi-st" id="yiyi-89">如果此参数未设置,或未正确设置,则文件需要支持搜索。</span></p></dd></dl><dl class="method"><dt id="aifc.aifc.setcomptype"><span class="yiyi-st" id="yiyi-90"> <code class="descclassname">aifc.</code><code class="descname">setcomptype</code><span class="sig-paren">(</span><em>type</em>, <em>name</em><span class="sig-paren">)</span></span></dt><dd><p id="index-1"><span class="yiyi-st" id="yiyi-91">指定压缩类型。</span><span class="yiyi-st" id="yiyi-92">如果未指定,音频数据将不会被压缩。</span><span class="yiyi-st" id="yiyi-93">在AIFF文件中压缩是不可能的。</span><span class="yiyi-st" id="yiyi-94">name参数应该是压缩类型的人为可读描述作为字节数组type参数应该是长度为4的字节数组。</span><span class="yiyi-st" id="yiyi-95">目前支持以下压缩类型:<code class="docutils literal"><span class="pre">b'NONE'</span></code><code class="docutils literal"><span class="pre">b'ULAW'</span></code><code class="docutils literal"><span class="pre">b'ALAW'</span></code><code class="docutils literal"><span class="pre">b'G722'</span></code></span></p></dd></dl><dl class="method"><dt id="aifc.aifc.setparams"><span class="yiyi-st" id="yiyi-96"> <code class="descclassname">aifc.</code><code class="descname">setparams</code><span class="sig-paren">(</span><em>nchannels</em>, <em>sampwidth</em>, <em>framerate</em>, <em>comptype</em>, <em>compname</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-97">同时设置所有上述参数。</span><span class="yiyi-st" id="yiyi-98">参数是由各种参数组成的元组。</span><span class="yiyi-st" id="yiyi-99">这意味着可以使用<a class="reference internal" href="#aifc.aifc.getparams" title="aifc.aifc.getparams"><code class="xref py py-meth docutils literal"><span class="pre">getparams()</span></code></a>调用的结果作为<a class="reference internal" href="#aifc.aifc.setparams" title="aifc.aifc.setparams"><code class="xref py py-meth docutils literal"><span class="pre">setparams()</span></code></a>的参数。</span></p></dd></dl><dl class="method"><dt id="aifc.aifc.setmark"><span class="yiyi-st" id="yiyi-100"> <code class="descclassname">aifc.</code><code class="descname">setmark</code><span class="sig-paren">(</span><em>id</em>, <em>pos</em>, <em>name</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-101">添加具有给定id大于0的标记并在给定位置添加给定名称。</span><span class="yiyi-st" id="yiyi-102">此方法可以在<a class="reference internal" href="#aifc.aifc.close" title="aifc.aifc.close"><code class="xref py py-meth docutils literal"><span class="pre">close()</span></code></a>之前的任何时间调用。</span></p></dd></dl><dl class="method"><dt><span class="yiyi-st" id="yiyi-103"> <code class="descclassname">aifc.</code><code class="descname">tell</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-104">返回输出文件中的当前写入位置。</span><span class="yiyi-st" id="yiyi-105"><a class="reference internal" href="#aifc.aifc.setmark" title="aifc.aifc.setmark"><code class="xref py py-meth docutils literal"><span class="pre">setmark()</span></code></a>结合使用。</span></p></dd></dl><dl class="method"><dt id="aifc.aifc.writeframes"><span class="yiyi-st" id="yiyi-106"> <code class="descclassname">aifc.</code><code class="descname">writeframes</code><span class="sig-paren">(</span><em>data</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-107">将数据写入输出文件。</span><span class="yiyi-st" id="yiyi-108">此方法只能在音频文件参数设置后调用。</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-109"><span class="versionmodified">在版本3.4中更改:</span>现在接受任何<a class="reference internal" href="../glossary.html#term-bytes-like-object"><span class="xref std std-term">bytes-like object</span></a></span></p></div></dd></dl><dl class="method"><dt id="aifc.aifc.writeframesraw"><span class="yiyi-st" id="yiyi-110"> <code class="descclassname">aifc.</code><code class="descname">writeframesraw</code><span class="sig-paren">(</span><em>data</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-111"><a class="reference internal" href="#aifc.aifc.writeframes" title="aifc.aifc.writeframes"><code class="xref py py-meth docutils literal"><span class="pre">writeframes()</span></code></a>,除了音频文件的头没有更新。</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-112"><span class="versionmodified">在版本3.4中更改:</span>现在接受任何<a class="reference internal" href="../glossary.html#term-bytes-like-object"><span class="xref std std-term">bytes-like object</span></a></span></p></div></dd></dl><dl class="method"><dt><span class="yiyi-st" id="yiyi-113"> <code class="descclassname">aifc.</code><code class="descname">close</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-114">关闭AIFF文件。</span><span class="yiyi-st" id="yiyi-115">文件的头部被更新以反映音频数据的实际大小。</span><span class="yiyi-st" id="yiyi-116">调用此方法后,对象将无法再使用。</span></p></dd></dl></div></div>