我有一个HLS流,并希望使用python中的opencv提取帧以用于计算机视觉。我曾尝试探索ffmpeg,但它似乎很容易读取.mp4,而不是hls流(m3u8)。ffmpeg-python是否有其他任何选项或其他API从HLS流中提取帧。
这是我想尝试的示例代码,但不适用于VIDEO_URL
from imutils.video import VideoStream
import ffmpeg
import cv2
import numpy as np
import subprocess as sp
VIDEO_URL = "https://bitdash-a.akamaihd.net/content/sintel/hls/playlist.m3u8"
VIDEO_FILE = "sampleStream.mp4"
process = (
ffmpeg
.input(VIDEO_FILE)
#.input(VIDEO_URL)
.output('pipe:', format='rawvideo', pix_fmt='rgb24')
.run_async(pipe_stdout=True)
)
tar = 200
val = 0
while True:
val = val + 1
in_bytes = process1.stdout.read(100 * 200 * 3)
if not in_bytes:
print('Breaking - No bytes found.')
break
in_frame = (
np
.frombuffer(in_bytes, np.uint8)
.reshape([100, 200, 3])
)
if val == tar:
print('Writing image...')
cv2.imwrite("sample.jpg", in_frame)
break
您可以用来cv2.VideoCapture()
直接读取HLS流。为什么要受苦?
import cv2
import sys
VIDEO_URL = "http://bitdash-a.akamaihd.net/content/sintel/hls/playlist.m3u8"
cap = cv2.VideoCapture(VIDEO_URL)
if (cap.isOpened() == False):
print('!!! Unable to open URL')
sys.exit(-1)
# retrieve FPS and calculate how long to wait between each frame to be display
fps = cap.get(cv2.CAP_PROP_FPS)
wait_ms = int(1000/fps)
print('FPS:', fps)
while(True):
# read one frame
ret, frame = cap.read()
# TODO: perform frame processing here
# display frame
cv2.imshow('frame',frame)
if cv2.waitKey(wait_ms) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
输出:
我也尝试了这种方法,这给了我以下错误:tls @ 0x7f93a9f1ff40]解码接收到的TLS数据包时出错。[hls @ 0x7f93a500ec00]加载第一段时出错' bitdash-a.akamaihd.net/content/sintel/hls/video/6000kbit/…'OpenCV:无法从文件“ bitdash-a.akamaihd.net/中读取视频流内容/sintel/hls/playlist.m3u8 “!无法打开URL
更新到最新的OpenCV!我在Windows上使用4.2.0。
我在Mac上使用4.2.0,但是。似乎是权限问题。
很高兴为您提供帮助!随意对可以帮助您解决问题的答案进行投票,然后单击答案旁边的复选框以将其选择为官方问题解决者。通过做这些事情,您将帮助将来的访客更快地找到他们的答案。