python - 如何在 Python 中从 Youtube URL 流式传输音频(无需下载)?

标签 python url audio youtube stream

我一直在尝试创建一种方法来直接从 python 代码流式传输 youtube url(最好是音频,尽管这无关紧要)。我尝试了很多东西,但似乎都没有用。到目前为止,我能够使用 youtube 数据 api 搜索视频或播放列表,获取第一个视频或播放列表并将其传递到 pafy 以获取不同的流媒体 url。有谁知道无需先下载视频即可通过 python 播放 youtube 音频/视频的方法?我认为可以使用 mplayer 或 vlc 等 cmd 行工具使用子进程弹出打开 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)

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

谢谢!

最佳答案

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

不过我们可以使用它获取正确的url,然后使用vlc等播放器直接播放,无需下载。

您可以下载vlc from here

首先,我们使用 pafyyoutube 获取正确/最佳 URL

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.play()  #-- resume paused video. On older versions, 
                   #     this function was called resume
>>> player.stop()  #-- to stop/end video

关于python - 如何在 Python 中从 Youtube URL 流式传输音频(无需下载)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49354232/

相关文章:

python - 使用 Python 和 BeautifulSoup,仅选择未包含在 <a> 中的文本节点

python - 获取 facebook 用户拥有的好友数量

url - 如何从 Rust 中的 url 中删除特定查询?

audio - FFmpeg - 如何设置输出样本大小

actionscript-3 - 存储在 ByteArray 中并加载到 Sound 对象中的生成音频没有循环?

ruby - 在 Mac 上生成音调/正弦波的简单方法? ( ruby 会很好)

python - 我可以使用 VirtualEnv 仅安装一些附加软件包吗?

python - mayavi:如何放大非常非常近(改变剪切距离附近)

javascript - 通过 url 传递值但页面无法重定向

angularjs - $location.path 将哈希更改为 %23 & .hash 无法正常工作