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)
|
||||
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)
|
||||
|
|
|
@ -14,6 +14,7 @@ FISH_COMPLETION_FILE = 'youtube-dl.fish'
|
|||
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
|
||||
|
|
|
@ -16,6 +16,8 @@ __youtube_dl() {
|
|||
_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
|
||||
|
|
|
@ -209,6 +209,9 @@ def _real_main(argv=None):
|
|||
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')
|
||||
|
@ -261,6 +264,11 @@ def _real_main(argv=None):
|
|||
'preferredquality': opts.audioquality,
|
||||
'nopostoverwrites': opts.nopostoverwrites,
|
||||
})
|
||||
if opts.remuxvideo:
|
||||
postprocessors.append({
|
||||
'key': 'FFmpegVideoRemuxer',
|
||||
'preferedformat': opts.remuxvideo,
|
||||
})
|
||||
if opts.recodevideo:
|
||||
postprocessors.append({
|
||||
'key': 'FFmpegVideoConvertor',
|
||||
|
|
|
@ -790,6 +790,10 @@ def parseOpts(overrideArguments=None):
|
|||
'--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,
|
||||
|
|
|
@ -11,6 +11,7 @@ from .ffmpeg import (
|
|||
FFmpegMergerPP,
|
||||
FFmpegMetadataPP,
|
||||
FFmpegVideoConvertorPP,
|
||||
FFmpegVideoRemuxerPP,
|
||||
FFmpegSubtitlesConvertorPP,
|
||||
)
|
||||
from .xattrpp import XAttrMetadataPP
|
||||
|
@ -35,6 +36,7 @@ __all__ = [
|
|||
'FFmpegPostProcessor',
|
||||
'FFmpegSubtitlesConvertorPP',
|
||||
'FFmpegVideoConvertorPP',
|
||||
'FFmpegVideoRemuxerPP',
|
||||
'MetadataFromTitlePP',
|
||||
'XAttrMetadataPP',
|
||||
]
|
||||
|
|
|
@ -349,6 +349,27 @@ class FFmpegExtractAudioPP(FFmpegPostProcessor):
|
|||
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)
|
||||
|
|
Loading…
Reference in a new issue