经过大量研究后,我找到了解决方案。虽然没有获得音频的链接,但我创建了一个程序,可以无形地播放 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
因此,我解析了实际的视频页面以获取长度。有点慢,但不会失败。