Загрузка первого кадра потока twitch.tv

С помощью этого API мне удалось загрузить данные потока, но я не могу подскажите как разобрать. Я просмотрел формат RMTP, но он не соответствует.

from livestreamer import Livestreamer

livestreamer = Livestreamer()

# set to a stream that is actually online
plugin = livestreamer.resolve_url("http://twitch.tv/froggen")
streams = plugin.get_streams()
stream = streams['mobile_High']
fd = stream.open()
data = fd.read()

Я загрузил пример данных здесь.

В идеале мне не нужно было бы анализировать его как видео, мне нужен только первый ключевой кадр как изображение. Любая помощь будет принята с благодарностью!

Обновление: Хорошо, у меня работает OpenCV, он работает для захвата первого кадра случайного видеофайла, который у меня был. Однако он создавал бессмысленное изображение, когда я использовал тот же код в файле с потоковыми данными.


person doeke    schedule 25.09.2013    source источник
comment
Мне удалось открыть ваш файл библиотекой OpenCV (код Python: capture = cv2.VideoCapture("downloads/( uploadMB.com ) stream.bin")) Мне удалось получить из него изображение (3 канала, 1280x720), но оно выглядит как разноцветная каша. Вы уверены, что в файле есть правильный ключевой кадр?   -  person Igonato    schedule 26.09.2013
comment
Я только что попытался загрузить первый 1 МБ потоковых данных и, используя cv2.VideoCapture, затем capture.read, но он возвращает False/None. Как вы получили изображение из него?   -  person doeke    schedule 26.09.2013


Ответы (1)


Хорошо, я понял это. Убедитесь, что вы записываете как двоичные данные, и OpenCV может декодировать первый видеокадр. В полученном изображении каналы R и B были переключены, но это легко исправить. Скачивания около 300 кБ вроде бы достаточно, чтобы быть уверенным, что есть полный образ.

import time, Image

import cv2
from livestreamer import Livestreamer

# change to a stream that is actually online
livestreamer = Livestreamer()
plugin = livestreamer.resolve_url("http://twitch.tv/flosd")
streams = plugin.get_streams()
stream = streams['mobile_High']

# download enough data to make sure the first frame is there
fd = stream.open()
data = ''
while len(data) < 3e5:
    data += fd.read()
    time.sleep(0.1)
fd.close()

fname = 'stream.bin'
open(fname, 'wb').write(data)
capture = cv2.VideoCapture(fname)
imgdata = capture.read()[1]
imgdata = imgdata[...,::-1] # BGR -> RGB
img = Image.fromarray(imgdata)
img.save('frame.png')
# img.show()
person doeke    schedule 28.09.2013
comment
Я пытаюсь выполнить ту же задачу, но вызов capture.read() ничего не возвращает. Я пробовал это с вашей загруженной корзиной, но я получаю тот же результат None. Любые идеи? - person sheitan; 19.11.2013
comment
Вы не можете вызвать read() для bin-файла, потому что ffmpeg (декодер видео) недоступен должным образом, поэтому открытие файла не удается. См. stackoverflow.com /questions/11699298/ и подобные. Я исправил, загрузив и установив opencv отсюда: lfd.uci.edu/~gohlke/pythonlibs - person profesor_tortuga; 24.09.2015