【问题标题】:Extracting frames from HLS stream in python从python中的HLS流中提取帧
【发布时间】:2020-05-17 14:03:51
【问题描述】:

我有一个 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

【问题讨论】:

  • 你能说得更具体点吗? “不工作”没有获得足够的信息来诊断任何事情。
  • 使用 video_url 作为参数时,从输出流读取代码时卡住了。我认为这不是使用此 API 的正确方法,但在互联网上进行了搜索,到目前为止还没有看到另一个示例。

标签: python opencv ffmpeg computer-vision


【解决方案1】:

您可以使用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/content/sintel/hls/playlist.m3u8”中读取视频流!!!无法打开网址
  • 更新到更新的 OpenCV!我在 Windows 上使用 4.2.0
  • 我使用的是 4.2.0 但在 mac 上。似乎是权限问题。
  • 很高兴它帮助了你!随意对帮助您解决问题的答案进行投票,然后单击答案附近的复选框将其选为官方问题解决者。通过执行这些操作,您将帮助未来的访问者更快地找到答案。
  • 它不起作用,fps返回48,但我认为tbr可以使用ffmpeg获得正确的fps,如下ffmpeg -i "http://bitdash-a.akamaihd.net/content/sintel/hls/playlist.m3u8"返回24
【解决方案2】:

@karlphillip 解决方案有效,但需要注意的是,您首先需要安装包含 ffmpeg 的 cv2 版本。

您可以通过在您的代码中输入以下内容来检查 ffmpeg 是否为 cv2 正确设置:

print(cv2.getBuildInformation())

在 ffmpeg 之后应该说“YES”。

为 Conda 用户安装(如果已经安装了 opencv,请先卸载它):

conda install -c conda-forge ffmpeg
conda install -c conda-forge opencv

为非 Conda 用户安装:

显然,手动安装带有 ffmpeg 的 cv2 是一个过程,所以我选择使用 docker 映像。我找到了这个,效果很好https://github.com/Borda/docker_python-opencv-ffmpeg

我的 Dockerfile 像这样扩展了上面的基础镜像:

FROM borda/docker_python-opencv-ffmpeg:cpu-py3.7-cv4.5.1

# More docker file stuff...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 2013-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多