2012-05-13 136 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。聲音嵌入在視頻文件中;你幾乎不得不下載整個視頻才能恢復音軌。