Как я могу прочитать видеопоток формата m3u8 и сохранить его с opencv в python? - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь сохранить видеопоток и замедлить его. Я знаю, как читать любое видео с компьютера (например, в формате mp4) и делать интервалы (я пытался, мне это удалось). Теперь я пытаюсь сделать то же самое с видео потоком. У меня есть ссылка для видео m3u8 https://wstream.comanet.cz: 1943 / live / Vrchlabi-sjezdovka2.stream_360p / playlist.m3u8 , я читаю видео следующим образом: (Инициализация:)

import cv2 as cv
url = 'https://wstream.comanet.cz:1943/live/Vrchlabi-sjezdovka2.stream_360p/playlist.m3u8'
fourcc = cv.VideoWriter_fourcc(*'mp4v')
height = video.get(cv.CAP_PROP_FRAME_HEIGHT)
width = video.get(cv.CAP_PROP_FRAME_WIDTH)
outp = cv.VideoWriter(save_path, fourcc, 60,(int(width), int(height)))
video = cv.VideoCapture("url")

dir_stream = "streamframes"

if not os.path.exists(dir_stream):
    os.makedirs(dir_stream)

if not video.isOpened():
    print("Error opening video file.")

(Есть основная часть - l oop:)

name = 0
while video.isOpened():
    ret, frame = video.read()
        name += 1
        filename = f"{dir_stream}/{name}.jpg"
        cv.imwrite(filename, frame)
        f = cv.imread(filename)
        outp.write(f)

Мне не нравится способ сохранения видео ... в любом случае - это не совсем неправильно ... это работает , но после нескольких прочитанных фреймов (иногда это 153, 212 и c), значение ret возвращает значение False, и код попадает в бесконечное число l oop. После того, как я остановил программу, мое видео было сохранено, и я смог воспроизвести его, оно было коротким (потому что оно записывалось не так долго, как я хотел, из-за бесконечного l oop) ...

In часть "while" я тоже попробовал ...:

while video.isOpened():
        ret, frame = video.read()
        if ret:
            frame_r = cv.imread(frame)
            outp.write(frame_r)

... это намного приятнее, но cv.imread(frame) не работал, поэтому я сделал это грязно, как вы можете видеть выше.

Моя цель - записывать онлайн-поток с python в течение некоторого времени (например, в течение 5 часов), мне не нужна запись со скоростью 30 кадров в секунду (например, 1fps тоже хорошо). Может кто-нибудь помочь мне с этой проблемой? Или у вас есть совет? Почему ret значение возвращает False через некоторое случайное время? У вас есть другое решение? Я буду очень благодарен за вашу помощь, это для моего школьного проекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...