Как передать поток ffmpeg в отдельный процесс

Мне нужно потоковаться с ffmpeg на Ubuntu. Потоковая передача должна запускаться из сценария bash.

В настоящее время я называю ffmpeg таким образом, как часть подпрограммы в сценарии bash:

function startFFMpegEncoder () { echo "Starting Encoder..." killall -9 ffmpeg ffmpeg -s 640x480 -f video4linux2 -i $CAM_PATH -f mpeg1video -b:v 800k -r 30 http://127.0.0.1:$FFMPEG_PORT/$VIDEO_PASSWORD/640/480/ & echo "Encoder started." } 

Вот результат, который создается этой частью исполнения скрипта:

 Starting Encoder... ffmpeg: no process found ffmpeg version N-73895-g323ec6b Copyright (c) 2000-2015 the FFmpeg developers built with gcc 4.8 (Ubuntu 4.8.4-2ubuntu1~14.04) configuration: --extra-libs=-ldl --prefix=/opt/ffmpeg --enable-avresample --disable-debug --enable-nonfree --enable-gpl --enable-version3 --enable-libopencore-amrnb --enable-libopencore-amrwb --disable-decoder=amrnb --disable-decoder=amrwb --enable-libpulse --enable-libdcadec --enable-libx264 --enable-libx265 --enable-libfdk-aac --enable-libvorbis --enable-libmp3lame --enable-libopus --enable-libvpx --enable-libspeex --enable-libass --enable-avisynth --enable-libsoxr --enable-libxvid --enable-libvo-aacenc --enable-libvidstab libavutil 54. 28.100 / 54. 28.100 libavcodec 56. 50.101 / 56. 50.101 libavformat 56. 40.101 / 56. 40.101 libavdevice 56. 4.100 / 56. 4.100 libavfilter 5. 25.100 / 5. 25.100 libavresample 2. 1. 0 / 2. 1. 0 libswscale 3. 1.101 / 3. 1.101 libswresample 1. 2.101 / 1. 2.101 libpostproc 53. 3.100 / 53. 3.100 [1]+ Stopped ffmpeg -s 640x480 -f video4linux2 -i $CAM_PATH -f mpeg1video -b:v 800k -r 30 http://127.0.0.1:$FFMPEG_PORT/$VIDEO_PASSWORD/640/480/ Encoder started. 

Почему ffmpeg немедленно прекращается? Запуск ffmpeg в отдельном терминале в виде отдельной команды запускает широковещательную рассылку до тех пор, пока в окне терминала есть выходная трассировка.

Вероятно, он пытается читать stdin (ffmpeg фактически принимает интерактивные команды …). Чтобы отключить это, ffmpeg имеет параметр -nostdin который должен запуститься в фоновом режиме.

Вы также можете рассмотреть -loglevel fatal -loglevel error -loglevel fatal или -loglevel error а также несколько других параметров, чтобы сделать ее более спокойной ( -nostats и т. Д.).

Согласно примеру PHP на сайте ffmpeg , нужно перенаправить вход и оба выхода в ffmpeg для эффективного запуска в фоновом режиме:

 ffmpeg -s 640x480 -f video4linux2 -i $CAM_PATH -f mpeg1video -b:v 800k -r 30 http://127.0.0.1:$FFMPEG_PORT/$VIDEO_PASSWORD/640/480/ -nostdin -nostats </dev/null >/dev/null 2>&1 & 

Этот трюк выполняет </dev/null >/dev/null 2>&1 бит.