我在python中使用wave库试图将音频速度降低50%.我成功了,但只有在正确的渠道.在左声道中,它是一大堆静态的.
import wave,os,math
r=wave.open(r"C:\Users\A\My Documents\LiClipse Workspace\Audio
compression\Audio compression\aha.wav","r")
w=wave.open(r"C:\Users\A\My Documents\LiClipse Workspace\Audio
compression\Audio compression\ahaout.wav","w")
frames=r.readframes(r.getnframes())
newframes=bytearray()
w.setparams(r.getparams())
for i in range(0,len(frames)-1):
newframes.append(frames[i])
newframes.append(frames[i])
w.writeframesraw(newframes)
Run Code Online (Sandbox Code Playgroud)
为什么是这样?既然我只是复制和粘贴原始数据,我肯定无法生成静态?编辑:我一直在寻找年龄,我终于找到了一个有用的波形格式资源:http://soundfile.sapp.org/doc/WaveFormat/ 如果我想保留立体声,看起来我需要复制实际样本宽度为4倍.这是因为有两个通道,它们占用4个字节而不是2个.
`import wave
r=wave.open(r"C:\Users\A\My Documents\LiClipse Workspace\Audio
compression\Audio compression\aha.wav","r")
w=wave.open(r"C:\Users\A\My Documents\LiClipse Workspace\Audio
compression\Audio compression\ahaout.wav","w")
frames=r.readframes(r.getnframes())
newframes=bytearray()
w.setparams(r.getparams())
w.setframerate(r.getframerate())
print(r.getsampwidth())
for i in range(0,len(frames)-4,4):
newframes.append(frames[i])
newframes.append(frames[i+1])
newframes.append(frames[i+2])
newframes.append(frames[i+3])
newframes.append(frames[i])
newframes.append(frames[i+1])
newframes.append(frames[i+2])
newframes.append(frames[i+3])
w.writeframesraw(newframes)`
Run Code Online (Sandbox Code Playgroud)
编辑2:好吧我不知道是什么驱使我这样做但我已经享受它给我的自由了.我选择将wav文件复制到内存中,直接编辑副本,然后将其写入输出文件.我对结果非常满意.我可以导入一个wav,重复一次音频,并将其写入输出文件,仅需0.2秒.使用wav插件,使用我的旧代码将速度降低一半现在只需要9秒而不是30秒以上这里是代码,仍然有点未优化我想但它比它更好.
import struct
import time as t
t.clock()
r=open(r"C:/Users/apier/Documents/LiClipse Workspace/audio editing
software/main/aha.wav","rb")
w=open(r"C:/Users/apier/Documents/LiClipse Workspace/audio editing
software/main/output.wav","wb")
rbuff=bytearray(r.read())
def replacebytes(array,bites,stop):
length=len(bites)
start=stop-length
for …Run Code Online (Sandbox Code Playgroud) 违规代码:
public JWave(String s){
this.f = new File(s);
try{
/**if(!this.f.exists()){
this.f.createNewFile();
}*/
this.datafis = new FileInputStream(f);
this.datafos = new FileOutputStream(f);
//datafis.skip(44);
}catch(IOException e){
System.out.println(e.toString());
}
//generateAttributes();
}
Run Code Online (Sandbox Code Playgroud)
和测试文件:
public class testFile{
public static void main(String[] args){
JWave j = new JWave("harm.wav");
//System.out.println(j.getAttributes());
j.close();
}
}
Run Code Online (Sandbox Code Playgroud)
还有github repo:https://github.com/Donald-Tho/JWave harm.wav是一个工作的wav文件,之前是600 KB,之后是0 KB.
为了说清楚,当我调用构造函数,然后关闭流后,它会删除文件,即使我没有明确地告诉它.所需的行为是保持文件完好无损.
我在github仓库中有测试文件,wav文件和JWave文件,以便于访问.