Como transmitir com o ffmpeg em um processo separado

4

Eu preciso transmitir com o ffmpeg no Ubuntu. O streaming deve ser iniciado a partir de um script bash.

Atualmente, chamo o ffmpeg assim, como parte da sub-rotina em um script 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."
}

Aqui está uma saída que é produzida por esta parte da execução do script:

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.

Por que o ffmpeg é imediatamente interrompido? Executar o ffmpeg em um terminal separado como um único comando inicia a transmissão enquanto houver um rastreio de saída na janela do terminal.

    
por Maxim V. Pavlov 12.08.2015 / 20:30

3 respostas

5

Provavelmente está tentando ler stdin (o ffmpeg na verdade usa comandos interativos ...). Para desabilitar isso, o ffmpeg tem a opção -nostdin - que deve executá-lo em segundo plano.

Você também pode considerar -loglevel fatal ou -loglevel error , além de algumas outras opções para torná-lo mais silencioso ( -nostats , etc.).

    
por 12.08.2015 / 20:51
1

Redirecionar stdin faz o truque.

Use um comando como: ffmpeg ... > output.log 2>&1 < /dev/null & .

  • > output.log Redirecionar stdout para output.log.
  • 2>&1 Redirecionar stderr para stdout (assim, ele acaba no arquivo de log e não no terminal).
  • < /dev/null Redirecionar stdin (que o ffmpeg acha necessário) para /dev/null (o que dá um fluxo vazio).
  • & tem o processo executado em segundo plano.
por 09.03.2018 / 06:16
0

De acordo com o exemplo do PHP no site ffmpeg , deve-se redirecionar a entrada e as duas saídas para algum lugar onde o ffmpeg seja efetivamente executado. o fundo:

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 &

Os </dev/null >/dev/null 2>&1 bits fazem o truque.

    
por 13.08.2015 / 09:18