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-wave"><h1><span class="yiyi-st" id="yiyi-10">22.4. <a class="reference internal" href="#module-wave" title="wave: Provide an interface to the WAV sound format."><code class="xref py py-mod docutils literal"><span class="pre">wave</span></code></a> - 读取和写入WAV文件</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/wave.py">Lib / wave.py</a></span></p><p><span class="yiyi-st" id="yiyi-12"><a class="reference internal" href="#module-wave" title="wave: Provide an interface to the WAV sound format."><code class="xref py py-mod docutils literal"><span class="pre">wave</span></code></a>模块为WAV声音格式提供了一个方便的界面。</span><span class="yiyi-st" id="yiyi-13">它不支持压缩/解压缩,但它支持单声道/立体声。</span></p><p><span class="yiyi-st" id="yiyi-14"><a class="reference internal" href="#module-wave" title="wave: Provide an interface to the WAV sound format."><code class="xref py py-mod docutils literal"><span class="pre">wave</span></code></a>模块定义了以下函数和异常:</span></p><dl class="function"><dt id="wave.open"><span class="yiyi-st" id="yiyi-15"> <code class="descclassname">wave.</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-16">如果<em>文件</em>是字符串,请按该名称打开该文件,否则将其视为类文件对象。</span><span class="yiyi-st" id="yiyi-17"><em>模式</em>可以是:</span></p><dl class="docutils"><dt><span class="yiyi-st" id="yiyi-18"><code class="docutils literal"><span class="pre">'rb'</span></code></span></dt><dd><span class="yiyi-st" id="yiyi-19">只读模式。</span></dd><dt><span class="yiyi-st" id="yiyi-20"><code class="docutils literal"><span class="pre">'wb'</span></code></span></dt><dd><span class="yiyi-st" id="yiyi-21">只写模式。</span></dd></dl><p><span class="yiyi-st" id="yiyi-22">注意,它不允许读/写WAV文件。</span></p><p><span class="yiyi-st" id="yiyi-23">A <em>mode</em> of <code class="docutils literal"><span class="pre">'rb'</span></code> returns a <code class="xref py py-class docutils literal"><span class="pre">Wave_read</span></code> object, while a <em>mode</em> of <code class="docutils literal"><span class="pre">'wb'</span></code> returns a <code class="xref py py-class docutils literal"><span class="pre">Wave_write</span></code> object. </span><span class="yiyi-st" id="yiyi-24">如果省略<em>模式</em>且类似文件的对象作为<em>文件</em>传递,则<code class="docutils literal"><span class="pre">file.mode</span></code>用作<em>模式的默认值</em></span></p><p><span class="yiyi-st" id="yiyi-25">如果传入类似文件的对象,当调用<code class="xref py py-meth docutils literal"><span class="pre">close()</span></code>方法时wave对象不会关闭它它是调用者的责任关闭文件对象。</span></p><p><span class="yiyi-st" id="yiyi-26"><a class="reference internal" href="#wave.open" title="wave.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-27"><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="#wave.Wave_read.close" title="wave.Wave_read.close"><code class="xref py py-meth docutils literal"><span class="pre">Wave_read.close()</span></code></a><a class="reference internal" href="#wave.Wave_write.close" title="wave.Wave_write.close"><code class="xref py py-meth docutils literal"><span class="pre">Wave_write.close()</span></code></a>方法。</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-28"><span class="versionmodified">在版本3.4中更改:</span>添加了对不可查看文件的支持。</span></p></div></dd></dl><dl class="function"><dt id="wave.openfp"><span class="yiyi-st" id="yiyi-29"> <code class="descclassname">wave.</code><code class="descname">openfp</code><span class="sig-paren">(</span><em>file</em>, <em>mode</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-30">为维持向后兼容性的<a class="reference internal" href="#wave.open" title="wave.open"><code class="xref py py-func docutils literal"><span class="pre">open()</span></code></a>的同义词。</span></p></dd></dl><dl class="exception"><dt id="wave.Error"><span class="yiyi-st" id="yiyi-31"> <em class="property">exception </em><code class="descclassname">wave.</code><code class="descname">Error</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-32">当某些内容不可能因为它违反了WAV规范或者遇到实现缺陷时出现的错误。</span></p></dd></dl><div class="section" id="wave-read-objects"><h2><span class="yiyi-st" id="yiyi-33">22.4.1. </span><span class="yiyi-st" id="yiyi-34">Wave_read Objects</span></h2><p><span class="yiyi-st" id="yiyi-35"><a class="reference internal" href="#wave.open" title="wave.open"><code class="xref py py-func docutils literal"><span class="pre">open()</span></code></a>返回的Wave_read对象具有以下方法</span></p><dl class="method"><dt id="wave.Wave_read.close"><span class="yiyi-st" id="yiyi-36"> <code class="descclassname">Wave_read.</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-37">如果流由<a class="reference internal" href="#module-wave" title="wave: Provide an interface to the WAV sound format."><code class="xref py py-mod docutils literal"><span class="pre">wave</span></code></a>打开,请关闭流,并使实例不可用。</span><span class="yiyi-st" id="yiyi-38">这在对象容器上自动调用。</span></p></dd></dl><dl class="method"><dt id="wave.Wave_read.getnchannels"><span class="yiyi-st" id="yiyi-39"> <code class="descclassname">Wave_read.</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-40">返回音频通道数(对于单声道,<code class="docutils literal"><span class="pre">1</span></code>,对于立体声,<code class="docutils literal"><span class="pre">2</span></code>)。</span></p></dd></dl><dl class="method"><dt id="wave.Wave_read.getsampwidth"><span class="yiyi-st" id="yiyi-41"> <code class="descclassname">Wave_read.</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-42">返回样本宽度(以字节为单位)。</span></p></dd></dl><dl class="method"><dt id="wave.Wave_read.getframerate"><span class="yiyi-st" id="yiyi-43"> <code class="descclassname">Wave_read.</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-44">返回采样频率。</span></p></dd></dl><dl class="method"><dt id="wave.Wave_read.getnframes"><span class="yiyi-st" id="yiyi-45"> <code class="descclassname">Wave_read.</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-46">返回音频帧数。</span></p></dd></dl><dl class="method"><dt id="wave.Wave_read.getcomptype"><span class="yiyi-st" id="yiyi-47"> <code class="descclassname">Wave_read.</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-48">返回压缩类型(<code class="docutils literal"><span class="pre">'NONE'</span></code>是唯一支持的类型)。</span></p></dd></dl><dl class="method"><dt id="wave.Wave_read.getcompname"><span class="yiyi-st" id="yiyi-49"> <code class="descclassname">Wave_read.</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-50"><a class="reference internal" href="#wave.Wave_read.getcomptype" title="wave.Wave_read.getcomptype"><code class="xref py py-meth docutils literal"><span class="pre">getcomptype()</span></code></a>的人类可读版本。</span><span class="yiyi-st" id="yiyi-51">通常<code class="docutils literal"><span class="pre">'不是</span> <span class="pre">压缩的</span></code> parallels <code class="docutils literal"><span class="pre">'NONE'</span></code></span></p></dd></dl><dl class="method"><dt id="wave.Wave_read.getparams"><span class="yiyi-st" id="yiyi-52"> <code class="descclassname">Wave_read.</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-53">传回<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="wave.Wave_read.readframes"><span class="yiyi-st" id="yiyi-54"> <code class="descclassname">Wave_read.</code><code class="descname">readframes</code><span class="sig-paren">(</span><em>n</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-55">读取并返回最多<em>n</em>个音频帧,以字节为单位。</span></p></dd></dl><dl class="method"><dt id="wave.Wave_read.rewind"><span class="yiyi-st" id="yiyi-56"> <code class="descclassname">Wave_read.</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-57">将文件指针回滚到音频流的开头。</span></p></dd></dl><p><span class="yiyi-st" id="yiyi-58">为了与<a class="reference internal" href="aifc.html#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="method"><dt id="wave.Wave_read.getmarkers"><span class="yiyi-st" id="yiyi-59"> <code class="descclassname">Wave_read.</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-60">返回<code class="docutils literal"><span class="pre">None</span></code></span></p></dd></dl><dl class="method"><dt id="wave.Wave_read.getmark"><span class="yiyi-st" id="yiyi-61"> <code class="descclassname">Wave_read.</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-62">引发错误。</span></p></dd></dl><p><span class="yiyi-st" id="yiyi-63">以下两种方法定义术语“位置”,它们之间是兼容的,否则是实现相关的。</span></p><dl class="method"><dt id="wave.Wave_read.setpos"><span class="yiyi-st" id="yiyi-64"> <code class="descclassname">Wave_read.</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="wave.Wave_read.tell"><span class="yiyi-st" id="yiyi-66"> <code class="descclassname">Wave_read.</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></div><div class="section" id="wave-write-objects"><h2><span class="yiyi-st" id="yiyi-68">22.4.2. </span><span class="yiyi-st" id="yiyi-69">Wave_write Objects</span></h2><p><span class="yiyi-st" id="yiyi-70">对于可寻找的输出流,<code class="docutils literal"><span class="pre">wave</span></code>头将自动更新以反映实际写入的帧数。</span><span class="yiyi-st" id="yiyi-71">对于不可搜索的流,在写入第一帧数据时,<em>nframes</em>值必须准确。</span><span class="yiyi-st" id="yiyi-72">通过调用<a class="reference internal" href="#wave.Wave_write.setnframes" title="wave.Wave_write.setnframes"><code class="xref py py-meth docutils literal"><span class="pre">setnframes()</span></code></a><a class="reference internal" href="#wave.Wave_write.setparams" title="wave.Wave_write.setparams"><code class="xref py py-meth docutils literal"><span class="pre">setparams()</span></code></a>可以实现精确的<em>nframes</em>值与<a class="reference internal" href="#wave.Wave_write.close" title="wave.Wave_write.close"><code class="xref py py-meth docutils literal"><span class="pre">close()</span></code></a>,然后使用<a class="reference internal" href="#wave.Wave_write.writeframesraw" title="wave.Wave_write.writeframesraw"><code class="xref py py-meth docutils literal"><span class="pre">writeframesraw()</span></code></a>写入帧数据,或者通过调用<a class="reference internal" href="#wave.Wave_write.writeframes" title="wave.Wave_write.writeframes"><code class="xref py py-meth docutils literal"><span class="pre">writeframes()</span></code></a></span><span class="yiyi-st" id="yiyi-73">在后一种情况下,<a class="reference internal" href="#wave.Wave_write.writeframes" title="wave.Wave_write.writeframes"><code class="xref py py-meth docutils literal"><span class="pre">writeframes()</span></code></a>将在写入帧数据之前相应地计算数据中的帧数并设置<em>nframes</em></span></p><p><span class="yiyi-st" id="yiyi-74"><a class="reference internal" href="#wave.open" title="wave.open"><code class="xref py py-func docutils literal"><span class="pre">open()</span></code></a>返回的Wave_write对象具有以下方法</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-75"><span class="versionmodified">在版本3.4中更改:</span>添加了对不可查看文件的支持。</span></p></div><dl class="method"><dt id="wave.Wave_write.close"><span class="yiyi-st" id="yiyi-76"> <code class="descclassname">Wave_write.</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-77">请确保<em>nframes</em>正确,如果该文件已由<a class="reference internal" href="#module-wave" title="wave: Provide an interface to the WAV sound format."><code class="xref py py-mod docutils literal"><span class="pre">wave</span></code></a>打开,请关闭该文件。</span><span class="yiyi-st" id="yiyi-78">此方法在对象容器上调用。</span><span class="yiyi-st" id="yiyi-79">如果输出流不可寻址并且<em>nframes</em>与实际写入的帧数不匹配,它将引发异常。</span></p></dd></dl><dl class="method"><dt id="wave.Wave_write.setnchannels"><span class="yiyi-st" id="yiyi-80"> <code class="descclassname">Wave_write.</code><code class="descname">setnchannels</code><span class="sig-paren">(</span><em>n</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-81">设置通道数。</span></p></dd></dl><dl class="method"><dt id="wave.Wave_write.setsampwidth"><span class="yiyi-st" id="yiyi-82"> <code class="descclassname">Wave_write.</code><code class="descname">setsampwidth</code><span class="sig-paren">(</span><em>n</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-83">将样本宽度设置为<em>n</em>个字节。</span></p></dd></dl><dl class="method"><dt id="wave.Wave_write.setframerate"><span class="yiyi-st" id="yiyi-84"> <code class="descclassname">Wave_write.</code><code class="descname">setframerate</code><span class="sig-paren">(</span><em>n</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-85">将帧速率设置为<em>n</em></span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-86"><span class="versionmodified">在版本3.2中更改:</span>此方法的非积分输入四舍五入为最接近的整数。</span></p></div></dd></dl><dl class="method"><dt id="wave.Wave_write.setnframes"><span class="yiyi-st" id="yiyi-87"> <code class="descclassname">Wave_write.</code><code class="descname">setnframes</code><span class="sig-paren">(</span><em>n</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-88">将帧数设置为<em>n</em>。如果实际写入的帧数不同(如果输出流不可寻址,则此更新尝试将引发错误),这将稍后更改。</span></p></dd></dl><dl class="method"><dt id="wave.Wave_write.setcomptype"><span class="yiyi-st" id="yiyi-89"> <code class="descclassname">Wave_write.</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><span class="yiyi-st" id="yiyi-90">设置压缩类型和描述。</span><span class="yiyi-st" id="yiyi-91">此时,仅支持压缩类型<code class="docutils literal"><span class="pre">NONE</span></code>,表示无压缩。</span></p></dd></dl><dl class="method"><dt id="wave.Wave_write.setparams"><span class="yiyi-st" id="yiyi-92"> <code class="descclassname">Wave_write.</code><code class="descname">setparams</code><span class="sig-paren">(</span><em>tuple</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-93"><em>元组</em>应为<code class="docutils literal"><span class="pre">nchannels</span> <span class="pre">sampwidth</span> <span class="pre">framerate</span> <span class="pre">nframes t5 &gt; <span class="pre">comptype</span> <span class="pre">compname</span></span></code>,其值适用于<code class="xref py py-meth docutils literal"><span class="pre">set*()</span></code></span><span class="yiyi-st" id="yiyi-94">设置所有参数。</span></p></dd></dl><dl class="method"><dt id="wave.Wave_write.tell"><span class="yiyi-st" id="yiyi-95"> <code class="descclassname">Wave_write.</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-96">返回文件中的当前位置,对<a class="reference internal" href="#wave.Wave_read.tell" title="wave.Wave_read.tell"><code class="xref py py-meth docutils literal"><span class="pre">Wave_read.tell()</span></code></a><a class="reference internal" href="#wave.Wave_read.setpos" title="wave.Wave_read.setpos"><code class="xref py py-meth docutils literal"><span class="pre">Wave_read.setpos()</span></code></a>方法使用相同的免责声明。</span></p></dd></dl><dl class="method"><dt id="wave.Wave_write.writeframesraw"><span class="yiyi-st" id="yiyi-97"> <code class="descclassname">Wave_write.</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-98">写入音频帧,而不更正<em>nframes</em></span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-99"><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="wave.Wave_write.writeframes"><span class="yiyi-st" id="yiyi-100"> <code class="descclassname">Wave_write.</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-101">写入音频帧,并确保<em>nframes</em>正确。</span><span class="yiyi-st" id="yiyi-102">如果输出流不可查找,并且在写入<em>数据</em>后已写入的帧总数与<em>nframe</em>的先前设置的值不匹配,则将引发错误。 。</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-103"><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><p><span class="yiyi-st" id="yiyi-104">请注意,在调用<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>之后设置任何参数是无效的,任何尝试都会引发<a class="reference internal" href="#wave.Error" title="wave.Error"><code class="xref py py-exc docutils literal"><span class="pre">wave.Error</span></code></a></span></p></div></div></div>