# HG changeset patch # User Thierry Florac # Date 1441724350 -7200 # Node ID 73e9b218db719ad892f5bcea06984475eb84231a # Parent 36c3db8c50a476da5d9a74a2a79e1d73214a649e Added default conversion filters diff -r 36c3db8c50a4 -r 73e9b218db71 src/pyams_media/converter.py --- a/src/pyams_media/converter.py Tue Sep 08 16:30:58 2015 +0200 +++ b/src/pyams_media/converter.py Tue Sep 08 16:59:10 2015 +0200 @@ -20,7 +20,8 @@ from tempfile import NamedTemporaryFile # import interfaces -from pyams_media.interfaces import IMediaVideoConverter, IMediaAudioConverter, IMediaConversionUtility, IMediaConverter +from pyams_media.interfaces import IMediaVideoConverter, IMediaAudioConverter, IMediaConversionUtility, IMediaConverter, \ + VIDEO_FRAME_SIZE # import packages from pyams_media.ffdocument import FFDocument @@ -56,7 +57,7 @@ if isinstance(media, str): media = StringIO(media) document = FFDocument(media) - self.add_filters(document) + self.add_common_filters(document) for loop in self.get_conversion_loop(document): if self.require_temp_file: output = NamedTemporaryFile(prefix='media_', suffix='.%s' % self.format) @@ -66,10 +67,14 @@ else: yield loop, document.get_output(self.format) + def add_common_filters(self, document): + pass + def add_filters(self, document): pass def get_conversion_loop(self, document): + self.add_filters(document) yield None @@ -81,6 +86,15 @@ class BaseAudioConverter(BaseMediaConverter): """Base media converter""" + def add_common_filters(self, document): + super(BaseAudioConverter, self).add_common_filters(document) + utility = query_utility(IMediaConversionUtility) + if utility is not None: + if utility.audio_sampling: + document.audiosampling(utility.audio_sampling) + if utility.audio_bitrate: + document.audiobitrate(utility.audio_bitrate) + @utility_config(name='audio/wav', provides=IMediaConverter) class WavAudioConverter(BaseAudioConverter): @@ -139,9 +153,22 @@ def get_conversion_loop(self, document): utility = query_utility(IMediaConversionUtility) if utility is not None: + # Get video resolution + video_info = document.get_stream_info('video') + if video_info is not None: + frame_width = video_info.get('width') + else: + frame_width = (0, 0) + # Check same resolution conversion + if video_info.get('format', {}).get('format_name') != self.format: + yield None + # Convert to lower resolutions + self.add_filters(document) for size in utility.video_frame_size or (): - document.size(size) - yield size + target_width = VIDEO_FRAME_SIZE.get(size, (0, 0))[0] + if target_width < frame_width: + document.size(size) + yield size @utility_config(name='video/x-flv', provides=IMediaConverter) @@ -151,6 +178,14 @@ label = _("FLV (Flash Video) video converter") format = 'flv' + def add_common_filters(self, document): + super(FlvVideoConverter, self).add_common_filters(document) + # Audio sampling is required by FLV converter! + utility = query_utility(IMediaConversionUtility) + if utility is not None: + if utility.video_audio_sampling: + document.audiosampling(utility.video_audio_sampling) + @utility_config(name='video/mp4', provides=IMediaConverter) class Mp4VideoConverter(BaseVideoConverter): @@ -160,6 +195,16 @@ format = 'mp4' require_temp_file = True + def add_common_filters(self, document): + effects = document.__effects__ + effects['filter:v'] = 'setsar=1/1' + effects['pix_fmt'] = 'yuv420p' + effects['preset:v'] = 'slow' + effects['profile:v'] = 'baseline' + effects['x264opts'] = 'level=3.0:ref=1' + effects['r:v'] = '25/1' + effects['movflags'] = '+faststart' + @utility_config(name='video/ogg', provides=IMediaConverter) class OggVideoConverter(BaseVideoConverter): @@ -176,6 +221,12 @@ label = _("WebM video converter") format = 'webm' + def add_common_filters(self, document): + effects = document.__effects__ + effects['filter:v'] = 'setsar=1/1' + effects['pix_fmt'] = 'yuv420p' + effects['r:v'] = '25/1' + class VideoConvertersVocabulary(SimpleVocabulary): """Video converters vocabulary"""