2012-05-13 229 views
6

作为一个大型项目的一部分,我已经有一段时间了,试图找到一种将Youtube AUDIO串流到应用程序而不下载相应文件的方法。生成Youtube音频链接

我现在所拥有的是一个使用Web服务下载视频的程序,例如saveyoutube.com。但是,这并不是非常有效。视频本身的下载大约需要5分钟,客户可能会厌倦等待,直接使用Youtube界面。另外,说节目的用户希望访问一个4小时长的专辑。但是,为了便于说明,他们只想聆听其特定部分,可以说用户希望在2小时之后看到视频(例如,拍摄this视频)。

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

  1. 如果下载前1分钟的程序崩溃是由于缺乏完整空间(谁知道客户在他们的计算机上有什么),客户会浪费大约20分钟的时间。

  2. 说下次他们加载程序,他们希望做同样的事情。然后他们不得不再等20分钟。这可以通过向界面添加“保存音频”按钮来抵制,这会在程序关闭时阻止程序删除文件。然而,第一个障碍依然存在。

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

这甚至有可能吗?如果不是的话,Youtube有没有其他的选择可以做到这一点?我查看了Youtube API,但这又是不利的,就像大多数Google服务一样,它的API是有限的。

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

在此先感谢!

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

+0

我怀疑youtube分别存储音频和视频,所以不可能只读取音频。另外,我认为这可能违反服务条款。 – aland

回答

6

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

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

我发现了this链接,它解释了如何通过wxPython(找到here)将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

这里是你如何可以暂停:

您可以生成视频长度uring的youtube-dl模块,并杀死线程,当用户暂停它。但是,您将存储已播放的时间,并且下次您将添加'&start=SECONDSPLAYED',这将有效'恢复'视频。关于此的详细信息被发现here

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

优点

  • 法律*
  • 快速flash加载时间(0.01秒基准)
  • 不浪费空间
  • 可以跳到无需下载结束整个文件
  • 无限制使用,由于未使用YouTube API

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

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

由于该程序使用主要使用Embeddable Player的替代接口,并且不会做任何非法的非法操作(如下载文件[我的第一个想法])。

缺点

  • 由于基于ActiveX的依赖,这个应用程序将任何操作系统但Windows上不工作。
  • 从我认识的人中,很少使用Internet Explorer。唉,这个程序需要安装INTERNET EXPLORER Flash;不是Mozzila Flash,Chrome Flash。它绝对必须是IE。否则,应用程序将加载,但视频不会出现。
  • wx需要非常长的时间来加载(大约10秒)。

依赖

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

帮助功能

我也创造了一些功能,以加快的人谁在做同样的事情的过程。

所有的都是不错的单线lambda。

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

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) 

自动播放:大概是最简单的,自动播放设置为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 

因此,我分析实际的视频页面以获取长度。有点慢,但工作没有失败。

4

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