【问题标题】:download only audio from youtube video using youtube-dl in python script在 python 脚本中使用 youtube-dl 仅从 youtube 视频下载音频
【发布时间】:2015-02-12 22:16:30
【问题描述】:

有一个fewposts 来自 YouTube 使用 youtube-dl,但它们都不是具体的或太有用的。我想知道从 Python 脚本中执行此操作的最佳方法是什么。

例如,这里是下载视频的 README 示例:

import youtube_dl

ydl_opts = {}
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
    ydl.download(['http://www.youtube.com/watch?v=BaW_jenozKc'])

显然,如果您只关心音频,您宁愿不下载整个视频...

youtube-dl 来源非常有用(即,不是很有帮助)。

对如何编写脚本有什么建议吗?

【问题讨论】:

    标签: python audio youtube youtube-dl


    【解决方案1】:

    在developer instructions 中继续阅读修改示例:

    from __future__ import unicode_literals
    import youtube_dl
    
    
    ydl_opts = {
        'format': 'bestaudio/best',
        'postprocessors': [{
            'key': 'FFmpegExtractAudio',
            'preferredcodec': 'mp3',
            'preferredquality': '192',
        }],
    }
    with youtube_dl.YoutubeDL(ydl_opts) as ydl:
        ydl.download(['http://www.youtube.com/watch?v=BaW_jenozKc'])
    

    如果可能/支持,这将下载音频文件。如果文件不是 mp3,则使用ffmpeg 或avconv 将下载的文件转换为 mp3。有关详细信息,请参阅当前版本的 youtube-dl 中的 format 和 postprocessors 文档条目。

    【讨论】:

    • 我已经尝试了上述但得到以下错误:错误:音频转换失败:文件:mp3:无效参数。如果我尝试使用“最佳”而不是 mp3,我会得到相同的错误,但使用的是 file:opus。我可以很好地使用 youtube-dl 命令行工具,但是在 python 中执行时,我似乎无法让后处理器位工作。有什么想法吗?
    • @stackPusher 这听起来像是 ffmpeg、avconv 的问题。请发布一个新问题,并包含您的整个演示程序(您实际运行的程序,可以与此答案相同)以及激活详细时的整个输出 - 第一行应该沿着 [debug] System config: [] 的行.
    • 谢谢我发布了一个新问题,其中包含详细信息:stackoverflow.com/questions/39665160/…。如果你想让我从这篇文章中删除我的 cmets,只需说出这个词。谢谢!
    • @phihag 如何让你的脚本避免任何后期处理? (也就是按照youtube原来的格式下载,避免重新编码)
    • @knocte 您是否尝试通过将postprocessors 设置为[] 来删除后处理器?
    【解决方案2】:

    使用postprocessors 参数。所有可用后处理器的列表可以在here找到。

    如果您想传递其他 ffmpeg 或 avconv 选项,这些选项不包含在 youtube-dl 库中(如音频比特率 - ffmpeg 中的 -ar <BR>),请将 postprocessor_args 添加为列表。

    您也可以更喜欢 ffmpeg 而不是 avconv 将 prefer_ffmpeg 设置为 True。

    并保留原始和转换后的音频文件集 'keepvideo' 到 True。

    例如:

    from __future__ import unicode_literals
    import youtube_dl
    
    ydl_opts = {
        'format': 'bestaudio/best',
        'postprocessors': [{
            'key': 'FFmpegExtractAudio',
            'preferredcodec': 'wav',
            'preferredquality': '192'
        }],
        'postprocessor_args': [
            '-ar', '16000'
        ],
        'prefer_ffmpeg': True,
        'keepvideo': True
    }
    
    with youtube_dl.YoutubeDL(ydl_opts) as ydl:
        ydl.download(['http://www.youtube.com/watch?v=BaW_jenozKc'])
    

    所有可用选项的列表在documentation 中。你可以阅读ffmpeg后处理器的代码here。

    还有一个不太复杂的例子在他们的 GitHub README。

    【讨论】:

    • 注意:如果您放弃对postprocessor_args 的重新采样,例如-ar,并且您的preferredcodec 是ffprobe 和aac、@987654345 中所述的实际文件编解码器@、mp3、vorbis 或 opus,那么 acodec 是 copy / 自动跳过重新编码,您可以节省大量 CPU 资源。 See here. 例如ydl_opts = { 'format': '250', 'postprocessors': [{'key': 'FFmpegExtractAudio','preferredcodec': 'opus'}]}
    【解决方案3】:

    我本来不打算回答这个问题,其实我是来给自己找答案的。在我的搜索中,这些答案都没有令人满意的效果。不过,我确实找到了一个非常适合我的替代方案,我觉得我应该分享它:模块 pytube。

    from pytube import YouTube
    import os
    
    yt = YouTube('YOUR LINK HERE')
    
    video = yt.streams.filter(only_audio=True).first()
    
    out_file = video.download(output_path=".")
    
    base, ext = os.path.splitext(out_file)
    new_file = base + '.mp3'
    os.rename(out_file, new_file)
    

    【讨论】:

      【解决方案4】:

      由于 youtube_dl 已停产,您可以使用 tube_dl

      用法:

      pip install tube_dl
      from tube_dl import Youtube
      

      在您的情况下,这是仅获取音频的方法。

      from tube_dl import Youtube
      youtube('Your URL').formats.filter(only_audio=True)[0]**.download(convert='mp3')
      

      ** 你可以使用你喜欢的质量而不是 0。 只需输入:

      print(youtube('Your URL').formats.filter(only_audio=True))
      

      这将打印所有支持的音频。然后指定您选择的索引并下载

      编辑:

      filter 已弃用,请改用filter_by

      【讨论】:

      • 您好,我想让您知道,截至 21 年 9 月 29 日,这似乎下载了无法打开的损坏文件。它还需要您 pip 安装各种其他模块,例如 moviepy 和 eyed3
      • @Matt 需要moviepy来将文件转换为音频,而eyed3可以将元数据添加到音频文件中。关于损坏的文件,您可以在 github 上提出问题。 github.com/shekharchander/tube_dl
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-16
      • 2018-09-26
      • 1970-01-01
      • 2021-06-26
      • 1970-01-01
      相关资源
      最近更新 更多