İPUCU

Python Artificial Intelligence’da en çok kullanılan dildir ve gerekli dökümanların paylaşım alanlar burada paylaşılmaktadır.

Seçenekler

MJPEG (Motion JPEG) Stream Reader - Python

r0ark - ait Kullanıcı Resmi (Avatar)
E-Mail onayı yapılmamış üye
Üyelik tarihi:
05/2018
Mesajlar:
67
Konular:
13
Teşekkür (Etti):
24
Teşekkür (Aldı):
63
Ticaret:
(0) %
21-06-2018 05:58
#1
MJPEG (Motion JPEG) Stream Reader - Python
MJPEG (Motion JPEG) Nedir?

Motion JPEG, her bir karesi JPEG ile sıkıştırılmış bir video sıkıştırma formatıdır. Multimedya programları için geliştirilmiştir. Şu anda genel olarak dijital kameralar, IP kameralar ve webcamler tarafından kullanılıyor. Bunun yanında, QuickTime Player, PlayStation konsolu ve Safari, Chrome, Mozilla Firefox, Microsoft Edge gibi tarayıcılar tarafından desteklenmektedir.

Bu formatta, her bir kare, "0xff 0xd8" ile başlayıp "0xff 0xd9" ile bitmektedir. Bunu kullanarak her bir kareyi parse edebileceğiz. Aşağıda yapısı bulunuyor.

Kod:
...(http)
0xff 0xd8      --|
[jpeg data]      |-- frame
0xff 0xd9      --|
...(http)
0xff 0xd8      --|
[jpeg data]      |-- frame
0xff 0xd9      --|
...(http)
Python Uygulaması

GitHub: https://github.com/nulls0/mjpeg-reader
Kod:
class MJPEGStream(object):
    def __init__(self, stream_url):
        self.stream_url = stream_url
        self.stream = urllib2.urlopen(self.stream_url)

        self.data = ''
        self.frame = None

        thread = threading.Thread(target=self.start)
        thread.daemon = True
        thread.start()

    def read(self):
        return self.frame

    def start(self):
        while True:
            self.data += self.stream.read(5120)

            start_pos = self.data.find('\xff\xd8')
            end_pos = self.data.find('\xff\xd9')

            if start_pos != -1 and end_pos != -1:
                self.frame = self.data[start_pos:end_pos+2]
                self.data = self.data[end_pos+2:]
Gelin, beraber neler olup bittiğini inceleylim. İlk olarak, sınıfı örneklerken, "stream_url" adında bir parametre veriyoruz. Bu URL, yayının yapıldığı yer. Sınıf örneklendikten sonra, yeni bir thread içerisinde sürekli frameleri çekecek olan "start" fonksiyonunu çalıştırıyor.

Kod:
    def start(self):
        while True:
            self.data += self.stream.read(5120)

            start_pos = self.data.find('\xff\xd8')
            end_pos = self.data.find('\xff\xd9')

            if start_pos != -1 and end_pos != -1:
                self.frame = self.data[start_pos:end_pos+2]
                self.data = self.data[end_pos+2:]
Burada da görüldüğü üzere, döngü her başa dondüğünde yayının yapıldığı yerden 5MB boyutunda data alıyor. Ardından alınan data içerisinde bir karenin başlangıcının ve bitişinin konumlarını bulmaya çalışıyor. Eğer bulursa, aranan değeri "self.frame" değişkenine atıyor ve datadan bu değeri siliyor. Bundan sonra datadan geriye sadece sonraki karenin baştan bir bölümü kalmış oluyor, döngü başa dönüp tekrar data alınca bu sefer yarım kalan kare tamamlanıyor ve datadan siliniyor. Böyle devam ederek her bir kareyi parse etmiş oluyoruz.

Kod:
class MJPEGStreamViewer(object):
    def __init__(self, stream):
        self.stream = stream

    def start(self):
        while True:
            frame = self.stream.read()
            if frame == None:
                continue

            frame = numpy.fromstring(frame, dtype=numpy.uint8)
            frame = cv2.resize(cv2.imdecode(frame, 1), (640, 480))
            cv2.imshow('MJPEG Stream Viewer', frame)

            if (cv2.waitKey(5) & 0xFF) == 27:
                sys.exit()
Bu kadar yazmışken, parse edilen frameleri bir videoymuş gibi izleyebilmek için basit bir sınıfta yazdım. Burada, "stream" parametresine bir "MJPEGStream" sınıfı veriyoruz, alınan her frame kullanıcıya bir pencerede gösteriliyor. İnternetten bulduğum bir yayın ile test edelim:


Görüldüğü üzere, uygulamamız gayet güzel çalışıyor.
Konu r0ark tarafından (21-06-2018 06:03 Saat 06:03 ) değiştirilmiştir.
BufGix, Gbmdpof, Ceen, RAM_Hacker, Javabex Teşekkür etti.
Ceen - ait Kullanıcı Resmi (Avatar)
Forumdan Uzaklaştırıldı
Üyelik tarihi:
07/2017
Mesajlar:
219
Konular:
19
Teşekkür (Etti):
70
Teşekkür (Aldı):
75
Ticaret:
(0) %
21-06-2018 14:04
#2
Eline sağlık.
jkhacking - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
06/2016
Mesajlar:
1.558
Konular:
71
Teşekkür (Etti):
66
Teşekkür (Aldı):
141
Ticaret:
(0) %
21-06-2018 14:23
#3
Eline sağlık.
---------------------
┏╋━━━━━━━━━━━━◥◣◆◢◤━━━━━━━━━━━╋┓
1881 DEN SONSUZLUĞA UZANAN BİR SEVDADIR ADIN.
DÖN GEL BİRAZ DA CENNET ÖZLESİN SENİ.

067d419c5c2c34d587e8143ca2ab1a33
┗╋━━━━━━━━━━━━◥◣◆◢◤━━━━━━━━━━━╋┛

Bookmarks


« Önceki Konu | Sonraki Konu »
Seçenekler

Yetkileriniz
Sizin Yeni Konu Acma Yetkiniz var yok
You may not post replies
Sizin eklenti yükleme yetkiniz yok
You may not edit your posts

BB code is Açık
Smileler Açık
[IMG] Kodları Açık
HTML-Kodları Kapalı
Trackbacks are Kapalı
Pingbacks are Kapalı
Refbacks are Kapalı