aynı anda kameradan video kaydetme ve akışını yapma


10

Picamera ile Kamera Modülünü kullanarak Pi'den video kaydediyorum:

import picamera

with picamera.PiCamera() as camera:
    camera.resolution = (640, 480)
    camera.start_recording('1.h264')
    camera.wait_recording(5)
    for i in range(2, 11):
        camera.split_recording('%d.h264' % i)
        camera.wait_recording(5)
    camera.stop_recording()

Ayrı ayrı raspividve gstreamerpi herhangi bir gecikme olmadan video akışı için bir kombinasyon kullandım . Aynı anda python kullanarak görüntüleri depolamanın ve akışının bir yolu var mı ?

Bence kamerayı giriş olarak kullanmanın ve iki çıkış kaynağı oluşturmanın bir yolu olmalı: depolama için 720p video ve gstreamer kullanarak akış için küçültülmüş 240p video ...?


Eğer boru varsa raspividsen olabilir teebir dosyaya çıktı ve gstreamer veya başka ne (bkz man tee). Bir akış doğrudan diske olduğu sürece, fazla ek yük eklemez, ancak girişi aynı anda iki farklı formata dönüştürmek istiyorsanız, pi'nin işlemesi için çok fazla iş olacağını düşünüyorum.
goldilocks

Kodda bir örnek gönderebilir misiniz?
koogee

Yanıtlar:


5

teeKomut bkz dosyaları varsayılan olarak artı standart çıkışa herhangi bir sayıda standart giriş ve kopyalarından okur man teefazla ayrıntı için. Bu, tee'den girişten bir dosya oluşturmasını ve ardından çıkışı başka bir şeye yönlendirmesini isteyebileceğiniz anlamına gelir.

Fazladan bir borunun eklenmesi teoride biraz verimsizliğe neden olur. Bunun önemli olup olmadığı konusunda kendi akış yönteminizi kullanarak kendiniz karar vermeniz gerekecektir. Mevcut yöntemim tam çözünürlükte tatmin edici değil. Şu anda büyük bir ilgi değil ama ne zaman daha iyi bir şey bulmaya çalışacağım (örneğin, gstreamer clvc'den daha iyi çalışıyor).

Ancak, aynı zamanda pi üzerinde yerel olarak kaydedilen dosyanın mükemmel kalitede olduğunu belirtmek gerekir, bu nedenle etkinlik raspivid ile etkileşime girmez. İşte bir örnek:

raspivid -o - -t 0 | tee test_video.h264 |
cvlc -v stream:///dev/stdin --sout '#standard{access=http,mux=ts,dest=:8080' :demux=h264

Okunabilirlik için bunu iki satıra ayırdım; sonra |(boru) sonra dönüş vurmak ve bir çizgi kırmak gibi komutu bitirmek \. cvlcİle istediğinizi değiştirebilirsiniz . Yine, dere kalitesiz olmasına rağmen test_video.h264mükemmel çıktı.

Çözünürlüğü 640x360'a düşürürsem, bu düzenleme normaldir, normalde aldığım şey olan bir veya iki gecikme ile iyidir. teeİkinci borunun akışın kalitesi üzerinde herhangi bir fark yarattığını düşünmüyorum ; bunlar burada gerekenden çok daha yüksek verim kapasitesine sahiptir ve sistem kaynakları için fazla bir şey gerektirmez.

CPU% 35-45'te koştu, bu da video sans akışı sırasındakiyle aynı tee.


Gönderiniz için teşekkür ederim. Bunu senaryomda yapmak istediğim için PiCamera 1.9 API'sine bakıyorum ve record_sequencebir splitter_portparametre alan bir yöntem var . Aynı zamanda kameradan 4 adede kadar eşzamanlı çıkış kaydetme örneği de vardır.
koogee

240p akışı ve 720p videoyu her saatte bölünen depolama için bir araya getirmekle biraz uğraşıyorum ama bunun umut verici bir yön olduğunu hissediyorum.
koogee

8

Yukarıdaki goldilocks cevabı ile yanlış bir şey yok, ancak burada özellikle picamera API ile ilgilenen ek bir soru var. Bir kullanabilirsiniz özel çıkışını (istediğiniz gibi birçok yönden gibi) bu tür bir bölünme gerçekleştirmek ve gidilecek çeşitli çıktı göndermek için. Sizin durumunuzda, bir dosyaya ve bir sokete kaydetmek istiyorsanız, şöyle bir şey yapabilirsiniz:

#!/usr/bin/env python

import io
import picamera
import socket


# An output (as far as picamera is concerned), is just a filename or an object
# which implements a write() method (and optionally the flush() and close()
# methods)
class MyOutput(object):
    def __init__(self, filename, sock):
        self.output_file = io.open(filename, 'wb')
        self.output_sock = sock.makefile('wb')

    def write(self, buf):
        self.output_file.write(buf)
        self.output_sock.write(buf)

    def flush(self):
        self.output_file.flush()
        self.output_sock.flush()

    def close(self):
        self.output_file.close()
        self.output_sock.close()


# Connect a socket to a remote server on port 8000
sock = socket.socket()
sock.connect(('my_server', 8000))

with picamera.PiCamera() as camera:
    camera.resolution = (640, 480)
    camera.framerate = 24

    # Construct an instance of our custom output splitter with a filename
    # and a connected socket
    my_output = MyOutput('output.h264', sock)

    # Record video to the custom output (we need to specify the format as
    # the custom output doesn't pretend to be a file with a filename)
    camera.start_recording(my_output, format='h264')
    camera.wait_recording(30)
    camera.stop_recording()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.