Как определить, упал ли подпроцесс ffmpeg - PullRequest
1 голос
/ 09 апреля 2020

У меня проблема

Я хочу создать новый процесс ffmpeg, используя subprocess.popen, узнать его pid и в теле python программы, чтобы увидеть, является ли этот процесс живым или нет

args = shlex.split ('ffmpeg -i rtsp: //192.168.1.68: 8554 / mystream -f segment -strftime 1 -segment_time 5 13_REG1_CHANNEL3_% Y-% m-% d_% H-% M-% S-% s .mp3 ')
print (args)
proc = subprocess.Popen (args, stdout = subprocess.PIPE)
ch_pid = proc.pid
print (proc.pid)
proc.wait ()
print (proc.communicate ())
while (1):
 if (os.system (str ('kill -0 {PID}'). format (PID = ch_pid)) == 0):
   print ('proc is alive')
 else:
   break

в то время как l oop я пытался проверить этот pid процесса с помощью kill -0 pid, эта команда вернет ноль, если все в порядке и процесс запущен

НО

Если ffmpeg упадет, изменений не будет

kill -0 pid будет продолжать возвращать ноль кода, что все хорошо

Что мне делать?

1 Ответ

0 голосов
/ 09 апреля 2020

Вы можете решить это, используя proc.poll().
См .: Есть ли способ проверить, работает ли подпроцесс? .

Вот пример:

import shlex
import subprocess

#args = shlex.split ('ffmpeg -i rtsp: //192.168.1.68: 8554 / mystream -f segment -strftime 1 -segment_time 5 13_REG1_CHANNEL3_% Y-% m-% d_% H-% M-% S-% s .mp3 ')
args = shlex.split ('ffmpeg -i rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov -vcodec copy -acodec copy BigBuckBunny_115k.mov')

print (args)
proc = subprocess.Popen (args, stdout = subprocess.PIPE)
ch_pid = proc.pid
print (proc.pid)
proc.wait ()
print (proc.communicate ())
while (1):
    poll = proc.poll()
    if poll is None:
        print ('proc is alive')
        # p.subprocess is alive
    else:
        print ('proc is dead')
        break

Вот пример более чистого кода:

import shlex
import subprocess
import time

args = shlex.split ('ffmpeg -y -i rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov -vcodec copy -acodec copy BigBuckBunny_115k.mov')

proc = subprocess.Popen(args)

while True:
    poll = proc.poll()
    if poll is None:
        print ('proc is alive')
    else:
        print ('proc is dead')
        break
    time.sleep(1)

proc.wait()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...