python - 捕获 YouTube 视频以进行进一步处理,无需下载视频
问题描述
鉴于它的链接,我想捕获一个在线视频(比如来自 YouTube)以进行进一步处理,而无需将其下载到磁盘上。我的意思是我想尽可能将它直接加载到内存中。根据这些链接:http :
//answers.opencv.org/question/24012/reading-video-stream-from-ip-camera-in-opencv-java/#24013 http://answers.opencv.org/question
/24154/how-to-using-opencv-api-get-web-video-stream/#24156
http://answers.opencv.org/question/133/how-do-i-access-an-ip-camera /
https://pypi.org/project/pafy/
它应该是可行的。我的尝试如下所示:
import cv2
import pafy
vid = pafy.new("https://www.youtube.com/watch?v=QuELiw8tbx8")
vid_cap = cv2.VideoCapture()
vid_cap.open(vid.getbest(preftype="webm").url)
但是它失败并出现错误
(python:12925): GLib-GObject-CRITICAL **: 14:48:56.168: g_object_set: assertion 'G_IS_OBJECT (object)' failed
False
如何使用 python 实现我的目标?
解决方案
youtube-dl
您可以通过使用and来实现这一点ffmpeg
:
- 安装最新版本的
youtube-dl
. - 然后做
sudo pip install --upgrade youtube_dl
ffmpeg
使用 HTTPS 支持构建。您可以通过打开--enable-gnutls
选项来做到这一点。
安装完成后,就可以测试youtube-dl
in 终端了。我们将使用这个 youtube 视频进行测试。
首先,我们得到此视频可用的格式列表:
youtube-dl --list-formats https://www.youtube.com/watch?v=HECa3bAFAYk
选择format code
您的选择。我想要144p分辨率,所以我选择160。
接下来,我们通过以下方式获取我们选择格式的视频网址:
youtube-dl --format 160 --get-url https://www.youtube.com/watch?v=HECa3bAFAYk
最后,我们可以在ffplay
或中播放此视频 url vlc
。但是,我们可以在一个命令中执行此操作,而不是复制和粘贴:
ffplay -i $(youtube-dl --format 160 --get-url https://www.youtube.com/watch?v=HECa3bAFAYk)
现在我们已经确认youtube-dl
并且ffmpeg
工作正常,我们可以编写一个 Python 脚本来处理 OpenCV 中的帧。有关更多 Python 选项,请参阅此链接。
import cv2
import numpy as np
import youtube_dl
if __name__ == '__main__':
video_url = 'https://www.youtube.com/watch?v=HECa3bAFAYkq'
ydl_opts = {}
# create youtube-dl object
ydl = youtube_dl.YoutubeDL(ydl_opts)
# set video url, extract video information
info_dict = ydl.extract_info(video_url, download=False)
# get video formats available
formats = info_dict.get('formats',None)
for f in formats:
# I want the lowest resolution, so I set resolution as 144p
if f.get('format_note',None) == '144p':
#get the video url
url = f.get('url',None)
# open url with opencv
cap = cv2.VideoCapture(url)
# check if url was opened
if not cap.isOpened():
print('video not opened')
exit(-1)
while True:
# read frame
ret, frame = cap.read()
# check if frame is empty
if not ret:
break
# display frame
cv2.imshow('frame', frame)
if cv2.waitKey(30)&0xFF == ord('q'):
break
# release VideoCapture
cap.release()
cv2.destroyAllWindows()
推荐阅读
- php - 有没有办法通过列数来配置表格中的列宽?
- python-3.x - 为什么我在快速排序算法中出现列表索引错误。任何人都可以审查它吗
- apache-spark - 使用数据帧上的许多过滤条件创建 Spark 作业的时间很长
- r - 无法理解来自 blogdown 的错误消息
- node.js - 将 yaml 转换为 JSON 返回 ["object Object"]
- python - 尝试通过匹配行值来选择列,但返回该列中另一行的值
- java - TestNg 评估程序
- javascript - 我们可以在 VueJ 的“类型”属性中添加多个值吗?
- reactjs - React:将值从 componentDidMount 传递给 render()
- angular - 无法从商店 ngrx 获取值