經過大量的研究,我找到了一個解決方案。雖然沒有獲得音頻的鏈接,但我創建了一個無形地播放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