2012-05-13 8 views
6

Ich bin schon seit einiger Zeit im Rahmen eines größeren Projekts, um eine Möglichkeit zu finden Youtube AUDIO in eine Anwendung zu streamen, ohne die entsprechende Datei herunterzuladen.Erzeugen von Links zu Youtube Audio

Was ich habe ab sofort ist ein Programm, das das Video mit einem Web-Service wie saveyoutube.com herunterlädt. Dies ist jedoch nicht sehr effizient. Das Herunterladen des Videos selbst dauert ungefähr 5 Minuten, und der Client kann es leid sein zu warten und einfach die Youtube-Schnittstelle direkt zu benutzen. Außerdem möchte der Benutzer des Programms auf ein 4 Stunden langes Album zugreifen. Sie wollen jedoch nur einen bestimmten Teil davon hören, um der Erklärung willen, sagen wir, dass der Benutzer das Video ab 2 Stunden sehen möchte (zum Beispiel, nehmen Sie this Video).

Es besteht kein Zweifel, dass mein Programm auch dafür funktioniert, aber es dauert ungefähr 20 Minuten, bis die Musik zu spielen beginnt (da das Herunterladen von 2 Stunden Audio viel Zeit in Anspruch nimmt). Außerdem habe ich bis zu 400 Megabyte Speicherplatz auf dem Computer des Benutzers verbraucht. Klar, kann ich die Datei in einem temporären Ordner speichern und löschen, nachdem sie das Programm schließen, aber das führt zu mehr Probleme:

  1. Wenn das Programm abstürzt bei 1 Minute vor dem Download, weil der Mangel vollständig von Raum (wer weiß, was der Klient auf seinem Computer hat), hätte der Klient etwa 20 Minuten seiner Zeit umsonst verschwendet.

  2. Sagen Sie das nächste Mal, wenn sie das Programm laden, wollen sie das gleiche tun. Dann müssen sie noch 20 Minuten warten. Dies könnte durch Hinzufügen einer "Audio speichern" -Schaltfläche zu der Schnittstelle verhindert werden, wodurch verhindert würde, dass das Programm die Datei beim Schließen löscht. Der erste Impass bleibt jedoch.

So, hier ist meine Frage: Gibt es eine Möglichkeit, Links zu dem AUDIO von Youtube Videos zu generieren? Gibt es eine Möglichkeit, eine URL wie http://www.youtube.com/watch?v=AOARzA8nGu4.(AUDIOEXTENSION) zu erhalten? Auf diese Weise wäre es einfacher, zu einem Teil des Soundtracks zu springen, ohne dass ein Download erforderlich ist. Ich habe das schon eine ganze Weile recherchiert, und bis jetzt, was einer Antwort am nächsten kommt, war saveyoutube: ein MP3-Downloader.

Ist das überhaupt möglich? Wenn nicht, gibt es eine Alternative zu Youtube, zu der das gemacht werden kann? Ich habe mir die Youtube API angeschaut, aber das ist wieder ungünstig, da wie bei den meisten Google-Diensten die API limitiert ist.

Programmiersprache ist keine Einschränkung, da der meiste Code übersetzt werden kann. Eine Python- oder C/C++ - Lösung wäre jedoch ideal.

Vielen Dank im Voraus!

P.S. Ich habe einen Server dafür, aber ich würde sehr ungern alle Youtube Videos auf den Server herunterladen. Wenn es jedoch eine andere Lösung gibt, die einen Server beinhaltet, der nicht das gesamte Youtube-System auseinandernimmt, wäre das großartig.

+0

Ich bezweifle, dass Youtube Audio und Video getrennt speichert, so dass es unmöglich ist, nur Audio zu holen. Außerdem denke ich, dass es die Nutzungsbedingungen verletzen könnte. – aland

Antwort

6

Nach einer beträchtlichen Menge von mehr Forschung fand ich eine Lösung. Ich habe zwar keine LINKS zum Audio erhalten, aber ich habe ein Programm erstellt, das das YouTube-Video unsichtbar abspielt und somit die "AUDIO" abspielen kann, was meine Absicht war.

Das Programm, das ich schrieb, verwendet viele der bereits verfügbaren Python-Module, um das Ziel zu erreichen.

Ich fand this Link, der erklärt, wie Flash in eine Python-Anwendung eingebettet wird, über wxPython (gefunden here). Es hat ein activexwrapper-Modul, mit dem ich den Flash gespielt habe.

Code:

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() 

