如何从 Python 中的 Youtube URL 流式传输音频(无需下载)?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/49354232/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to stream audio from a Youtube URL in Python (without download)?
提问by Nick D
I have been trying to create a way to stream a youtube url (preferably audio only, although this doesn't matter too much) right from python code. I have tried numerous things but none really seem to work. So far, I am able to search for videos or playlists using youtube data api, grab the first video or playlist and pass it into pafy to get different streaming urls. Does anyone know of a way to play youtube audio/video through python without downloading the video first? I would think it is possible with a cmd line tool such as mplayer or vlc using the sub process to pop open a cmd for the cmd line and pass in the url, but I am stuck. Any help is needed. Please! Here is my following code:
我一直在尝试创建一种直接从 python 代码流式传输 youtube url(最好只有音频,尽管这并不重要)的方法。我尝试了很多东西,但似乎没有一个真正有效。到目前为止,我能够使用 youtube 数据 api 搜索视频或播放列表,抓取第一个视频或播放列表并将其传递给 pafy 以获得不同的流媒体网址。有谁知道一种无需先下载视频即可通过 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)
Tldr; I would like to stream a youtube video (using the url or id) straight from python code without downloading the video first
网址; 我想直接从 python 代码流式传输 youtube 视频(使用 url 或 id),而无需先下载视频
Thank you!
谢谢!
采纳答案by Anil_M
pafy
according to its documentationdo not list playing media directly (at least I didn't find any).
pafy
根据其文档,不要直接列出播放媒体(至少我没有找到)。
However we can use it to get correct url, and then use player such as vlc
to play directly without downloading.
但是我们可以使用它来获取正确的url,然后使用播放器等vlc
直接播放,无需下载。
You can download vlc from here
First we get correct / best URL from youtube
using pafy
首先,我们从youtube
使用中获得正确/最佳的 URLpafy
import pafy
import vlc
url = "https://www.youtube.com/watch?v=bMt47wvK6u0"
video = pafy.new(url)
best = video.getbest()
playurl = best.url
Over here playurl
is best URL to play.
Then we use VLC to play it.
这里playurl
是最好玩的网址。然后我们使用VLC来播放它。
Instance = vlc.Instance()
player = Instance.media_player_new()
Media = Instance.media_new(playurl)
Media.get_mrl()
player.set_media(Media)
player.play()
This will open a window with no controls (play/pause/stop etc).
You can run these command on the repr
window or at python prompt (depending upon how you are using it)
You will need to build one accordingly using vlc commands such as
这将打开一个没有控件(播放/暂停/停止等)的窗口。您可以在repr
窗口或 python 提示符下运行这些命令(取决于您使用它的方式)
您需要使用 vlc 命令相应地构建一个,例如
>>> player.pause() #-- to pause video
>>> player.resume() #-- resume paused video.
>>> player.stop() #-- to stop/end video