2017-10-09 4 views
1

オーディオファイルを30%切り捨てようとしていますが、オーディオファイルの長さが4分の場合、切り捨てた後、約72秒になります。私はそれを行うには、以下のコードを書いたが、それは0バイトのファイルサイズを返します。どこが間違っていたのか教えてください。どのようにしてMP3オーディオファイルを30%切り捨てることができますか?

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() 

答えて

2

あなたのファイルをもう一度読み込もうとしています。その結果、データは表示されません。 len(in_file.read()。代わりに、ファイル全体を変数に読み込み、その長さを計算します。この変数は、2回目に使用することができます。

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]) 

また、浮動小数点数を扱う必要がないように、最初に乗算してから除算する方がよいです。

+0

ありがとうございました。 – answerSeeker

0

MP3ファイルをバイトサイズで確実に切り捨てることはできません。また、オーディオ時間の長さで切り捨てられることはありません。

MP3フレームはビットレートを変更できます。あなたの方法は、仕事の並べ替えをしますが、それはすべて正確ではありません。さらに、間違いなく、フレームの終わりにグリッチを残してフレームを破棄します。 ID3v1タグも失われます(ID3v1をまだ使用している場合は...とにかくID3v2を使用する方がよい)。

代わりに-acodec copyでFFmpegを実行することを検討してください。これにより、ファイルの整合性を維持しながらバイトをコピーし、必要な場所で良好なクリーンカットを確保します。

関連する問題