2

音声ファイルの変更について簡単な質問があります。入力ストリーム (デコードなど) を介してサンプルにアクセスできますが、その入力ストリーム内のサンプルを操作する方法がわかりません (複数のサンプルの場合である可能性があります)。
私が達成したいのは、ファイルEx A.mp3を取得し、そこから数秒を切り取り、最終的に新しいファイルに保存することです。

JavaSoundApiの例 を見ると、次の方法でファイルを作成できることがわかりました。

    File fileOut = new File(someNewPathName);
    AudioFileFormat.Type fileType = fileFormat.getType();
    if (AudioSystem.isFileTypeSupported(fileType,audioInputStream)) {
        AudioSystem.write(audioInputStream, fileType, fileOut);
    }
4

2 に答える 2

3

AudioInputStreamをそのサイズについてうそをつくだけにする必要があります。これを行うには、独自の AudioInputStream クラスを作成し、サウンド API (スケルトンのみ) から取得した通常の AudioInputStream への委譲を使用します。

public class CuttingAudioInputStream extends AudioInputStream {

    private AudioInputStream delegate;

    public CuttingAudioInputStream(AudioInputStream delegate) {
        this.delegate = delegate;
    }

    /**
     * Lie about length of delegate
     */
    public long getFrameLength() {
        // simple demo, make the caller think the stream is 44100 samples long
        return Math.min(delegate.getFrameLength(), 44100); 
    }

    // Overrides for all other methods of AudioInputStream, 
    // left as excercise to the reader
}

必要な制限に準拠するには、他のすべてのメソッドを実装する必要があります。途中の部分を切り取ることもできますが、read() メソッドではもう少し複雑です。

ただし、ソース/宛先が非可逆形式の場合 (たとえば、MP3 をデコードして再エンコードする場合)、このアプローチはオーディオ品質を低下させる可能性があることを指摘しなければなりません。品質の低下が許容できない場合 (同じストリームを複数回処理する場合にのみ問題になるはずです)、ファイルをデコードせずに、エンコードされたデータにカット プロセスを直接適用することをお勧めします。もちろん、これはより複雑です (処理したい各フォーマットを十分に理解する必要があります)。異なるフォーマットによってカットできる場所には制限があります。

于 2012-08-02T12:09:18.400 に答える
2

あなたのチュートリアルは Java 1.5 用です! より最新のバージョンがあります。

引用したページには、「サウンドファイルの読み取り」という見出しの下にいくつかのサンプルコードがあります。コメントのある領域に注意してください。

  // Here, do something useful with the audio data that's 
  // now in the audioBytes array...

これは、audioInputStream が読み取られる while ループ内にあります。この領域を通過するフレームを追跡すると、経過時間を計算できます。ロードされたデータは、バイト配列に保存できます。または、目的のフレーム内のデータは、audioInputStream を読み取り、TargetDataLine を実装するクラスの出力である可能性があります。私の記憶が正しければ、AudioSystem.write(...

圧縮データやwavを直接編集することについては知りません。Wav 形式は統一されておらず、ヘッダーも統一されていません。そのため、Java にストリームを読み取らせ、そのように公開されたデータを使用させます。

于 2012-08-02T19:44:52.890 に答える