별도의 프로세스에서 ffmpeg를 사용하여 스트리밍하는 방법

별도의 프로세스에서 ffmpeg를 사용하여 스트리밍하는 방법

Ubuntu에서 스트리밍하려면 ffmpeg를 사용해야 합니다. 스트림은 bash 스크립트에서 시작되어야 합니다.

현재 저는 bash 스크립트의 서브루틴의 일부로 다음과 같이 ffmpeg를 호출합니다.

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를 단일 명령으로 실행하면 터미널 창에 출력 추적이 있는 한 브로드캐스팅이 시작됩니다.

답변1

아마도 표준 입력을 읽으려고 시도하고 있을 것입니다(ffmpeg에는 실제로 대화형 명령이 필요합니다...). 이 기능을 비활성화하려면 ffmpeg를 선택적으로 -nostdin백그라운드에서 실행할 수 있습니다.

-loglevel fatal또는 -loglevel error더 조용하게 만들기 위한 다른 옵션( 등)을 고려할 수도 있습니다 -nostats.

답변2

그냥 stdin을 리디렉션하세요.

다음 명령을 사용하십시오: ffmpeg ... > output.log 2>&1 < /dev/null &.

  • > output.log표준 출력을 output.log로 리디렉션합니다.
  • 2>&1stderr를 stdout으로 리디렉션합니다(따라서 터미널 대신 로그 파일에 남게 됩니다).
  • < /dev/nullffmpeg가 필요하다고 생각하는 것으로 표준 입력 /dev/null(빈 스트림 제공)을 리디렉션합니다.
  • &프로세스가 백그라운드에서 실행됩니다.

답변3

~에 따르면ffmpeg 웹사이트의 PHP 예제, 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비트가 작동합니다.

관련 정보