【问题标题】:Generating Links to Youtube Audio生成指向 Youtube 音频的链接
【发布时间】:2012-05-13 18:45:47
【问题描述】:

我已经有一段时间了,作为一个更大项目的一部分,我试图找到一种将 Youtube AUDIO 流式传输到应用程序而不下载相应文件的方法。

我现在拥有的是一个使用网络服务(例如saveyoutube.com)下载视频的程序。然而,这不是很有效。视频本身的下载需要5分钟左右,客户端可能会厌倦等待,直接使用Youtube界面。此外,假设该程序的用户希望访问一个 4 小时长的专辑。但是,他们只想听其中的特定部分,为了解释起见,假设用户希望从 2 小时开始观看视频(例如,观看 this 视频)。

毫无疑问,我的程序也适用于此,但开始播放音乐大约需要 20 分钟(因为下载 2 小时的音频需要很长时间)。此外,到那时我已经用完了用户计算机上大约 400 兆字节的空间。当然,我可以将文件存储在临时文件夹中,并在他们关闭程序后将其删除,但这会导致更多问题:

  1. 如果程序在下载完成前 1 分钟由于空间不足而崩溃(谁知道客户端计算机上有什么),客户端将白白浪费大约 20 分钟的时间。

  2. 说下次他们加载程序时,他们希望做同样的事情。然后他们必须再等 20 分钟。这可以通过在界面中添加一个“保存音频”按钮来解决,这可以防止程序在关闭时删除文件。然而,第一个僵局仍然存在。

所以这是我的问题:有没有办法生成指向 AUDIO 的链接 YouTube视频?有没有办法获得像http://www.youtube.com/watch?v=AOARzA8nGu4.(AUDIOEXTENSION)这样的网址?这样跳到配乐中的一部分会更容易,并且不需要下载。我已经研究了很长一段时间,到目前为止,最接近答案的是 saveyoutube:一个 mp3 下载器。

这甚至可能吗?如果没有,是否有替代 Youtube 的方法可以做到这一点?我已经查看了Youtube API,但这又是不利的,就像大多数 Google 服务一样,它的 API 是有限的。

编程语言不受限制,因为大多数代码都可以翻译。但是,Python 或 C/C++ 解决方案将是理想的。

提前致谢!

附:我有一个可用的服务器,但我非常不愿意将所有 Youtube 视频下载到服务器上。但是,如果有另一种解决方案涉及不涉及盗取整个 Youtube 的服务器,那就太好了。

【问题讨论】:

  • 我怀疑 youtube 将音频和视频分开存储,所以不可能只获取音频。另外,我认为这可能违反服务条款。

标签: python audio hyperlink youtube


【解决方案1】:

经过大量研究后,我找到了解决方案。虽然没有获得音频的链接,但我创建了一个程序,可以无形地播放 YouTube 视频,因此可以播放“音频”,这是我的意图。

我编写的程序使用了很多已经可用的 Python 模块来实现目标。

我找到了this 链接,它解释了如何通过 wxPython 将 Flash 嵌入 Python 应用程序(找到 here)。它有一个 activexwrapper 模块,我用它来播放 Flash。

代码:

import  wx

if wx.Platform == '__WXMSW__':
    from wx.lib.flashwin import FlashWindow


class MyPanel(wx.Panel):
    def __init__(self, parent, id):
        wx.Panel.__init__(self, parent, -1)
        self.pdf = None

        sizer = wx.BoxSizer(wx.VERTICAL)
        btnSizer = wx.BoxSizer(wx.HORIZONTAL)

        self.flash = FlashWindow(self, style=wx.SUNKEN_BORDER)
        sizer.Add(self.flash, proportion=1, flag=wx.EXPAND)
        #sizer.Hide(0)

        self.SetSizer(sizer)
        self.SetAutoLayout(True)
        print "Importing Flash..."
        self.flash.LoadMovie(0, raw_input('Copy link for flash: '))
        #Used to load a flash file. You may also give a location of a specific file on disk.
        print "Done."

