def __init__(self, session, params=None, args=None, timeout=60.0): """ :param session: Streamlink session :param params: keyword arguments mapped to process argument :param args: positional arguments :param timeout: timeout for process """ super(StreamProcess, self).__init__(session) self.cmd = None self.parameters = params or {} self.arguments = args or [] self.timeout = timeout self.errorlog = self.session.options.get("subprocess-errorlog") self.errorlog_path = self.session.options.get( "subprocess-errorlog-path") if self.errorlog_path: self.stderr = open(self.errorlog_path, "w") elif self.errorlog: self.stderr = tempfile.NamedTemporaryFile(prefix="streamlink", suffix=".err", delete=False) else: self.stderr = devnull()
def __init__(self, session, *streams, **options): if not self.is_usable(session): raise StreamError("cannot use FFMPEG") self.session = session self.process = None self.streams = streams self.pipes = [ NamedPipe("ffmpeg-{0}-{1}".format(os.getpid(), random.randint(0, 1000))) for _ in self.streams ] self.pipe_threads = [ threading.Thread(target=self.copy_to_pipe, args=(self, stream, np)) for stream, np in zip(self.streams, self.pipes) ] ofmt = options.pop("format", "matroska") outpath = options.pop("outpath", "pipe:1") videocodec = session.options.get( "ffmpeg-video-transcode") or options.pop("vcodec", "copy") audiocodec = session.options.get( "ffmpeg-audio-transcode") or options.pop("acodec", "copy") metadata = options.pop("metadata", {}) maps = options.pop("maps", []) copyts = options.pop("copyts", False) self._cmd = [self.command(session), '-nostats', '-y'] for np in self.pipes: self._cmd.extend(["-i", np.path]) self._cmd.extend(['-c:v', videocodec]) self._cmd.extend(['-c:a', audiocodec]) for m in maps: self._cmd.extend(["-map", str(m)]) if copyts: self._cmd.extend(["-copyts"]) self._cmd.extend(["-start_at_zero"]) for stream, data in metadata.items(): for datum in data: self._cmd.extend(["-metadata:{0}".format(stream), datum]) self._cmd.extend(['-f', ofmt, outpath]) log.debug("ffmpeg command: {0}".format(' '.join(self._cmd))) self.close_errorlog = False if session.options.get("ffmpeg-verbose"): self.errorlog = sys.stderr elif session.options.get("ffmpeg-verbose-path"): self.errorlog = open(session.options.get("ffmpeg-verbose-path"), "w") self.close_errorlog = True else: self.errorlog = devnull()
def __init__(self, session, *streams, **options): if not self.is_usable(session): raise StreamError("cannot use FFMPEG") self.session = session self.process = None self.streams = streams self.chunk_size = int(session.options.get("chunk-size")) self.pipes = [NamedPipe() for _ in self.streams] self.pipe_threads = [threading.Thread(target=self.copy_to_pipe, args=(stream, np, self.chunk_size)) for stream, np in zip(self.streams, self.pipes)] ofmt = session.options.get("ffmpeg-fout") or options.pop("format", self.DEFAULT_OUTPUT_FORMAT) outpath = options.pop("outpath", "pipe:1") videocodec = session.options.get("ffmpeg-video-transcode") or options.pop("vcodec", self.DEFAULT_VIDEO_CODEC) audiocodec = session.options.get("ffmpeg-audio-transcode") or options.pop("acodec", self.DEFAULT_AUDIO_CODEC) metadata = options.pop("metadata", {}) maps = options.pop("maps", []) copyts = session.options.get("ffmpeg-copyts") start_at_zero = session.options.get("ffmpeg-start-at-zero") or options.pop("start_at_zero", False) self._cmd = [self.command(session), '-nostats', '-y'] for np in self.pipes: self._cmd.extend(["-i", str(np.path)]) self._cmd.extend(['-c:v', videocodec]) self._cmd.extend(['-c:a', audiocodec]) for m in maps: self._cmd.extend(["-map", str(m)]) if copyts: self._cmd.extend(["-copyts"]) if start_at_zero: self._cmd.extend(["-start_at_zero"]) for stream, data in metadata.items(): for datum in data: stream_id = ":{0}".format(stream) if stream else "" self._cmd.extend(["-metadata{0}".format(stream_id), datum]) self._cmd.extend(['-f', ofmt, outpath]) log.debug("ffmpeg command: {0}".format(' '.join(self._cmd))) self.close_errorlog = False if session.options.get("ffmpeg-verbose"): self.errorlog = sys.stderr elif session.options.get("ffmpeg-verbose-path"): self.errorlog = open(session.options.get("ffmpeg-verbose-path"), "w") self.close_errorlog = True else: self.errorlog = devnull()
def __init__(self, session, *streams, **options): if not self.is_usable(session): raise StreamError("cannot use FFMPEG") self.session = session self.process = None log = logging.getLogger("streamlink.stream.mp4mux-ffmpeg") self.streams = streams self.pipes = [NamedPipe("ffmpeg-{0}-{1}".format(os.getpid(), random.randint(0, 1000))) for _ in self.streams] self.pipe_threads = [threading.Thread(target=self.copy_to_pipe, args=(self, stream, np)) for stream, np in zip(self.streams, self.pipes)] ofmt = options.pop("format", "matroska") outpath = options.pop("outpath", "pipe:1") videocodec = session.options.get("ffmpeg-video-transcode") or options.pop("vcodec", "copy") audiocodec = session.options.get("ffmpeg-audio-transcode") or options.pop("acodec", "copy") metadata = options.pop("metadata", {}) maps = options.pop("maps", []) copyts = options.pop("copyts", False) self._cmd = [self.command(session), '-nostats', '-y'] for np in self.pipes: self._cmd.extend(["-i", np.path]) self._cmd.extend(['-c:v', videocodec]) self._cmd.extend(['-c:a', audiocodec]) for m in maps: self._cmd.extend(["-map", str(m)]) if copyts: self._cmd.extend(["-copyts"]) for stream, data in metadata.items(): for datum in data: self._cmd.extend(["-metadata:{0}".format(stream), datum]) self._cmd.extend(['-f', ofmt, outpath]) log.debug("ffmpeg command: {0}".format(' '.join(self._cmd))) self.close_errorlog = False if session.options.get("ffmpeg-verbose"): self.errorlog = sys.stderr elif session.options.get("ffmpeg-verbose-path"): self.errorlog = open(session.options.get("ffmpeg-verbose-path"), "w") self.close_errorlog = True else: self.errorlog = devnull()
def __init__(self, session, params=None, args=None, timeout=60.0): """ :param session: Streamlink session :param params: keyword arguments mapped to process argument :param args: positional arguments :param timeout: timeout for process """ super(StreamProcess, self).__init__(session) self.cmd = None self.parameters = params or {} self.arguments = args or [] self.timeout = timeout self.errorlog = self.session.options.get("subprocess-errorlog") self.errorlog_path = self.session.options.get("subprocess-errorlog-path") if self.errorlog_path: self.stderr = open(self.errorlog_path, "w") elif self.errorlog: self.stderr = tempfile.NamedTemporaryFile(prefix="streamlink", suffix=".err", delete=False) else: self.stderr = devnull()
def __init__(self, session, *streams, **options): if not self.is_usable(session): raise StreamError("cannot use FFMPEG") self.session = session self.process = None self.streams = streams self.is_muxed = options.pop("is_muxed", True) ofmt = options.pop("format", "matroska") outpath = options.pop("outpath", "pipe:1") videocodec = session.options.get( "ffmpeg-video-transcode") or options.pop("vcodec", "copy") audiocodec = session.options.get( "ffmpeg-audio-transcode") or options.pop("acodec", "copy") metadata = options.pop("metadata", {}) maps = options.pop("maps", []) copyts = options.pop("copyts", False) self._cmd = [self.command(session), '-nostats', '-y'] delayVideo = str(getE2config('WPvideoDelay', '0')) if delayVideo != '0': self._cmd.extend(['-itsoffset', delayVideo]) if self.is_muxed: #self.pipes = [NamedPipe("ffmpeg-{0}-{1}".format(os.getpid(), random.randint(0, 1000))) for _ in self.streams] self.pipes = [] self.pipesFiles = [] for _ in self.streams: #zmiana, zeby nie bylo duplikatow tmpName = "ffmpeg-{0}-{1}".format(os.getpid(), random.randint(0, 1000)) pipeFile = os.path.join(tempfile.gettempdir(), tmpName) if os.path.exists(pipeFile): tmpName += str(random.randint(0, 9)) #log.debug("pipeFile: {0}".format(pipeFile)) self.pipes.extend([NamedPipe(tmpName)]) self.pipesFiles.extend([pipeFile]) #log.debug("pipeFile: {0}".format(self.pipesFiles)) self.pipe_threads = [ threading.Thread(target=self.copy_to_pipe, args=(self, stream, np)) for stream, np in zip(self.streams, self.pipes) ] for np in self.pipes: self._cmd.extend(["-i", np.path]) else: self._cmd.extend(["-i", self.streams[0]]) self._cmd.extend(['-c:v', videocodec]) self._cmd.extend(['-c:a', audiocodec]) for m in maps: self._cmd.extend(["-map", str(m)]) if copyts: self._cmd.extend(["-copyts"]) self._cmd.extend(["-start_at_zero"]) for stream, data in metadata.items(): for datum in data: self._cmd.extend(["-metadata:{0}".format(stream), datum]) self._cmd.extend(['-f', ofmt, outpath]) log.debug("ffmpeg command: {0}".format(' '.join(self._cmd))) self.close_errorlog = False if session.options.get("ffmpeg-verbose"): self.errorlog = sys.stderr elif session.options.get("ffmpeg-verbose-path"): self.errorlog = open(session.options.get("ffmpeg-verbose-path"), "w") self.close_errorlog = True else: self.errorlog = devnull()