init.d 起動スクリプトで起動すると、ffmpeg ストリームは非効率的に実行されます。

init.d 起動スクリプトで起動すると、ffmpeg ストリームは非効率的に実行されます。

次のコマンドを使用してRaspberry Pi 4でビデオ/オーディオをストリーミングするためにffmpegを使用しています。

ffmpeg -re -f v4l2 -input_format h264 -thread_queue_size 512 -i ${video_device} -re -f alsa -thread_queue_size 512 -itsoffset 0 -i "default:CARD=C920" -acodec aac -vf drawtext="fontsize=48: box=1: [email protected]: boxborderw=2: fontcolor=white: x=(w-text_w)/1.1: y=((h-text_h)/1.4)+((h-text_h)/4): text='%{localtime\:%H\\\\\:%M\\\\\:%S}'" -vcodec libx264 -b:v 256k -r 10 -tune zerolatency -strict -2 -f mpegts -flush_packets 1 udp://192.168.116.13:5000?pkt_size=512

このコードを手動で実行すると正常に動作します(1〜2秒の遅延でストリーミングが良くなります)。

起動時に自動的に起動する準備ができました。初期化ファイルスクリプトと使用更新-rc.d。これまでは問題ありません。手動起動スクリプトを使用する場合

sudo service myscript start

私も同じように良い成果を得ました。しかし、起動時に起動すると、ストリーミングパフォーマンスが悪くなります(サウンドが10程度遅れ、時々サウンドが途切れ、時々ビデオが一時停止します...)。

私は走る

ps aux

手動起動と自動起動に分けられます。興味深いことに、起動時に起動すると、手動で起動する(189%)よりもCPU使用率がはるかに低くなります(87.3%)。これは手動起動でより多くのスレッドを使用するため、パフォーマンスが向上する可能性があることを意味できます。

起動時にストリーミングを開始すると、ストリーミングパフォーマンスが悪化する理由についてのアイデアはありますか?この問題を解決するには?

アップデート(@ Jonas Berlinによるコメントの後):

どちらの場合も、(手動起動と起動時に起動)ユーザーとしてコマンドを実行します。PI

ls -l /proc/<pid>/fd

次の出力を提供します。

手動起動(良いストリーミングパフォーマンス、高いCPU使用率)

lr-x------ 1 pi pi 64 Feb  7 15:30 0 -> /dev/null
lrwx------ 1 pi pi 64 Feb  7 15:30 1 -> 'socket:[18561]'
lrwx------ 1 pi pi 64 Feb  7 15:30 2 -> 'socket:[18561]'
lrwx------ 1 pi pi 64 Feb  7 15:30 3 -> /dev/video0
lr-x------ 1 pi pi 64 Feb  7 15:30 4 -> /dev/snd/timer
lrwx------ 1 pi pi 64 Feb  7 15:30 5 -> /dev/snd/pcmC1D0c
lrwx------ 1 pi pi 64 Feb  7 15:30 6 -> 'socket:[17677]'

起動時開始(低ストリーミング性能、低CPU使用率)

lr-x------ 1 pi pi 64 Feb  7 15:29 0 -> /dev/null
lrwx------ 1 pi pi 64 Feb  7 15:29 1 -> 'socket:[16471]'
lrwx------ 1 pi pi 64 Feb  7 15:29 2 -> 'socket:[16471]'
lrwx------ 1 pi pi 64 Feb  7 15:29 3 -> /dev/video0
lr-x------ 1 pi pi 64 Feb  7 15:29 4 -> /dev/snd/timer
lrwx------ 1 pi pi 64 Feb  7 15:29 5 -> /dev/snd/pcmC1D0c
lrwx------ 1 pi pi 64 Feb  7 15:29 6 -> 'socket:[17332]'

関連情報