我一直在尝试创建一种方法来直接从python代码流式传输youtube网址(最好是仅限音频,但这并不重要)。我尝试过很多东西,但似乎都没有。到目前为止,我可以使用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)而不先下载视频
谢谢!
答案 0 :(得分:3)
完成此操作的最佳方法是将mpv与youtube-dl一起使用(轻巧的媒体播放器,它带有命令行控制台,可让您通过复制流式传输任何类型的视频/音频编解码器并将网址粘贴到mpv控制台(适用于cmd和终端)。用法:path \ to \ mpv https://your/video/audioURL.com/
首先导入这些模块-通过pip install bs4 requests
import re, requests, subprocess, urllib.parse, urllib.request
from bs4 import BeautifulSoup
然后创建一个变量来存储您选择的音乐标题
music_name = "Linkin Park Numb"
query_string = urllib.parse.urlencode({"search_query": music_name})
此处的目标是使用此搜索查询来提取输出标题和第一个视频结果的链接。然后,我们可以使用"https://www.youtube.com/results?search_query="
(例如urllib
)用标识符对youtube网址"https://www.youtube.com/results?search_query=linkin+park+numb"
进行结束编码
formatUrl = urllib.request.urlopen("https://www.youtube.com/results?" + query_string)
此处re.findall(r"watch\?v=(\S{11})"
此处显示了我们查询的所有视频结果的11个字符标识
search_results = re.findall(r"watch\?v=(\S{11})", formatUrl.read().decode())
解码内容后,我们可以通过将YouTube主网址与11个字符的标识符连接起来来提取完整网址
clip = requests.get("https://www.youtube.com/watch?v=" + "{}".format(search_results[0]))
clip2 = "https://www.youtube.com/watch?v=" + "{}".format(search_results[0])
print(clip2)
https://www.youtube.com/watch?v=kXYiU_JCYtU
要进一步检查内容,我们可以使用beautifulsoup刮取视频的确切标题
inspect = BeautifulSoup(clip.content, "html.parser")
yt_title = inspect.find_all("meta", property="og:title")
for concatMusic1 in yt_title:
pass
print(concatMusic1['content'])
Numb (Official Video) - Linkin Park
最后,要播放音乐,请在命令行中输入
subprocess.Popen(
"start /b " + "path\\to\\mpv.exe" + clip2 + " --no-video --loop=inf --input-ipc-server=\\\\.\\pipe\\mpv-pipe > output.txt",
shell=True)
================================================ ===================
import re, requests, subprocess, urllib.parse, urllib.request
from bs4 import BeautifulSoup
music_name = "Linkin Park Numb"
query_string = urllib.parse.urlencode({"search_query": music_name})
formatUrl = urllib.request.urlopen("https://www.youtube.com/results?" + query_string)
search_results = re.findall(r"watch\?v=(\S{11})", formatUrl.read().decode())
clip = requests.get("https://www.youtube.com/watch?v=" + "{}".format(search_results[0]))
clip2 = "https://www.youtube.com/watch?v=" + "{}".format(search_results[0])
inspect = BeautifulSoup(clip.content, "html.parser")
yt_title = inspect.find_all("meta", property="og:title")
for concatMusic1 in yt_title:
pass
print(concatMusic1['content'])
subprocess.Popen(
"start /b " + "path\\to\\mpv.exe " + clip2 + " --no-video --loop=inf --input-ipc-server=\\\\.\\pipe\\mpv-pipe > output.txt",
shell=True)
# Alternatively, you can do this for simplicity sake:
# subprocess.Popen("start /b " + "path\\to\\mpv.exe " + clip2 + "--no-video", shell=True)
答案 1 :(得分:2)
pafy
根据其documentation没有直接列出播放媒体(至少我没有找到任何媒体)。
但是我们可以使用它来获取正确的网址,然后使用vlc
等播放器直接播放而无需下载。
您可以下载vlc from here
首先,我们使用youtube
pafy
获取正确/最佳网址
import pafy
import vlc
url = "https://www.youtube.com/watch?v=bMt47wvK6u0"
video = pafy.new(url)
best = video.getbest()
playurl = best.url
此处playurl
是最佳播放网址。
然后我们使用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