app = wx.PySimpleApp()
# create window/frame, no parent, -1 is default ID, title, size
# change size as needed
frame = wx.Frame(None, -1, "Flash Stream", size = (500, 400))
# make instance of class, -1 is default ID
MyPanel(frame, -1)
# show frame
frame.Show(True)
#comment if you don't want to see the ui
print "Started"
# start event loop
app.MainLoop()

播放视频。就我而言,我不想拥有 GUI,所以我删除了 'frame.Show(True)' 行。如果您想对其进行测试,请尝试使用“http://www.youtube.com/v/cP6lppXT-9U?version=3&hl=en_US”之类的链接,我稍后会解释。

但是,这不允许暂停等。因此,必须使用其他方法。

要开始自动播放:在 URL 中添加“&autoplay=1

您可以通过以下方式暂停:

您可以在youtube-dl 模块中生成视频长度,并在用户暂停时终止线程。但是,您将存储已播放的时间,下一次,您将添加一个“&start=SECONDSPLAYED”,这将有效地“恢复”视频。详情请见here

此外,您必须使用 YouTube 嵌入网址,这是唯一有效的网址。一个例子看起来像'http://www.youtube.com/v/cP6lppXT-9U?version=3&hl=en_US'

优点

  • 法律*
  • 快速闪存加载时间(0.01 秒基准测试)
  • 不浪费空间
  • 无需下载整个文件即可跳到结尾
  • 由于不使用 YouTube API,可无限使用

*根据YouTube's terms of service,第 4 节:服务的一般使用 - 权限和限制,第 3 小节。

您同意不通过服务本身的视频播放页面、可嵌入播放器或 YouTube 可能指定的其他明确授权方式以外的任何技术或方式访问内容。

由于该程序使用了一个主要使用可嵌入播放器的替代界面,并且没有做任何完全非法的事情(比如下载文件[我的第一个想法])。

缺点

  • 由于依赖于 ActiveX,此应用程序将在 Windows 以外的任何操作系统上运行。
  • 据我所知,很少有人使用 Internet Explorer。唉,这个程序需要安装 INTERNET EXPLORER Flash;不是 Mozzila Flash,Chrome Flash。它绝对必须是 IE。否则,应用程序将加载,但视频不会出现。
  • wx 需要很长时间才能加载(大约 10 秒)。

依赖关系

  • 出于显而易见的原因,必须使用 wxPython。
  • 必须安装 Python comtypes(找到 here)。否则,wxPython 无法与 ActiveX 通信。

实用功能

我还创建了一些函数来为正在做同样事情的人加快进程。

都是不错的单行 lambda。

generate_link:返回 YouTube 嵌入 URL,给定一个普通的 YouTube URL。

generate_link = lambda link: 'http://www.youtube.com/v/'+re.compile(r'watch\?v=(.*?)(?:&|$)').search(link).group(1)+'?version=3&hl=en_US'

start_from:接受开始视频的小时、分钟和秒,并返回一个链接。

start_from = lambda hours, minutes, seconds, link: link + '&start=' + str((hours*60*60)+(minutes*60)+seconds)

autoplay:可能是最简单的,将 autoplay 设置为 true,并返回一个链接。它接受一个链接。

autoplay = lambda link: link + '&autoplay=1'    

video_length:返回视频的长度。有用,接受 YouTube 链接。

video_length = lambda video: re.compile(r'length_seconds=(.*?)\\', re.S).search(urllib2.urlopen(video).read()).group(1).strip()

这是为了解决许可视频将返回错误这一事实的解决方法

status=fail&errorcode=150&reason=This+video+contains+content+from+WMG.+It+is+restricted+from+playback+on+certain+sites.%3Cbr%2F%3E%3Cu%3E%3Ca+href%3D%27http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DVALbSjayAgw%26feature%3Dplayer_embedded%27+target%3D%27_blank%27%3EWatch+on+YouTube%3C%2Fa%3E%3C%2Fu%3E

因此,我解析了实际的视频页面以获取长度。有点慢,但可以正常工作。

【讨论】:

    【解决方案2】:

    YouTube 使用带有 AAC 立体声的 H.264/MPEG-4 coding。声音嵌入在视频文件中;您几乎必须下载整个视频才能恢复音轨。

    【讨论】:

      猜你喜欢
      • 2015-02-04
      • 2012-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多