На моем внутреннем Node-сервере я пытаюсь прочитать поток онлайн-радиостанции и сохранить звук в виде файла на своем компьютере. Поскольку у потоков нет начала и конца, я выбираю запись произвольного значения в 5 секунд.
Для этой проблемы я использую npm-пакет fluent-ffmpeg для оболочки ffmpeg. Кроме того, пакет npm @ffmpeg-installer/ffmpeg указывает на каталог моего локального двоичного файла ffmpeg. В качестве входного потока я читаю 89 FM - A Rádio Rock , радио из Сан-Паулу, Бразилия, трансляция доступна по адресу http://26593.live.streamtheworld.com/RADIO_89FMAAC.aac
Вот код, который я собрал:
import ffmpeg from "fluent-ffmpeg"
import ffmpegInstaller from "@ffmpeg-installer/ffmpeg"
ffmpeg.setFfmpegPath(ffmpegInstaller.path);
console.info(ffmpegInstaller.path)
console.info(ffmpegInstaller.url)
console.info(ffmpegInstaller.version)
const pathInput = "http://26593.live.streamtheworld.com/RADIO_89FMAAC.aac"
// const pathInput = "./tmp/demo.avi"
const pathOutput = "./tmp/output.m4a"
ffmpeg()
.input(pathInput)
.duration(5)
.save(pathOutput)
.on("start", function(command) {
console.info("Spawned Ffmpeg with command: " + command)
})
.on("error", function (err) {
console.info("An error occurred: " + err.message)
})
.on("end", async function () {
console.info("Processing finished!")
})
На моей локальной машине (Mac, работающей под управлением darwin-x64) программа выводит ОК:
/.../node_modules/@ffmpeg-installer/darwin-x64/ffmpeg
https://evermeet.cx/ffmpeg/
92718-g092cb17983
Spawned Ffmpeg with command: ffmpeg -i http://26593.live.streamtheworld.com/RADIO_89FMAAC.aac -y -t 5 ./tmp/record.m4a
Processing finished!
В моем докер-контейнере (linux-x64), который мне нужен для развертывания проекта, ffmpeg возвращает ошибку:
/usr/app/node_modules/@ffmpeg-installer/linux-x64/ffmpeg
https://www.johnvansickle.com/ffmpeg/
20181210-g0e8eb07980
Spawned Ffmpeg with command: ffmpeg -i http://26593.live.streamtheworld.com/RADIO_89FMAAC.aac -y -t 5 ./tmp/output.m4a
main-1 | An error occurred: ffmpeg exited with code 1: http://26593.live.streamtheworld.com/RADIO_89FMAAC.aac: Input/output error
Dockerfile для контейнера:
FROM node:alpine
WORKDIR /usr/app
COPY package*.json ./
# Install ffmpeg in the container:
RUN apk update
RUN apk add ffmpeg
RUN npm install
COPY . .
CMD [ "npm", "run", "dev" ]
Наблюдение: эта ошибка, похоже, возникает только для потока -> сохранения файла. При использовании в качестве входных данных пути из локального файла .avi (таким образом, при преобразовании из .avi в .m4a) версии localhost и docker работают нормально.
Кто-нибудь знает, почему эта ошибка возникает в этой версии? Или как я могу запустить команду ffmpeg на стороне сервера в контейнере докеров для записи радиопотока?


При создании контейнера для запуска FFmpeg для создания миниатюр и образцов из видео я обнаружил, что версия FFmpeg для Alpine имеет «отсутствующие функции» (другие или меньшие параметры компиляции), которые, по-видимому, доступны для сборки Mac и других дистрибутивов Linux.
В итоге я использовал debian:bookworm-slim в качестве базового образа, однако версия FFmpeg немного старше, вы можете использовать мультимедийную версию Deb для 6.0.1 примерно так:
FROM debian:bookworm-slim
RUN apt-get update
RUN apt-get install -y ca-certificates curl gnupg lsb-release
RUN lsbRelease=`lsb_release -c -s` && echo "deb https://www.deb-multimedia.org $lsbRelease main non-free" | tee /etc/apt/sources.list.d/deb-multimedia.list
RUN curl https://www.deb-multimedia.org/pool/main/d/deb-multimedia-keyring/deb-multimedia-keyring_2016.8.1_all.deb --output deb-multimedia-keyring_2016.8.1_all.deb
RUN dpkg -i deb-multimedia-keyring_2016.8.1_all.deb
RUN rm deb-multimedia-keyring_2016.8.1_all.deb
RUN apt-get update
RUN apt-get install -y ffmpeg
Или в последнем образе Ubuntu есть последняя версия FFmpeg, но я еще не успел ее полностью протестировать.
Конечно, мой вариант использования совершенно другой, поэтому нет никаких гарантий, что это сработает, но это может быть аналогичная проблема.
Рад, что это сработало и для вас, и да, шаг deb multimedia совершенно необязателен, он необходим только в том случае, если вам нужны новые сборки. Если стоковая сборка работает, менять ее не нужно.
Ответ на версию узла был точным! Не только предоставил широкое решение, но и с объяснением. Я застрял, предполагая, что проблема была в версии ffmpeg, а не в версии узла. Для справки: мне удалось поработать с версией «node:bullseye», никаких обновлений RUN не требуется! Большое спасибо!