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>&1
stderr를 stdout으로 리디렉션합니다(따라서 터미널 대신 로그 파일에 남게 됩니다).< /dev/null
ffmpeg가 필요하다고 생각하는 것으로 표준 입력/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
비트가 작동합니다.