Как исчезнуть WAV-файл в Java? - PullRequest
1 голос
/ 20 июня 2019

Эй, я написал программу, которая вырезает определенную область из файла WAV. Но я понял, что разрез очень твердый, поэтому я хотел, чтобы он постепенно исчезал. Моя проблема в том, что я понятия не имею, как добиться этого в Java, потому что я очень плохо знаком с библиотекой звуков из Java.

Может ли кто-нибудь дать подсказку или совет, как этого добиться, или совет для ресурса, где я могу найти ответ?

Вот код, который я написал раньше:

AudioInputStream in = null;
AudioInputStream out = null;

    File originalFile = new File(filePath);
    if (originalFile.exists() && originalFile.isFile())
        {
        File editedFile = new File(newPath);            
        try
            {
            in = AudioSystem.getAudioInputStream(originalFile);
            AudioFileFormat fileFormat = AudioSystem.getAudioFileFormat(originalFile);
            AudioFormat format = fileFormat.getFormat();

            int bytesPerSecond = format.getFrameSize() * (int) format.getFrameRate();
            in.skip(start * bytesPerSecond);
            long framesOfAudioToCopy = trackDuration * (int) format.getFrameRate();

            // out is the audiostream which contains the output wav file
            out = new AudioInputStream(in, format, framesOfAudioToCopy);

            // so I guess here would be the right place to fade the audio file
            // just before writing it to the disk

            AudioSystem.write(out, fileFormat.getType(), editedFile);

            System.out.println("Trimming done!");
            System.out.println();
            }
        catch (UnsupportedAudioFileException e)
            {
            errorMessage = e.getMessage();
            }
        catch (IOException e)
            {
            errorMessage = e.getMessage();
            }

1 Ответ

1 голос
/ 21 июня 2019

Вы можете попробовать использовать элементы управления, предоставленные в javax.sound.sampled, учебник здесь , но мне никогда не удавалось с ними повезти. По моему опыту, если они существуют для данной системы (зависит от ПК / ОС), проблемы все еще остаются, поскольку изменения объема происходят только на границах буфера.

Обратите внимание, что в самой последней части руководства предлагается непосредственное управление звуком. Для этого требуется несколько шагов.

1) получить отдельные байты звукового файла

Пример этого кода приведен в следующем уроке по Использование файлов и преобразователей формата , раздел «Чтение звуковых файлов». В этом примере кода обратите внимание на точку, где у нас есть комментарий, отмечающий точку, где был предоставлен доступ к отдельным байтам:

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

2) Конвертировать байты в PCM (зависит от формата аудио)

3) умножить на коэффициент объема

4) увеличить или уменьшить коэффициент (если он исчезает)

5) преобразовать PCM обратно в байты

6) упаковывать и отправлять через SourceDataLine (опять же, зависит от аудио формата)

Все шаги были описаны ранее более подробно в StackOverflow и должны быть доступны для поиска, хотя я не знаю, насколько легко будет найти их в этот момент.

Есть пара бесплатных библиотек, которые позволяют в реальном времени уменьшать громкость. Я написал AudioCue для этого (и частоту в реальном времени и панорамирование), а также есть TinySound .

PS Я с удовольствием отвечу на вопросы и приму предложения по улучшению презентации для библиотеки, которую я написал.

...