2012-05-13 11 views
6

Od jakiegoś czasu znajduję się w ramach większego projektu, próbując znaleźć sposób na przesłanie strumienia Youtube AUDIO do aplikacji bez pobierania odpowiedniego pliku.Generowanie linków do Youtube Audio

Co mam od teraz to program, który pobiera wideo za pomocą usługi internetowej, takiej jak saveyoutube.com. To jednak nie jest zbyt wydajne. Pobieranie samego pliku trwa około 5 minut, a klient może się zmęczyć czekaniem i po prostu użyć interfejsu Youtube bezpośrednio. Powiedzmy też, że użytkownik programu chce uzyskać dostęp do 4-godzinnego albumu. Jednak chcą słuchać tylko określonej części, dla wyjaśnienia, powiedzmy, że użytkownik chce obejrzeć film wideo od 2 godzin (na przykład, weź wideo this).

Nie ma wątpliwości, że mój program działa również w tym celu, ale odtwarzanie muzyki trwa około 20 minut (pobieranie 2 godzin audio zajmuje dużo czasu). Poza tym zużyłem około 400 megabajtów przestrzeni na komputerze użytkownika. Jasne, że można zapisać plik w folderze tymczasowym i usunąć go po zamknięciu programu, ale to prowadzi do większej liczby problemów:

  1. przypadku awarii programu na 1 minutę przed zakończeniu pobierania z powodu braku (kto wie, co klient ma na swoim komputerze), klient straciłby około 20 minut swojego czasu na nic.

  2. Powiedz, że następnym razem, gdy wczytują program, chcą zrobić to samo. Następnie muszą poczekać KOLEJNE 20 minut. Można temu zaradzić, dodając do interfejsu przycisk "Zapisz dźwięk", który uniemożliwi programowi usunięcie pliku po jego zamknięciu. Jednak pierwszy impas pozostaje.

Więc tutaj jest moje pytanie: czy istnieje sposób, aby generować linki do audio filmy z YouTube? Czy istnieje sposób na uzyskanie adresu URL, takiego jak http://www.youtube.com/watch?v=AOARzA8nGu4.(AUDIOEXTENSION)? W ten sposób przejście do części ścieżki dźwiękowej byłoby łatwiejsze i nie wymagałoby pobierania. Badałem to od dłuższego czasu i jak dotąd najbardziej zbliżone do odpowiedzi WAS saveyoutube: downloader mp3.

Czy to jest możliwe? Jeśli nie, czy istnieje alternatywa dla Youtube, do której można to zrobić? Zajrzałem do Youtube API, ale to znowu jest niekorzystne, podobnie jak większość usług Google, jego interfejs API jest ograniczony.

Język programowania nie jest ograniczeniem, ponieważ większość kodu można przetłumaczyć. Jednak rozwiązanie Pythona lub C/C++ byłoby idealne.

Z góry dziękuję!

P.S. Mam do tego serwer, ale bardzo niechętnie pobierałbym wszystkie filmy z Youtube na serwer. Jeśli jednak istnieje inne rozwiązanie obejmujące serwer, który nie wymaga odrywania całego Youtube, byłoby świetnie.

+0

Wątpię, czy youtube przechowuje pliki audio i wideo oddzielnie, więc nie można pobrać tylko dźwięku. Myślę też, że może to naruszyć Warunki korzystania z usługi. – aland

Odpowiedz

6

Po wielu badaniach, znalazłem rozwiązanie. Nie uzyskując linków do audio, stworzyłem program, który odtwarza wideo z YouTube w sposób niewidoczny, a zatem może odtwarzać "AUDIO", co było moją intencją.

Program, który napisałem, wykorzystuje wiele dostępnych modułów Pythona do osiągnięcia celu.

Znalazłem link this, który wyjaśnia, jak osadzić Flasha w aplikacji Pythona, za pośrednictwem wxPython (znaleziono here). Posiada moduł activexwrapper, który wykorzystałem do odtwarzania Flasha.

