mirror of
https://github.com/yt-dlp/yt-dlp
synced 2024-12-27 21:59:17 +01:00
Added --remux-video option
Fixes #6996 - Supported formats declared: mp4, mkv - Added FFmpegVideoRemuxerPP as postprocessor - Added option to README and shell-completion scripts
This commit is contained in:
parent
52c50a10af
commit
efe87a10ae
7 changed files with 42 additions and 0 deletions
|
@ -396,6 +396,10 @@ Alternatively, refer to the [developer instructions](#developer-instructions) fo
|
||||||
a value between 0 (better) and 9 (worse)
|
a value between 0 (better) and 9 (worse)
|
||||||
for VBR or a specific bitrate like 128K
|
for VBR or a specific bitrate like 128K
|
||||||
(default 5)
|
(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
|
--recode-video FORMAT Encode the video to another format if
|
||||||
necessary (currently supported:
|
necessary (currently supported:
|
||||||
mp4|flv|ogg|webm|mkv|avi)
|
mp4|flv|ogg|webm|mkv|avi)
|
||||||
|
|
|
@ -14,6 +14,7 @@ FISH_COMPLETION_FILE = 'youtube-dl.fish'
|
||||||
FISH_COMPLETION_TEMPLATE = 'devscripts/fish-completion.in'
|
FISH_COMPLETION_TEMPLATE = 'devscripts/fish-completion.in'
|
||||||
|
|
||||||
EXTRA_ARGS = {
|
EXTRA_ARGS = {
|
||||||
|
'remux-video': ['--arguments', 'mp4 mkv', '--exclusive'],
|
||||||
'recode-video': ['--arguments', 'mp4 flv ogg webm mkv', '--exclusive'],
|
'recode-video': ['--arguments', 'mp4 flv ogg webm mkv', '--exclusive'],
|
||||||
|
|
||||||
# Options that need a file parameter
|
# Options that need a file parameter
|
||||||
|
|
|
@ -16,6 +16,8 @@ __youtube_dl() {
|
||||||
_path_files
|
_path_files
|
||||||
elif [[ ${prev} =~ ${diropts} ]]; then
|
elif [[ ${prev} =~ ${diropts} ]]; then
|
||||||
_path_files -/
|
_path_files -/
|
||||||
|
elif [[ ${prev} == "--remux-video" ]]; then
|
||||||
|
_arguments '*: :(mp4 mkv)'
|
||||||
elif [[ ${prev} == "--recode-video" ]]; then
|
elif [[ ${prev} == "--recode-video" ]]; then
|
||||||
_arguments '*: :(mp4 flv ogg webm mkv)'
|
_arguments '*: :(mp4 flv ogg webm mkv)'
|
||||||
else
|
else
|
||||||
|
|
|
@ -209,6 +209,9 @@ def _real_main(argv=None):
|
||||||
opts.audioquality = opts.audioquality.strip('k').strip('K')
|
opts.audioquality = opts.audioquality.strip('k').strip('K')
|
||||||
if not opts.audioquality.isdigit():
|
if not opts.audioquality.isdigit():
|
||||||
parser.error('invalid audio quality specified')
|
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 is not None:
|
||||||
if opts.recodevideo not in ['mp4', 'flv', 'webm', 'ogg', 'mkv', 'avi']:
|
if opts.recodevideo not in ['mp4', 'flv', 'webm', 'ogg', 'mkv', 'avi']:
|
||||||
parser.error('invalid video recode format specified')
|
parser.error('invalid video recode format specified')
|
||||||
|
@ -261,6 +264,11 @@ def _real_main(argv=None):
|
||||||
'preferredquality': opts.audioquality,
|
'preferredquality': opts.audioquality,
|
||||||
'nopostoverwrites': opts.nopostoverwrites,
|
'nopostoverwrites': opts.nopostoverwrites,
|
||||||
})
|
})
|
||||||
|
if opts.remuxvideo:
|
||||||
|
postprocessors.append({
|
||||||
|
'key': 'FFmpegVideoRemuxer',
|
||||||
|
'preferedformat': opts.remuxvideo,
|
||||||
|
})
|
||||||
if opts.recodevideo:
|
if opts.recodevideo:
|
||||||
postprocessors.append({
|
postprocessors.append({
|
||||||
'key': 'FFmpegVideoConvertor',
|
'key': 'FFmpegVideoConvertor',
|
||||||
|
|
|
@ -790,6 +790,10 @@ def parseOpts(overrideArguments=None):
|
||||||
'--audio-quality', metavar='QUALITY',
|
'--audio-quality', metavar='QUALITY',
|
||||||
dest='audioquality', default='5',
|
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)')
|
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(
|
postproc.add_option(
|
||||||
'--recode-video',
|
'--recode-video',
|
||||||
metavar='FORMAT', dest='recodevideo', default=None,
|
metavar='FORMAT', dest='recodevideo', default=None,
|
||||||
|
|
|
@ -11,6 +11,7 @@ from .ffmpeg import (
|
||||||
FFmpegMergerPP,
|
FFmpegMergerPP,
|
||||||
FFmpegMetadataPP,
|
FFmpegMetadataPP,
|
||||||
FFmpegVideoConvertorPP,
|
FFmpegVideoConvertorPP,
|
||||||
|
FFmpegVideoRemuxerPP,
|
||||||
FFmpegSubtitlesConvertorPP,
|
FFmpegSubtitlesConvertorPP,
|
||||||
)
|
)
|
||||||
from .xattrpp import XAttrMetadataPP
|
from .xattrpp import XAttrMetadataPP
|
||||||
|
@ -35,6 +36,7 @@ __all__ = [
|
||||||
'FFmpegPostProcessor',
|
'FFmpegPostProcessor',
|
||||||
'FFmpegSubtitlesConvertorPP',
|
'FFmpegSubtitlesConvertorPP',
|
||||||
'FFmpegVideoConvertorPP',
|
'FFmpegVideoConvertorPP',
|
||||||
|
'FFmpegVideoRemuxerPP',
|
||||||
'MetadataFromTitlePP',
|
'MetadataFromTitlePP',
|
||||||
'XAttrMetadataPP',
|
'XAttrMetadataPP',
|
||||||
]
|
]
|
||||||
|
|
|
@ -349,6 +349,27 @@ class FFmpegExtractAudioPP(FFmpegPostProcessor):
|
||||||
return [path], information
|
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):
|
class FFmpegVideoConvertorPP(FFmpegPostProcessor):
|
||||||
def __init__(self, downloader=None, preferedformat=None):
|
def __init__(self, downloader=None, preferedformat=None):
|
||||||
super(FFmpegVideoConvertorPP, self).__init__(downloader)
|
super(FFmpegVideoConvertorPP, self).__init__(downloader)
|
||||||
|
|
Loading…
Reference in a new issue