ffmpeg 명령은 스크립트 내에서 자동으로 실패하지만 직접 실행하면 작동합니다.

ffmpeg 명령은 스크립트 내에서 자동으로 실패하지만 직접 실행하면 작동합니다.

ffmpeg를 사용하여 화면 내에서 실행되는 rtmp 스트림을 생성하는 스크립트가 있지만 어떤 이유로 실패합니까? 명령줄에서 직접 실행하면 작동하기 때문에 > screen을 열어 실행한 후 ctrl+d로 screen을 끄고 실행해 보았으나, 그래도 왠지 모르게 종료되는 경우가 있습니다.

스크립트 내에서 명령이 실패하지만 직접 실행하면 작동하는 이유를 확인하기 위해 스크립트 내의 ffmpeg에서 stderr을 기록하는 방법이 있습니까?

#!/bin/bash

if [ "$1" = "run" ]; then
        source $HOME/.bash_aliases
        while [ 1 ]; do 
ffmpeg -f x11grab -s 1000x563 -framerate 30 -i $DISPLAY+10,151 -f pulse -ac 2 -i default -c:v libx264 -preset ultrafast -tune zerolatency -x264opts keyint=30:min-keyint=10 -b:v 2000k -pix_fmt yuv420p -s 1000x562 -c:a aac -b:a 160k -ar 44100 -t '4:00:00' -threads 0 -f flv rtmp://IPADDRESS:1935/live1/$CHANNEL
        done
else
        killall -9 ffmpeg > /dev/null 2>&1
        sleep 5s;
        screen -ls | grep ffmpeg > /dev/null 2>&1
        if [ "$?" = "1" ]; then
                screen -mdS ffmpeg $0 run
        fi
fi

감사합니다~

답변1

스크립트 내에서 명령이 실패하지만 직접 실행하면 작동하는 이유를 확인하기 위해 스크립트 내의 ffmpeg에서 stderr을 기록하는 방법이 있습니까?

여기에서 스트림 2, stderr을 tmp.A로 전달하고 tmp 파일을 계속 덮어쓰는 것을 원하지 않으므로 이름에 PID를 추가합니다.

my_command 2> /tmp/ffmpeg_error$$.log

이제 ffmpeg에 적용하십시오.

ffmpeg -f x11grab -s 1000x563 -framerate 30 -i $DISPLAY+10,151 -f pulse -ac 2 -i default -c:v libx264 -preset ultrafast -tune zerolatency -x264opts keyint=30:min-keyint=10 -b:v 2000k -pix_fmt yuv420p -s 1000x562 -c:a aac -b:a 160k -ar 44100 -t '4:00:00' -threads 0 -f flv rtmp://IPADDRESS:1935/live1/$CHANNEL 2> /tmp/ffmpeg_error$$.log

답변2

더 많은 정보가 없으면 스크립트를 실행할 때 최소한의 환경이 있을 것이라는 첫 번째 생각이 들었습니다. cron에서 실행하고 있습니까? 그럴 경우 $CHANNEL 등에 액세스하지 못할 수도 있습니다.

어떤 경우든 2>를 사용하여 표준 오류 출력을 파일로 리디렉션하는 스크립트를 호출할 수 있습니다. 예를 들어:

./script.sh > result.log 2> error.log

스크립트에서 ffmpeg를 호출하는 경우 스크립트 내의 ffmpeg 명령 끝에 리디렉션을 추가해야 합니다. 스크립트에서 다음과 같은 작업을 수행할 수 있습니다.

ffmpeg (your-params-here) > result.log 2> error.log

답변3

-nostdin플래그를 로 설정해 보세요 ffmpeg.

아마도 상위 포스터의 원래 질문과 직접적인 관련이 없을 수도 있지만 현재는 "ffmpeg가 스크립트 내에서 실패함"에 대한 최상의 검색 결과이므로 다른 사람들에게 도움이 되기를 바라면서 어쨌든 내 결과를 공유하겠습니다.

해당 루프 외부에서 ffmpeg실행 되거나 자체적으로 실행될 때마다 잘 작동합니다. 루프를 추가하면 데이터가 콘솔에 덤프됩니다. 이유는 잘 모르겠지만, 읽는 동안 ffmpeg가 stdin을 위해 싸우고 있다고 생각했기 때문에 추가하면 문제가 해결되었습니다. 내 경우에 이것이 왜 효과가 있었는지에 대한 다른 사람들의 설명을 듣고 싶습니다 .cat 'file' | while read INFILE ; do loopffmpeg-nostdin-nostdin

관련 정보