6

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

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

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

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

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

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

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

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

提前致谢!

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

4

2 回答 2

7

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

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

我找到了这个链接,它解释了如何通过 wxPython(在此处找到)将 Flash 嵌入到 Python 应用程序中。它有一个 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 ”之类的链接,我稍后会解释。

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

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

以下是暂停的方法:

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

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

优点

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

*根据YouTube 的服务条款,第 4 节:服务的一般使用 - 权限和限制,第 3 小节。

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

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

缺点

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

依赖项

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

有用的功能

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

都是不错的单线 lambdas。

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

因此,我解析了实际的视频页面以获取长度。有点慢,但不会失败。

于 2012-05-15T16:27:03.757 回答
4

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

于 2012-05-13T19:03:17.247 回答