Kod:

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

który odtwarza wideo. W moim przypadku nie chciałem mieć GUI, więc usunąłem linię "frame.Show(True)". Jeśli chcesz go przetestować, spróbuj linku takiego jak "http://www.youtube.com/v/cP6lppXT-9U?version=3&hl=en_US", co wyjaśnię później.

Nie pozwala to jednak na wstrzymanie itp. Dlatego należy zastosować inne metody.

Aby uruchomić autoodtwarzanie: dodać „&autoplay=1” do adresu URL

Oto jak można wstrzymać:

Można wygenerować długość wideo odczas moduł youtube-dl i zabić wątek gdy przerwy użytkowników to. Możesz jednak przechowywać czas już odtwarzany, a następnym razem dodać "&start=SECONDSPLAYED", który skutecznie "wznowi" wideo. Szczegóły na ten temat można znaleźć here.

MUSISZ też użyć URL do umieszczania na stronie YouTube, który jest jedynym, który działa. Przykładem wygląda 'http://www.youtube.com/v/cP6lppXT-9U?version=3&hl=en_US'

Pros

  • prawne *
  • Szybkie Flash Ładowanie Czas (0.01 sekund odniesienia)
  • nie marnuje przestrzeń
  • można pominąć na zakończenie bez pobierania cały plik
  • Nieograniczony użytek z powodu braku interfejsu API YouTube

* Według YouTube's terms of service, rozdział 4: Ogólne Korzystanie z Service-uprawnienia i ograniczenia, podpunkt 3.

Zgadzasz się nie dostęp do treści za pomocą dowolnej technologii lub środków innych niż stronach odtwarzania wideo z Sama usługa, Odtwarzacz Embedded lub inny wyraźnie dozwolony sposób może wyznaczyć serwis YouTube.

Z tego powodu program używa alternatywnego interfejsu, który głównie używa odtwarzacza Embedable, i nie robi niczego jawnie nielegalnego (np. Pobieranie pliku [mój pierwszy pomysł]).

Wady

  • Ze względu na uzależnienie od ActiveX, ta aplikacja będzie NIE praca na każdym systemie operacyjnym, ale system Windows.
  • Od osób, które znam, niewielu używa Internet Explorera. Niestety, ten program wymaga zainstalowania Flasha INTERNET EXPLORER; nie Mozzila Flash, Chrome Flash. To absolutnie musi być IE. W przeciwnym razie aplikacja zostanie załadowana, ale wideo nie pojawi się.
  • wx zajmuje bardzo dużo czasu (około 10 sekund).

Zależności

  • z oczywistych powodów, wxPython muszą być stosowane.
  • Należy zainstalować komety Pythona (znalezione here). W przeciwnym razie wxPython nie może komunikować się z ActiveX.

Pomocne funkcje

Stworzyłem również pewne funkcje, aby przyspieszyć ten proces dla każdego, kto robi to samo.

Wszystkie są ładne lambdas jedno-liniowy.

generate_link: zwraca adres URL strony YouTube z normalnym adresem URL w 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: akceptuje godzinę, minutę i sekundy miejsca rozpoczęcia filmu i zwraca link.

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

autoodtwarzania: Prawdopodobnie najprostszą, ustawia autoodtwarzanie true, i zwraca link. Akceptuje link.

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

video_length: Zwraca długość filmu wideo. Przydatne, akceptuje link do YouTube.

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

ten jest pomyślany jako obejście tego, że licencjonowany filmy zwróci błąd

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 

Dlatego też analizowany rzeczywistej strony wideo, aby uzyskać długość. Trochę wolniej, ale działa bezbłędnie.

4

YouTube używa H.264/MPEG-4 coding z dźwiękiem stereo AAC. Dźwięk jest osadzony w pliku wideo; musisz pobrać cały film, aby odzyskać ścieżki dźwiękowe.

Powiązane problemy