Как заставить youtube-dl сохранять аудио в формате Opus как файлы *.opus
Я просто хочу скачать аудио и видео потоки этого видео. (ПРЕДУПРЕЖДЕНИЕ: Материнские оскорбления впереди) Я всегда запрещаю такие ошибки:
[youtube] hcQlNng606I: Downloading webpage
[youtube] hcQlNng606I: Downloading video info webpage
[youtube] hcQlNng606I: Extracting video information
[youtube] hcQlNng606I: Downloading MPD manifest
[download] YO MAMA! Star Wars Jokes-hcQlNng606I.webm has already been downloaded
[download] 100% of 4.78MiB
Почему это происходит?
Потому что после того, как youtube-dl загрузит либо аудио Opus, либо видео VP9, оно будет сохранено как *.webm.
Мой первый обходной путь для этого состоит в том, чтобы загрузить их в другой каталог, и это (для меня) не очень эффективно.
Так как же заставить его писать аудио Opus как *.opus вместо *.webm?
Дополнительные примечания. Почему мне нравится загружать форматы VP9/Opus на YouTube и объединять их позже в ffmpeg? VP9/Opus лучше, чем H264/AAC.
1 ответ
Если вы хотите сохранить аудиофайл и видеофайл, используйте -k в качестве одного из аргументов. Ex.: youtube-dl -k youtube.com/watch/somevideo
если вы хотите сохранить ваш аудио файл как.opus использовать youtube-dl --audio-format opus youtube.com/watch/somevideo
Некоторые дополнительные заметки:
Если вы хотите, чтобы звук был лучшим, вы можете использовать его youtube-dl --audio-quality 0 youtube.com/watch/somevid
если вы хотите иметь лучшее качество звука и youtube-dl -x youtube.com/watch/somevid
извлечь аудио напрямую. Если вы хотите больше информации обо всем этом, просто используйте youtube-dl -h
это даст вам сообщение помощи, и чем больше вы будете читать, тем меньше будет запутанного.
--audio-format opus
всегда конвертирует в opus, вне зависимости от формата загруженного файла. Так что обычно это не то, что вам нужно. Я написал скрипт на Python для решения этой проблемы. Он был написан в предположении, что вам нужен только звук. Это работает
youtube-dl -if bestaudio <url>
, то, если какой-либо из загруженных файлов имеет формат.webm, он предполагает, что это opus, и использует ffmpeg для преобразования контейнера без потерь в.opus. (The
-i
для загрузки целых плейлистов. Часто в плейлисте есть несколько файлов, которые не удается загрузить по какой-либо причине.)
#!/usr/bin/env python
# Youtube actually hosts audio-only opus tracks, but you can only get them
# in the webm container, which many music players, including quodlibet, don't
# know what to do with. This script downloads the track, then converts it with
# zero loss to the opus container using ffmpeg's `-acodec copy` feature.
from sys import *
from subprocess import call
from os.path import splitext
from os import remove, walk, listdir
from tempfile import TemporaryDirectory
from shutil import move
url = argv[1]
with TemporaryDirectory(prefix='yta-') as tempdir:
call(['env', '-C', tempdir, 'youtube-dl', '-if', 'bestaudio', url])
for tempdir, dirs, files in walk(tempdir):
for fn in files:
path = tempdir+'/'+fn
name, ext = splitext(path)
if ext == '.webm':
if call([
'ffmpeg', '-hide_banner',
'-i', path,
'-acodec', 'copy',
name+'.opus'
]) == 0:
remove(path)
for node in listdir(tempdir):
move(tempdir+'/'+node, '.')
РЕДАКТИРОВАТЬ: Теперь я понимаю, я неправильно понял ваш вопрос. Лучший способ избежать конфликтов имен файлов между запусками youtube-dl - это изменить шаблон выходного имени файла. По умолчанию, если
--output
не указано
%(title)s-%(id)s.%(ext)s
. Что тебе следует делать, так это делать
--output %(title)s-%(id)s-audio.%(ext)s
для получения звука и
--output %(title)s-%(id)s-video.%(ext)s
для получения видео. Увидеть
OUTPUT TEMPLATE
в
man youtube-dl
для большего. Вы даже можете уничтожить
%(title)
и т. д. полностью и просто скажи
--output audio.webm
и т.д., чтобы облегчить этапу ffmpeg вашего скрипта поиск исходных файлов.