Advertisement
Guest User

Untitled

a guest
Aug 31st, 2017
530
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.26 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 vi:noet
  3. # RTSP/H264 simple camera DVR
  4.  
  5. __author__ = "Jérôme Carretero <cJ-tub@zougloub.eu>"
  6. __license__ = "MIT"
  7.  
  8. import sys, io, os, re, time, datetime
  9.  
  10. import gi
  11.  
  12. gi.require_version('Gst', '1.0')
  13. gi.require_version('GstBase', '1.0')
  14.  
  15. from gi.repository import Gst, GObject, GstBase
  16.  
  17. if __name__ == '__main__':
  18.  
  19. import argparse
  20.  
  21. parser = argparse.ArgumentParser(
  22. description="Production data analysis",
  23. )
  24.  
  25. parser.add_argument("--url",
  26. )
  27.  
  28. parser.add_argument("--duration",
  29. type=float,
  30. default=365*24*60*60,
  31. )
  32.  
  33. parser.add_argument("--chunk-size",
  34. type=float,
  35. default=60*60,
  36. )
  37.  
  38. parser.add_argument("basename",
  39. )
  40.  
  41. try:
  42. import argcomplete
  43. argcomplete.autocomplete(parser)
  44. except:
  45. pass
  46.  
  47. args = parser.parse_args()
  48.  
  49. basename = args.basename
  50. url = args.url
  51. if url is None:
  52. url = "rtsp://%s:554/user=admin&password=&channel=1&stream=0.sdp" % basename
  53.  
  54.  
  55. GObject.threads_init()
  56. Gst.init(None)
  57.  
  58.  
  59. chunk_time = int(args.chunk_size*1e9)
  60. duration = args.duration
  61.  
  62. def generator():
  63. while True:
  64. fn = "%s-%s.mp4" % (datetime.datetime.now().strftime("%Y%m%dT%H%M%S"), basename)
  65. print("- %s" % fn)
  66. yield fn
  67.  
  68. fn_gen = generator()
  69. file = next(fn_gen)
  70.  
  71. pipeline = Gst.parse_launch("""
  72. rtspsrc location={url} protocols=4 name=rtsp
  73. rtsp.
  74. ! rtph264depay
  75. ! queue
  76. ! h264parse config-interval=1 name=parse
  77. ! splitmuxsink name=sink
  78. mux="mp4mux fragment-duration=1000"
  79. max-size-time={chunk_time}
  80. location={file}
  81. """.format(**locals()))
  82.  
  83. it0 = pipeline.iterate_elements()
  84. while True:
  85. res0, e = it0.next()
  86. if e is None:
  87. break
  88.  
  89. if e.name == "parse":
  90. """
  91. Workaround camera PTS issue
  92. """
  93. GstBase.BaseParse.set_infer_ts(e, True)
  94. GstBase.BaseParse.set_pts_interpolation(e, True)
  95.  
  96. pipeline.set_state(Gst.State.PLAYING)
  97.  
  98. t0 = time.time()
  99. bus = pipeline.get_bus()
  100.  
  101. try:
  102. while True:
  103. msg = bus.poll(Gst.MessageType.ANY, int(100*1e6))
  104.  
  105. if msg is None:
  106. now = time.time()
  107.  
  108. if now - t0 > duration:
  109. print("break")
  110. pipeline.send_event(Gst.Event.new_eos())
  111. break
  112.  
  113. continue
  114.  
  115. t = msg.type
  116. if t == Gst.MessageType.EOS:
  117. print("Error, EOS")
  118. break
  119. elif t == Gst.MessageType.ERROR:
  120. err, debug = msg.parse_error()
  121. print("Error: %s" % err, debug)
  122. break
  123. elif t == Gst.MessageType.WARNING:
  124. err, debug = msg.parse_warning()
  125. print("Warning: %s" % err, debug)
  126. elif t == Gst.MessageType.STATE_CHANGED:
  127. pass
  128. elif t == Gst.MessageType.STREAM_STATUS:
  129. pass
  130. elif t == Gst.MessageType.STREAM_START:
  131. pass
  132. elif t == Gst.MessageType.PROGRESS:
  133. pass
  134. elif t == Gst.MessageType.ASYNC_DONE:
  135. pass
  136. elif t == Gst.MessageType.NEW_CLOCK:
  137. pass
  138. elif t == Gst.MessageType.ELEMENT:
  139. """
  140. Assume we receive a new chunk info.
  141. """
  142. e = msg.src
  143. s = msg.get_structure()
  144. if "splitmuxsink-fragment-closed" in s.to_string():
  145. file = next(fn_gen)
  146. e.set_property("location", file)
  147. else:
  148. print("Error, unknown message: %s: %s" % (t, msg))
  149. break
  150. except KeyboardInterrupt:
  151. pipeline.send_event(Gst.Event.new_eos())
  152. while True:
  153. msg = bus.poll(Gst.MessageType.ANY, int(100*1e6))
  154.  
  155. if msg is None:
  156. continue
  157.  
  158. t = msg.type
  159. if t == Gst.MessageType.EOS:
  160. break
  161. finally:
  162. pipeline.set_state(Gst.State.NULL)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement