mirror of
https://github.com/fofolee/uTools-Manuals.git
synced 2025-06-08 23:14:06 +08:00
1 line
21 KiB
HTML
1 line
21 KiB
HTML
<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> <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 > <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> |