经过大量的研究,我找到了一个解决方案。虽然没有获得音频的链接,但我创建了一个无形地播放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
因此,我分析实际的视频页面以获取长度。有点慢,但工作没有失败。
我怀疑youtube分别存储音频和视频,所以不可能只读取音频。另外,我认为这可能违反服务条款。 – aland