, dass das Video spielt. In meinem Fall wollte ich die GUI nicht haben, also löschte ich die "frame.Show(True)" Linie. Versuchen Sie einen Link wie 'http://www.youtube.com/v/cP6lppXT-9U?version=3&hl=en_US', wie ich später erklären werde.

Dies ermöglicht jedoch kein Pausieren usw. Daher müssen andere Methoden verwendet werden.

automatische Wiedergabe zu starten: fügen Sie ein ‚&autoplay=1‘ an die URL

Hier ist, wie Sie anhalten können:

Sie können die Videolänge ährend die youtube-dl Modul erzeugen, und den Thread töten, wenn der Benutzer Pausen es. Sie würden jedoch die bereits gespielte Zeit speichern, und beim nächsten Mal würden Sie eine '&start=SECONDSPLAYED' hinzufügen, die das Video effektiv 'wieder aufnimmt'. Details dazu finden sich here.

Sie müssen auch die YouTube Embed URL verwenden, die die einzige ist, die funktioniert. Ein Beispiel sieht aus wie 'http://www.youtube.com/v/cP6lppXT-9U?version=3&hl=en_US'

Pros

  • Legal *
  • Schnelle Flash-Ladezeit (0,01 Sekunden Benchmark)
  • verschwendet keinen Platz
  • überspringen kann, ohne ein Ende zu setzen Download gesamte Datei
  • Unbegrenzte Nutzung, da YouTube API nicht verwendet wird

* Nach YouTube's terms of service, Abschnitt 4: Allgemeine Nutzung des Service-Berechtigungen und Einschränkungen, Abschnitt 3.

Sie verpflichten sich, den Zugriff auf Inhalte über jede Technologie oder andere Mittel als die Video-Wiedergabe Seiten der Der Dienst selbst, der einbettbare Player oder andere ausdrücklich autorisierte Mittel, die YouTube festlegen darf.

Durch das Programm verwendet eine alternative Schnittstelle, die vor allem den Eingebetteter Player verwendet, und tut nichts völlig illegal (wie das Herunterladen die Datei [meine erste Idee]).

Cons

  • Aufgrund der Abhängigkeit von ActiveX, wird diese Anwendung NICHT Arbeit auf jedem Betriebssystem aber Windows.
  • Von den Leuten, die ich kenne, benutzen wenige Internet Explorer. Leider benötigt dieses Programm den INTERNET EXPLORER Flash; nicht Mozzila Flash, Chrome Flash. Es muss unbedingt IE sein. Andernfalls wird die Anwendung geladen, aber das Video wird nicht angezeigt.
  • wx dauert sehr lange zu laden (ca. 10 Sekunden).

Abhängigkeiten

  • Aus offensichtlichen Gründen muss WxPython verwendet werden.
  • Python Comtypes (gefunden here) muss installiert sein. Andernfalls kann wxPython nicht mit ActiveX kommunizieren.

Hilfreiche Funktionen

Ich habe auch einige Funktionen, um den Prozess für jedermann zu beschleunigen, die die gleiche Sache tut.

Alle sind nette Einleiner Lambdas.

generate_link: Gibt die YouTube-Einbettungs-URL bei einer normalen YouTube-URL zurück.

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: Akzeptiert die Stunde, Minute und Sekunde, wo ein Video zu starten und gibt einen Link.

start_from = lambda hours, minutes, seconds, link: link + '&start=' + str((hours*60*60)+(minutes*60)+seconds) 

Autoplay: Wahrscheinlich die einfachste, setzt Autoplay auf True und gibt einen Link zurück. Es akzeptiert einen Link.

autoplay = lambda link: link + '&autoplay=1'  

video_length: Gibt die Länge des Videos zurück. Nützlich, akzeptiert YouTube-Link. Diese

video_length = lambda video: re.compile(r'length_seconds=(.*?)\\', re.S).search(urllib2.urlopen(video).read()).group(1).strip() 

soll als Abhilfe für die Tatsache, dass Videos lizenziert werden einen Fehler zurück

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 

Deshalb habe ich die aktuelle Video-Seite analysiert, um die Länge zu bekommen. Ein bisschen langsamer, aber funktioniert ohne Fehler.

4

YouTube verwendet H.264/MPEG-4 coding mit AAC-Stereo-Sound. Der Sound ist in die Videodatei eingebettet. Sie müssen ziemlich das gesamte Video herunterladen, um die Tonspuren wiederherzustellen.

Verwandte Themen