如何在Python中停止os.system()?

时间:2015-09-29 17:17:44

标签: python ffmpeg

我想在12秒后停止cmd命令。怎么阻止它?我的程序不起作用。

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()

我改变我的节目跟随佩德罗的建议@Pedro Lobito,但它仍然没有用。

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

CMD的结果是

D:\wyx\workspace\python\ffrstp>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:\wyx\workspace\python\ffrstp>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

也许ffmpeg可以重新连接。我可以像“Ctrl + C&C”一样停下来吗? 当我按下Ctrl + C&#39;时,结果为

22222222222222222222222222222222222222222222222222
33333333333333333333333333333333333333333333333333

D:\wyx\workspace\python\ffrstp>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:\wyx\workspace\python\ffrstp>[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.

2 个答案:

答案 0 :(得分:1)

os.system未提供子进程的pid

使用subprocess模块。

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

答案 1 :(得分:0)

我在今天阅读ffmpeg documentation后找到解决方案 -i the Time duration section in the ffmpeg-utils manual之前使用 -t 感谢Pedro Lobito的帮助。我希望每个人都能先记录下来,然后提出问题。