Как можно наложить одну аудиозапись mp3 на другую в Node.js?

Как добавить watermark к загружаемым трекам на сервере node.js с использованием ffmpeg?

В моем коде я использовал ffmpeg для добавления watermark. Однако, возникает ошибка:

node:internal/process/promises:289
            triggerUncaughtException(err, true /* fromPromise */);
            ^

[UnhandledPromiseRejection: This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). The promise rejected with
 the reason "#<Object>".] {
  code: 'ERR_UNHANDLED_REJECTION'
}

Как можно исправить данную ошибку и смешать звуки?
  • 26 октября 2023 г. 8:29
Ответы на вопрос 1
Ошибка, с которой вы столкнулись, связана с неправильным обработчиком отклоненного promise. Для того чтобы исправить эту ошибку и наложить одну аудиозапись на другую в Node.js с использованием ffmpeg, вам нужно добавить обработчик отклоненного promise. 

Вот пример кода, который позволяет наложить одну аудиозапись mp3 на другую при помощи ffmpeg:

```javascript
const ffmpeg = require('fluent-ffmpeg');

const mainAudioPath = 'path/to/main/audio.mp3';
const watermarkAudioPath = 'path/to/watermark/audio.mp3';
const outputFilePath = 'path/to/output/file.mp3';

ffmpeg()
  .input(mainAudioPath)
  .input(watermarkAudioPath)
  .complexFilter([
    '[0:a]volume=1[a0]', // громкость основной аудиозаписи
    '[1:a]volume=0.5[a1]', // громкость ватермарка
    '[a0][a1]amix=inputs=2:duration=first:dropout_transition=3'
  ])
  .output(outputFilePath)
  .on('end', () => {
    console.log('Микширование аудио успешно завершено');
  })
  .on('error', (err) => {
    console.error('Ошибка при микшировании аудио:', err);
  })
  .run();
```

В этом примере мы используем пакет `fluent-ffmpeg`, который предоставляет удобный интерфейс для работы с ffmpeg из Node.js. Мы указываем пути к основной аудиозаписи (`mainAudioPath`), водяному знаку (`watermarkAudioPath`) и файлу, в который сохранится результирующая аудиозапись (`outputFilePath`).

В строке `complexFilter` мы создаем комплексный фильтр для ffmpeg, который объединяет два аудиопотока: громкость основной аудиозаписи (`a0`) и громкость ватермарка (`a1`). Фильтр `amix` объединяет два аудиопотока в один, применяя переход в начале исходной аудиозаписи и dropout на протяжении 3 секунд.

После завершения микширования, в консоль будет выведено сообщение "Микширование аудио успешно завершено". Если произойдет ошибка, будет выведено сообщение "Ошибка при микшировании аудио", а также информация об ошибке.

Убедитесь, что у вас установлен ffmpeg на вашем сервере и все необходимые пакеты для работы с ffmpeg в Node.js.
Похожие вопросы