카메라에서 동시에 비디오 녹화 및 스트리밍


10

picamera과 함께 Camera Module을 사용하여 Pi의 비디오를 녹화하고 있습니다.

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()

나는 별도로의 조합을 사용하고 있습니다 raspividgstreamer지연없이 파이에서 스트림 비디오를. 파이썬을 동시에 사용하여 푸티지를 저장하고 스트리밍하는 방법이 있습니까?

내 생각에는 카메라를 입력으로 사용하고 두 개의 출력 소스를 만드는 방법이 있어야합니다 : 저장을위한 720p 비디오 및 gstreamer를 사용하여 스트리밍을위한 축소 된 240p 비디오 ...?


배관 raspivid하는 tee경우 출력을 파일 gstreamer 또는 기타로 출력 할 수 있습니다 (참조 man tee). 하나의 스트림이 디스크에 직접 연결되어 있으면 오버 헤드가 많이 발생하지 않지만 입력을 두 가지 다른 형식으로 동시에 처리하려는 경우 pi가 처리하기에는 너무 많은 작업이 될 것이라고 생각합니다.
goldilocks

코드에 예제를 친절하게 게시 할 수 있습니까?
koogee 2012 년

답변:


5

tee명령은 표준 입력에서 읽고 기본적으로 표준 출력과 여러 파일에 복사합니다 man tee. 자세한 내용은 참조하십시오. 즉, 입력에서 파일을 작성한 다음 출력을 다른 것으로 파이프하도록 티에 요청할 수 있습니다.

이론적으로 여분의 파이프를 추가하면 약간의 비 효율성이 추가됩니다. 이것이 중요한지 아닌지는 자신의 스트리밍 방법을 사용하여 스스로 판단해야합니다. 현재의 방법은 전체 해상도에서 만족스럽지 않습니다. 그것은 지금 큰 관심이 아니지만 그것이 더 나은 것을 찾으려고 노력할 것입니다 (예를 들어 gstreamer는 clvc보다 더 잘 작동합니다).

그러나 동시에 pi에 로컬로 저장된 파일은 완벽한 품질이므로 작업이 raspivid를 방해하지 않습니다. 예를 들면 다음과 같습니다.

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

가독성을 위해 이것을 두 줄로 나누었습니다. |(파이프) 후 return 키를 누르고로 줄을 바꿀 수있는 것처럼 명령을 완료 할 수 있습니다 \. cvlc원하는대로 바꿀 수 있습니다 . 스트림의 품질은 좋지 않았지만 test_video.h264완벽하게 나왔습니다.

해상도를 640x360으로 낮추면 일반적으로 얻는 대기 시간이 1-2 초 정도 걸리므 로이 배열이 좋습니다. 나는 tee두 번째 파이프가 스트림의 품질에 어떤 차이를 만들지 않는다고 생각합니다 . 이것들은 여기서 필요한 것보다 훨씬 높은 처리량을 가질 수 있으며 시스템 자원을 많이 요구하지 않습니다.

CPU는 35-45 %로 실행되었으며 이는 비디오 스트리밍시와 동일합니다 tee.


게시물 주셔서 감사합니다. 스크립트 내 에서이 작업을 수행하기 위해 PiCamera 1.9 API를 살펴 보았 record_sequence으며 splitter_port매개 변수를 사용 하는 메소드 가 있습니다. 카메라에서 최대 4 개의 동시 출력을 기록하는 예도 있습니다.
koogee

나는 매시간 분할되는 스토리지를 위해 240p 스트림과 720p 비디오를 함께 기록하는 데 어려움을 겪고 있지만 이것이 유망한 방향이라고 생각합니다.
koogee

8

위의 goldilocks에는 아무런 문제가 없지만 picamera API를 구체적으로 다루는 추가 항목이 있습니다. 사용자 정의 출력 을 사용하여 원하는 만큼 분할을 수행하고 출력을 다양한 대상으로 보낼 수 있습니다. 귀하의 경우 파일과 소켓에 기록하려면 다음과 같이하십시오.

#!/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()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.