a value between 0 (better) and 9 (worse)
for VBR or a specific bitrate like 128K
(default 5)
+ --remux-video FORMAT Remux the video to another container format
+ if necessary (currently supported: mp4|mkv,
+ target container format must support video
+ / audio encoding, remuxing may fail)
--recode-video FORMAT Encode the video to another format if
necessary (currently supported:
mp4|flv|ogg|webm|mkv|avi)
FISH_COMPLETION_TEMPLATE = 'devscripts/fish-completion.in'
EXTRA_ARGS = {
+ 'remux-video': ['--arguments', 'mp4 mkv', '--exclusive'],
'recode-video': ['--arguments', 'mp4 flv ogg webm mkv', '--exclusive'],
# Options that need a file parameter
_path_files
elif [[ ${prev} =~ ${diropts} ]]; then
_path_files -/
+ elif [[ ${prev} == "--remux-video" ]]; then
+ _arguments '*: :(mp4 mkv)'
elif [[ ${prev} == "--recode-video" ]]; then
_arguments '*: :(mp4 flv ogg webm mkv)'
else
opts.audioquality = opts.audioquality.strip('k').strip('K')
if not opts.audioquality.isdigit():
parser.error('invalid audio quality specified')
+ if opts.remuxvideo is not None:
+ if opts.remuxvideo not in ['mp4', 'mkv']:
+ parser.error('invalid video container format specified')
if opts.recodevideo is not None:
if opts.recodevideo not in ['mp4', 'flv', 'webm', 'ogg', 'mkv', 'avi']:
parser.error('invalid video recode format specified')
'preferredquality': opts.audioquality,
'nopostoverwrites': opts.nopostoverwrites,
})
+ if opts.remuxvideo:
+ postprocessors.append({
+ 'key': 'FFmpegVideoRemuxer',
+ 'preferedformat': opts.remuxvideo,
+ })
if opts.recodevideo:
postprocessors.append({
'key': 'FFmpegVideoConvertor',
'--audio-quality', metavar='QUALITY',
dest='audioquality', default='5',
help='Specify ffmpeg/avconv audio quality, insert a value between 0 (better) and 9 (worse) for VBR or a specific bitrate like 128K (default %default)')
+ postproc.add_option(
+ '--remux-video',
+ metavar='FORMAT', dest='remuxvideo', default=None,
+ help='Remux the video to another container format if necessary (currently supported: mp4|mkv, target container format must support video / audio encoding, remuxing may fail)')
postproc.add_option(
'--recode-video',
metavar='FORMAT', dest='recodevideo', default=None,
FFmpegMergerPP,
FFmpegMetadataPP,
FFmpegVideoConvertorPP,
+ FFmpegVideoRemuxerPP,
FFmpegSubtitlesConvertorPP,
)
from .xattrpp import XAttrMetadataPP
'FFmpegPostProcessor',
'FFmpegSubtitlesConvertorPP',
'FFmpegVideoConvertorPP',
+ 'FFmpegVideoRemuxerPP',
'MetadataFromTitlePP',
'XAttrMetadataPP',
]
return [path], information
+class FFmpegVideoRemuxerPP(FFmpegPostProcessor):
+ def __init__(self, downloader=None, preferedformat=None):
+ super(FFmpegVideoRemuxerPP, self).__init__(downloader)
+ self._preferedformat = preferedformat
+
+ def run(self, information):
+ path = information['filepath']
+ if information['ext'] == self._preferedformat:
+ self._downloader.to_screen('[ffmpeg] Not remuxing video file %s - already is in target format %s' % (path, self._preferedformat))
+ return [], information
+ options = ['-c', 'copy']
+ prefix, sep, ext = path.rpartition('.')
+ outpath = prefix + sep + self._preferedformat
+ self._downloader.to_screen('[' + 'ffmpeg' + '] Remuxing video from %s to %s, Destination: ' % (information['ext'], self._preferedformat) + outpath)
+ self.run_ffmpeg(path, outpath, options)
+ information['filepath'] = outpath
+ information['format'] = self._preferedformat
+ information['ext'] = self._preferedformat
+ return [path], information
+
+
class FFmpegVideoConvertorPP(FFmpegPostProcessor):
def __init__(self, downloader=None, preferedformat=None):
super(FFmpegVideoConvertorPP, self).__init__(downloader)