How to stop os.system() in Python?

Question:

I want to stop the cmd command after 12 seconds. How to stop it? My program doesn’t work.

import multiprocessing
import os
import time


def process():
    os.system('ffmpeg -i rtsp://218.204.223.237:554/live/1/66251FC11353191F/e7ooqwcfbqjoo80j.sdp -c copy dump.mp4')


def stop():
    time.sleep(12)


if __name__ == '__main__':
    p = multiprocessing.Process(target=process, args=())
    s = multiprocessing.Process(target=stop, args=())
    p.start()
    s.start()
    s.join()
    p.terminate()

I change my program follow Pedro’s suggusetion @Pedro Lobito ,but it still doesn`t work.

import shlex

import subprocess
import time

command_line = 'ffmpeg -i rtsp://218.204.223.237:554/live/1/66251FC11353191F/e7ooqwcfbqjoo80j.sdp -c copy dump.mp4'

proc = subprocess.Popen(shlex.split(command_line), shell=True)
print '1' * 50
time.sleep(2)  # <-- sleep for 12''
print '2' * 50
proc.terminate()  # <-- terminate the process
print '3' * 50

And the result in CMD is

D:wyxworkspacepythonffrstp>python test1.py
11111111111111111111111111111111111111111111111111
ffmpeg version N-75563-g235381e Copyright (c) 2000-2015 the FFmpeg developers
  built with gcc 4.9.3 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-av
isynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enab
le-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --
enable-libdcadec --enable-libfreetype --enable-libgme --enable-libgsm --enable-l
ibilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enab
le-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --en
able-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --ena
ble-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc
 --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enabl
e-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-lzma --ena
ble-decklink --enable-zlib
  libavutil      55.  2.100 / 55.  2.100
  libavcodec     57.  3.100 / 57.  3.100
  libavformat    57.  2.100 / 57.  2.100
  libavdevice    57.  0.100 / 57.  0.100
  libavfilter     6.  8.100 /  6.  8.100
  libswscale      4.  0.100 /  4.  0.100
  libswresample   2.  0.100 /  2.  0.100
  libpostproc    54.  0.100 / 54.  0.100
Input #0, rtsp, from 'rtsp://218.204.223.237:554/live/1/66251FC11353191F/e7ooqwc
fbqjoo80j.sdp':
  Metadata:
    title           : RTSP Session
    comment         : Jabsco Stream(JCO-jy9757acx1eve7nm-a104aea23c1e17bbc776656
f5069bbf7)
  Duration: N/A, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: mpeg4 (Simple Profile), yuv420p, 352x288 [SAR 1:1 DAR 11
:9], 10k tbr, 90k tbn, 10k tbc
[mp4 @ 00bad520] Codec for stream 0 does not use global headers but container fo
rmat requires global headers
Output #0, mp4, to 'dump.mp4':
  Metadata:
    title           : RTSP Session
    comment         : Jabsco Stream(JCO-jy9757acx1eve7nm-a104aea23c1e17bbc776656
f5069bbf7)
    encoder         : Lavf57.2.100
    Stream #0:0: Video: mpeg4 ( [0][0][0] / 0x0020), yuv420p, 352x288 [SAR 1:1 D
AR 11:9], q=2-31, 10k tbr, 90k tbn, 90k tbc
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
Press [q] to stop, [?] for help
[mp4 @ 00bad520] pts has no value
[mp4 @ 00bad520] Non-monotonous DTS in output stream 0:0; previous: 0, current:
0; changing to 1. This may result in incorrect timestamps in the output file.
[mp4 @ 00bad520] Non-monotonous DTS in output stream 0:0; previous: 1, current:
0; changing to 2. This may result in incorrect timestamps in the output file.
frame=   30 fps=0.0 q=-1.0 size=      63kB time=00:00:02.33 bitrate= 220.4kbits/
frame=   36 fps= 31 q=-1.0 size=      68kB time=00:00:02.95 bitrate= 187.9kbits/
frame=   42 fps= 24 q=-1.0 size=      73kB time=00:00:03.52 bitrate= 169.6kbits/
frame=   47 fps= 20 q=-1.0 size=      90kB time=00:00:04.10 bitrate= 178.9kbits/
frame=   53 fps= 19 q=-1.0 size=      95kB time=00:00:04.63 bitrate= 167.2kbits/
22222222222222222222222222222222222222222222222222
33333333333333333333333333333333333333333333333333

D:wyxworkspacepythonffrstp>frame=   58 fps= 17 q=-1.0 size=      99kB time=0
frame=   64 fps= 16 q=-1.0 size=     104kB time=00:00:05.72 bitrate= 149.0kbits/
frame=   70 fps= 15 q=-1.0 size=     122kB time=00:00:06.36 bitrate= 156.7kbits/
frame=   76 fps= 15 q=-1.0 size=     127kB time=00:00:06.92 bitrate= 150.2kbits/
frame=   82 fps= 14 q=-1.0 size=     132kB time=00:00:07.55 bitrate= 143.2kbits/
[rtsp @ 00adb3e0] max delay reached. need to consume packet
[NULL @ 00add8c0] RTP: missed 7 packets
frame=   86 fps= 13 q=-1.0 size=     135kB time=00:00:07.95 bitrate= 139.5kbits/
[rtsp @ 00adb3e0] max delay reached. need to consume packet
[NULL @ 00add8c0] RTP: missed 3 packets

Maybe ffmpeg can reconnection. Can I stop it like ‘Ctrl + C’?
When I press ‘Ctrl+C’,the result is

22222222222222222222222222222222222222222222222222
33333333333333333333333333333333333333333333333333

D:wyxworkspacepythonffrstp>frame=   58 fps= 17 q=-1.0 size=      99kB time=0
frame=   64 fps= 16 q=-1.0 size=     104kB time=00:00:05.72 bitrate= 149.0kbits/
frame=   70 fps= 15 q=-1.0 size=     122kB time=00:00:06.36 bitrate= 156.7kbits/
frame=   76 fps= 15 q=-1.0 size=     127kB time=00:00:06.92 bitrate= 150.2kbits/
frame=   82 fps= 14 q=-1.0 size=     132kB time=00:00:07.55 bitrate= 143.2kbits/
[rtsp @ 00adb3e0] max delay reached. need to consume packet
[NULL @ 00add8c0] RTP: missed 7 packets
frame=   86 fps= 13 q=-1.0 size=     135kB time=00:00:07.95 bitrate= 139.5kbits/
[rtsp @ 00adb3e0] max delay reached. need to consume packet
[NULL @ 00add8c0] RTP: missed 3 packets
[rtsp @ 00adb3e0] max delay reached. need to consume packet
[NULL @ 00add8c0] RTP: missed 1 packets
frame=   89 fps= 13 q=-1.0 size=     138kB time=00:00:08.35 bitrate= 135.3kbits/
[rtsp @ 00adb3e0] max delay reached. need to consume packet
[NULL @ 00add8c0] RTP: missed 1 packets
[rtsp @ 00adb3e0] max delay reached. need to consume packet
[NULL @ 00add8c0] RTP: missed 3 packets
[rtsp @ 00adb3e0] max delay reached. need to consume packet
[NULL @ 00add8c0] RTP: missed 5 packets
[rtsp @ 00adb3e0] max delay reached. need to consume packet
[NULL @ 00add8c0] RTP: missed 3 packets
[rtsp @ 00adb3e0] max delay reached. need to consume packet
[NULL @ 00add8c0] RTP: missed 1 packets
frame=   92 fps= 12 q=-1.0 size=     144kB time=00:00:09.15 bitrate= 128.7kbits/
frame=   93 fps= 11 q=-1.0 size=     145kB time=00:00:09.58 bitrate= 123.8kbits/
[rtsp @ 00adb3e0] max delay reached. need to consume packet
[NULL @ 00add8c0] RTP: missed 1 packets
[rtsp @ 00adb3e0] max delay reached. need to consume packet
[NULL @ 00add8c0] RTP: missed 2 packets


D:wyxworkspacepythonffrstp>[rtsp @ 00adb3e0] max delay reached. need to cons
ume packet
[NULL @ 00add8c0] RTP: missed 12 packets
frame=   96 fps= 11 q=-1.0 size=     148kB time=00:00:10.43 bitrate= 116.2kbits/
frame=   96 fps=9.2 q=-1.0 Lsize=     151kB time=00:00:10.43 bitrate= 118.3kbits
/s
video:148kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing o
verhead: 1.913398%
Exiting normally, received signal 2.
Asked By: wyx

||

Answers:

os.systemdoes not provide pid of the child process.

Use subprocess module.

import subprocess
import time

proc = subprocess.Popen(['ffmpeg -i rtsp://218.204.223.237:554/live/1/66251FC11353191F/e7ooqwcfbqjoo80j.sdp -c copy dump.mp4'], shell=True)
time.sleep(12) # <-- sleep for 12''
proc.terminate() # <-- terminate the process

You can also use the -t argument, i.e.:

ffmpeg -t 12 -i rtsp://218.204.223.237:554/live/1/66251FC11353191F/e7ooqwcfbqjoo80j.sdp -c copy dump.mp4

Answered By: Pedro Lobito

I find a solution when I read ffmpeg documentation today use -t before -i the Time duration section in the ffmpeg-utils manual
Thanks for Pedro Lobito’s help.I hope everyone can document first and then ask question .

Answered By: wyx
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.