使用url从python流传输youtube音频而无需下载python

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用url从python流传输youtube音频而无需下载python相关的知识,希望对你有一定的参考价值。

我一直试图创建一种方法来流式传输一个youtube网址(最好是只有音频,虽然这并不重要),直接来自python代码。我尝试过很多东西,但似乎都没有。到目前为止,我可以使用youtube数据api搜索视频或播放列表,抓取第一个视频或播放列表并将其传递给pafy以获取不同的流式网址。有没有人知道如何通过python播放youtube音频/视频而不先下载视频?我认为使用cmd线工具(如mplayer或vlc)可以使用子进程弹出cmd线的cmd并传入url,但是我被卡住了。需要任何帮助。请!这是我的以下代码:

import argparse
import pafy
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError

DEVELOPER_KEY = 'DEVELOPER KEY'
YOUTUBE_API_SERVICE_NAME = 'youtube'
YOUTUBE_API_VERSION = 'v3'

def pafy_video(video_id):
    url = 'https://www.youtube.com/watch?v={0}'.format(video_id)
    vid = pafy.new(url)

def pafy_playlist(playlist_id)
    url = "https://www.youtube.com/playlist?list={0}".format(playlist_id)
    playlist = pafy.get_playlist(url)


def youtube_search(options):
  youtube = build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION, developerKey=DEVELOPER_KEY)

  search_response = youtube.search().list(
    q='Hello world',
    part='id,snippet',
    maxResults=options.max_results
  ).execute()

  videos = []
  playlists = []
  channels = []
  for search_result in search_response.get('items', []):
    if search_result['id']['kind'] == 'youtube#video':
      videos.append('%s' % (search_result['id']['videoId']))
    elif search_result['id']['kind'] == 'youtube#channel':
      channels.append('%s' % (search_result['id']['channelId']))
    elif search_result['id']['kind'] == 'youtube#playlist':
      playlists.append('%s' % (search_result['id']['playlistId']))


  if videos:
    print('Videos:{0}'.format(videos))
    pafy_video(videos[0])
  elif playlists:
    print('Playlists:{0}'.format(playlists))
    pafy_video(playlists[0])

  #https://www.youtube.com/watch?v=rOU4YiuaxAM
  #url = 'https://www.youtube.com/watch?v={0}'.format(videos[0])
  #print(url)

if __name__ == '__main__':
  parser = argparse.ArgumentParser()
  parser.add_argument('--q', help='Search term', default='Google')
  parser.add_argument('--max-results', help='Max results', default=3)
  args = parser.parse_args()
  youtube_search(args)

Tldr;我想直接从python代码流式传输youtube视频(使用url或id),而不先下载视频

谢谢!

答案

pafy根据其documentation不列出直接播放媒体(至少我没有找到任何)。

但是我们可以使用它来获取正确的URL,然后使用vlc等播放器直接播放而无需下载。

你可以下载vlc from here

首先,我们使用youtubepafy获得正确/最佳网址

import pafy
import vlc

url = "https://www.youtube.com/watch?v=bMt47wvK6u0"
video = pafy.new(url)
best = video.getbest()
playurl = best.url

在这里playurl是最好的URL。然后我们使用VLC来播放它。

Instance = vlc.Instance()
player = Instance.media_player_new()
Media = Instance.media_new(playurl)
Media.get_mrl()
player.set_media(Media)
player.play()

这将打开一个没有控件的窗口(播放/暂停/停止等)。你可以在repr窗口或python提示符下运行这些命令(取决于你如何使用它) 您需要使用vlc命令相应地构建一个,例如

>>> player.pause() #-- to pause video
>>> player.resume()  #-- resume paused video.
>>> player.stop()  #-- to stop/end video

以上是关于使用url从python流传输youtube音频而无需下载python的主要内容,如果未能解决你的问题,请参考以下文章

从 URL 获取音频并播放

从 URL 实时流式传输音频的 RadioKit 替代方案

流式音频 (YouTube)

在流中组合音频和图像

FFMPEG音频问题Youtube Live

使用 python Discord bot 播放 Youtube 音频