Как заставить 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 вашего скрипта поиск исходных файлов.

Другие вопросы по тегам