From: Thomas Fillon Date: Thu, 28 Nov 2013 16:38:51 +0000 (+0100) Subject: Encoder: Webm -> add video encoding support + test X-Git-Tag: 0.5.2~32 X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=8e207e996a12c1325f19d1326549539ae4bec9d3;p=timeside.git Encoder: Webm -> add video encoding support + test --- diff --git a/tests/test_encoding.py b/tests/test_encoding.py index 199e618..b8b30a8 100755 --- a/tests/test_encoding.py +++ b/tests/test_encoding.py @@ -33,7 +33,7 @@ class TestEncoding(unittest.TestCase): self.test_channels = True # Source - self.source_duration = 6. + self.source_duration = 10. def testWav(self): "Test wav encoding" @@ -45,7 +45,7 @@ class TestEncoding(unittest.TestCase): "Test vorbis encoding" from timeside.encoder.ogg import VorbisEncoder self.encoder_function = VorbisEncoder - self.delta = 0.2 + self.delta = 0.3 def testMp3(self): "Test mp3 encoding" @@ -58,7 +58,7 @@ class TestEncoding(unittest.TestCase): from timeside.encoder.m4a import AacEncoder self.encoder_function = AacEncoder self.test_channels = False - self.delta = 0.2 + self.delta = 0.3 def testFlac(self): "Test flac encoding" @@ -67,11 +67,24 @@ class TestEncoding(unittest.TestCase): self.delta = 0 def testWebm(self): - "Test webm encoding" + "Test webm encoding, audio only" + from timeside.encoder.webm import WebMEncoder + self.encoder_function = WebMEncoder + self.test_duration = False # webmmux encoder with streamable=true + # does not return a valid duration + + def testWebmVideo(self): + "Test webm encoding, video" from timeside.encoder.webm import WebMEncoder self.encoder_function = WebMEncoder self.test_duration = False # webmmux encoder with streamable=true # does not return a valid duration + file_extension = '.' + self.encoder_function.file_extension() + self.sink = tmp_file_sink(prefix=self.__class__.__name__, + suffix=file_extension) + self.encoder = self.encoder_function(self.sink, + overwrite=self.overwrite, + video=True) def tearDown(self): @@ -84,8 +97,10 @@ class TestEncoding(unittest.TestCase): if not hasattr(self, 'sink'): self.sink = tmp_file_sink(prefix=self.__class__.__name__, suffix=file_extension) - self.encoder = self.encoder_function(self.sink, - overwrite=self.overwrite) + + if not hasattr(self, 'encoder'): + self.encoder = self.encoder_function(self.sink, + overwrite=self.overwrite) # Run Pipe (decoder | self.encoder).run() diff --git a/timeside/core.py b/timeside/core.py index aee97ac..6cb0131 100644 --- a/timeside/core.py +++ b/timeside/core.py @@ -289,11 +289,11 @@ class ProcessPipe(object): # setup/reset processors and configure properties throughout the pipe for item in items: + item.source_mediainfo = source.mediainfo() item.setup(channels=last.channels(), samplerate=last.samplerate(), blocksize=last.blocksize(), totalframes=last.totalframes()) - item.source_mediainfo = source.mediainfo() last = item # now stream audio data along the pipe diff --git a/timeside/encoder/webm.py b/timeside/encoder/webm.py index 7ee7010..ba6c9ee 100644 --- a/timeside/encoder/webm.py +++ b/timeside/encoder/webm.py @@ -29,20 +29,22 @@ class WebMEncoder(GstEncoder): """ gstreamer-based webm encoder and muxer """ implements(IEncoder) - def __init__(self, output, streaming = False, overwrite = False): + def __init__(self, output, streaming=False, overwrite=False, video=False): super(WebMEncoder, self).__init__(output, streaming, overwrite) - self.video = False + self.video = video @interfacedoc def setup(self, channels=None, samplerate=None, blocksize=None, totalframes=None): super(WebMEncoder, self).setup(channels, samplerate, blocksize, totalframes) - + from numpy import ceil + framerate = 30 + num_buffers = ceil(self.mediainfo()['duration'] * + framerate).astype(int) if self.video: - self.pipe = '''videotestsrc pattern=black ! ffmpegcolorspace - ! queue ! vp8enc speed=2 threads=4 quality=9.0 ! queue ! mux. - appsrc name=src ! queue ! audioconvert ! vorbisenc quality=0.9 ! queue ! mux. - webmmux streamable=true name=mux - ''' + self.pipe = '''appsrc name=src ! queue ! audioconvert ! vorbisenc quality=0.9 ! queue ! mux. + videotestsrc pattern=black num_buffers=%d ! ffmpegcolorspace ! queue ! vp8enc speed=2 threads=4 quality=9.0 ! queue ! mux. + webmmux streamable=true name=mux + ''' % num_buffers else: self.pipe = ''' appsrc name=src ! queue ! audioconvert ! vorbisenc quality=0.9 ! queue !