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