একই সাথে ক্যামেরা থেকে ভিডিও রেকর্ড করুন এবং স্ট্রিম করুন


10

আমি পাই থেকে ক্যামেরা মডিউল ব্যবহার করে পাই থেকে ভিডিও রেকর্ড করছি:

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

আমি আলাদাভাবে সংমিশ্রণ ব্যবহার করেছেন raspividএবং gstreamerকোন দেরী না করে পাই থেকে স্ট্রীম ভিডিওতে। পাইথন একসাথে ব্যবহার করে ফুটেজ সংরক্ষণ এবং স্ট্রিম করার কোনও উপায় আছে কি ?

আমার চিন্তাভাবনাটি অবশ্যই ইনপুট হিসাবে ক্যামেরা ব্যবহার করার এবং দুটি আউটপুট উত্স তৈরি করার উপায় থাকতে পারে: স্টোরেজের জন্য একটি 720p ভিডিও এবং গিস্ট্রিমার ব্যবহার করে স্ট্রিমিংয়ের জন্য একটি ডাউনস্কেলড 240p ভিডিও ...?


আপনি যদি পাইপিং করেন তবে raspividআপনি teeকোনও ফাইল এবং জিস্ট্রিমার বা অন্য যে কোনও কিছুতে ( আউটপুট) আউটপুট দিতে পারতেন man tee। যতক্ষণ না একটি স্ট্রিম সরাসরি ডিস্কে থাকে, তত বেশি ওভারহেড যুক্ত হবে না, তবে আপনি যদি একই সাথে দুটি আলাদা ফর্ম্যাটে ইনপুটটি প্রসেস করতে চান তবে আমি মনে করি পাইটি হ্যান্ডল করার পক্ষে খুব বেশি কাজ হবে।
স্বর্ণিলকস

আপনি কি দয়া করে কোডে একটি উদাহরণ পোস্ট করতে পারেন?
কুজি

উত্তর:


5

teeকমান্ড ডিফল্টরূপে ফাইল প্লাস মান আউটপুট যেকোন নম্বরে মান ইনপুট এবং কপি থেকে সার্চ দেখতে man teeআরো বিস্তারিত জানার জন্য। এর অর্থ আপনি ইনপুট থেকে টি কে একটি ফাইল তৈরি করতে এবং তারপরে আউটপুটটিকে অন্য কোনও কিছুর কাছে পাইপ করতে বলতে পারেন।

অতিরিক্ত পাইপ যুক্ত করা তাত্ত্বিকভাবে কিছুটা অদক্ষতা যুক্ত করে। এটি তাত্পর্যপূর্ণ কিনা তা আপনার নিজের স্ট্রিমিং পদ্ধতিটি ব্যবহার করে আপনাকে বিচার করতে হবে। আমার বর্তমান পদ্ধতি সম্পূর্ণ রেজোলিউশনে সন্তোষজনক নয়। এখনই এটি একটি বিশাল আগ্রহ নয় তবে যখন এটি হবে তখন আমি আরও ভাল কিছু সন্ধান করার চেষ্টা করব (উদাহরণস্বরূপ gstreamer clvc এর চেয়ে ভাল কাজ করে)।

তবে, একই সাথে লক্ষ্য করার মতো বিষয় যে ফাইলটি স্থানীয়ভাবে একই সময়ে পাইতে সংরক্ষণ করা নিখুঁত মানের, তাই কার্যকলাপটি বর্ণবাদীদের সাথে হস্তক্ষেপ করে না। এখানে একটি উদাহরণ:

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

পাঠযোগ্যতার জন্য আমি এটিকে দুটি লাইনে বিভক্ত করেছি; আপনি |(পাইপ) পরে রিটার্ন হিট করতে পারেন এবং কমান্ডটি ঠিক তেমনভাবে শেষ করতে পারেন যা দিয়ে আপনি কোনও লাইন ভাঙতে পারেন \। আপনি cvlcযা চান তার সাথে প্রতিস্থাপন করতে পারেন। আবার, যদিও প্রবাহটি নিম্নমানের ছিল, test_video.h264নিখুঁতভাবে এসেছিল।

আমি যদি রেজোলিউশনটি 640x360 এ নামিয়ে রাখি তবে এই ব্যবস্থাটি ঠিক আছে, দ্বিতীয় বা দুটি বিলম্বের সাথে যা আমি সাধারণত পাই। আমার মনে হয় না teeবা দ্বিতীয় পাইপটি প্রবাহের মানের ক্ষেত্রে কোনও পার্থক্য করে; এগুলি এখানে প্রয়োজনীয়গুলির চেয়ে অনেক বেশি হাই থ্রুটপুট সক্ষম এবং সিস্টেম সংস্থানগুলির ক্ষেত্রে খুব বেশি প্রয়োজন হয় না।

সিপিইউ 35-45% এ চলেছিল, যা ভিডিও সান স্ট্রিমিংয়ের সময় একই রকম tee


আপনার পোস্টের জন্য আপনাকে ধন্যবাদ। আমি যেমন আমার স্ক্রিপ্টের মধ্যে এটি করতে চাই, আমি পাইকামেরা ১.৯ এপিআইয়ের দিকে চেয়েছি এবং এমন একটি পদ্ধতি রয়েছে record_sequenceযা splitter_portপরামিতি নেয় takes ক্যামেরা থেকে এক সাথে 4 টি আউটপুট রেকর্ড করার একটি উদাহরণও রয়েছে।
কুজি

আমি স্ট্রোকের জন্য 240p স্ট্রিম এবং 720p ভিডিও রেকর্ডিং করে একসাথে বেঁধে কিছুটা লড়াই করছি যা প্রতি ঘন্টায় বিভক্ত হয় তবে আমি মনে করি এটি একটি আশাব্যঞ্জক দিক।
কুজি

8

উপরে সোনারিলকসের উত্তর দিয়ে কিছুই ভুল হয় নি, তবে এখানে একটি অতিরিক্ত রয়েছে যা পিকামেরা এপিআইয়ের সাথে বিশেষভাবে ডিল করে। আপনি যেমন একটি বিভাজন করতে আপনার পছন্দসই আউটপুট ব্যবহার করতে পারেন (যতগুলি উপায় আপনি চান) এবং আউটপুটটিকে বিভিন্ন গন্তব্যে প্রেরণ করতে পারেন। আপনার ক্ষেত্রে, আপনি যদি কোনও ফাইল এবং সকেটে রেকর্ড করতে চান তবে আপনি এই জাতীয় কিছু করতে পারেন:

#!/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.