code: def play(self):
  		
  		### First do some status checks
  
  		# Make sure a file is loaded
  		if self.status == UNINITIALIZED or self.clip is None:
  			raise RuntimeError("Player uninitialized or no file loaded")
  
  		# Check if playback has already finished (rewind needs to be called first)
  		if self.status == EOS:
  			logger.debug("End of stream has already been reached")
  			return
  
  		# Check if playback hasn't already been started (and thus if play()
  		# has not been called before from another thread for instance)
  		if self.status in [PLAYING,PAUSED]:
  			logger.warning("Video already started")
  			return
  
  		### If all is in order start the general playing loop
  		if self.status == READY:
  			self.status = PLAYING
  
  		self.last_frame_no = 0
  
  		if not hasattr(self,"renderloop") or not self.renderloop.isAlive():
  			if self.audioformat:
  				# Chop the total stream into separate audio chunks that are the
  				# lenght of a video frame (this way the index of each chunk 
  				# corresponds to the video frame it belongs to.)
  				self.__calculate_audio_frames()
  				# Start audio handling thread. This thread places audioframes
  				# into a sound buffer, untill this buffer is full.
  				self.audioframe_handler = threading.Thread(
  					target=self.__audiorender_thread)
  				self.audioframe_handler.start()
  
  			# Start main rendering loop.
  			self.renderloop = threading.Thread(target=self.__render)
  			self.renderloop.start()
  		else:
  			logger.warning("Rendering thread already running!")
docs: Start the playback of the video. 
  		The playback loop is run in a separate thread, so this function returns 
  		immediately. This allows one to implement things such as event handling 
  		loops (e.g. check for key presses) elsewhere.