我试图将音频文件截断30%,如果音频文件长4分钟,截断后应该大约72秒。我已经编写了下面的代码来做它但它只返回一个0字节的文件大小。请告诉我哪里出错了?
def loadFile():
with open('music.mp3', 'rb') as in_file:
data = len(in_file.read())
with open('output.mp3', 'wb') as out_file:
ndata = newBytes(data)
out_file.write(in_file.read()[:ndata])
def newBytes(bytes):
newLength = (bytes/100) * 30
return int(newLength)
loadFile()
答案 0 :(得分:2)
您试图再次读取您的文件,这将导致无数据,例如len(in_file.read()
。而是将整个文件读入变量,然后计算其长度。然后可以再次使用该变量。
def newBytes(bytes):
return (bytes * 70) / 100
def loadFile():
with open('music.mp3', 'rb') as in_file:
data = in_file.read()
with open('output.mp3', 'wb') as out_file:
ndata = newBytes(len(data))
out_file.write(data[:ndata])
最好先乘以然后除以避免必须使用浮点数。
答案 1 :(得分:0)
您无法按字节大小可靠地截断MP3文件,并且希望它在音频时间长度内等效截断。
MP3帧可以改变比特率。虽然你的方法会起作用,但它并不是那么准确。此外,您毫无疑问会破坏帧,在文件末尾留下毛刺。您还将丢失ID3v1标签(如果您仍然使用它们......最好还是使用ID3v2)。
考虑使用-acodec copy
执行FFmpeg。这将简单地复制字节,同时保持文件的完整性,并确保在您希望的地方进行良好的清理。