Ffmpeg завершился с кодом 1: ошибка ввода/вывода

На моем внутреннем 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 на стороне сервера в контейнере докеров для записи радиопотока?

Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
1
0
120
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

При создании контейнера для запуска 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, но я еще не успел ее полностью протестировать.

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

Ответ на версию узла был точным! Не только предоставил широкое решение, но и с объяснением. Я застрял, предполагая, что проблема была в версии ffmpeg, а не в версии узла. Для справки: мне удалось поработать с версией «node:bullseye», никаких обновлений RUN не требуется! Большое спасибо!

Alessandro1918 30.05.2024 20:50

Рад, что это сработало и для вас, и да, шаг deb multimedia совершенно необязателен, он необходим только в том случае, если вам нужны новые сборки. Если стоковая сборка работает, менять ее не нужно.

Philio 31.05.2024 01:07

Другие вопросы по теме

Похожие вопросы

Как запустить сценарий из другого репозитория на локальном средстве запуска Bitbucket в Windows
Можно ли дополнительно указать платформу сборки для службы в файле Docker Compose?
Как просмотреть содержимое докер-контейнера из Windows?
Docker compose -f docker-compose,yaml up error: сервис том Services.database.volumes.[0] отсутствует цель монтирования
Невозможно загрузить архив изображений в Docker, потому что Docker нужен пользователь root, а Bazel — пользователь без полномочий root
Как использовать переменные из файла .env, расположенного в родительском каталоге, при включении других файлов Compose в дочерние каталоги с помощью docker-compose
Задание Cron и докер
Статическая компоновка для Rust без glibc — черное изображение
Поэзия не может установить наборы данных и трансформеры в Docker
Ошибка во время подключения: в конфигурации демона по умолчанию в Windows клиент Docker должен запускаться с повышенными привилегиями для подключения