python 图片转视频ffmpeg_如何使用子流程(Python)将Picamera视频转换为FFMPEG

我看到大量有关将raspivid流直接传递给FFMPEG以进行编码,复用和重新定向的信息,但这些用例大部分来自bash;类似于:如何使用子流程(Python)将Picamera视频转换为FFMPEG

raspivid -n -w 480 -h 320 -b 300000 -fps 15 -t 0 -o - | ffmpeg -i - -f mpegts udp://192.168.1.2:8090ffmpeg

我希望能够利用Picamera库的功能,所以我可以使用OpenCV和类似的方法进行并发处理,同时仍然使用FFMPEG进行流式处理。但我不知道如何正确打开FFMPEG作为子流程和管道视频数据。我看到很多尝试,unanswered posts和人claiming to have done it,但它似乎没有在我的Pi上工作。

我应该用Picamera创建一个视频缓冲区,并将原始视频传输到FFMPEG?我可以使用camera.capture_continuous()并传递FFMPEG我用于OpenCV计算的bgr24图像吗?

我试过各种各样的变化,我不知道如果我只是误解如何使用子进程模块,FFMPEG,或者我只是缺少一些设置。我知道原始流不会有任何元数据,但我不完全确定我需要给FFMPEG什么设置以了解我给它的内容。

我有一个Wowza服务器,我最终会流到,但我目前正在通过流式传输到笔记本电脑上的VLC服务器进行测试。目前我已经试过这样:

import subprocess as sp

import picamera

import picamera.array

import numpy as np

npimage = np.empty(

(480, 640, 3),

dtype=np.uint8)

with picamera.PiCamera() as camera:

camera.resolution = (640, 480)

camera.framerate = 24

camera.start_recording('/dev/null', format='h264')

command = [

'ffmpeg',

'-y',

'-f', 'rawvideo',

'-video_size', '640x480',

'-pix_fmt', 'bgr24',

'-framerate', '24',

'-an',

'-i', '-',

'-f', 'mpegts', 'udp://192.168.1.54:1234']

pipe = sp.Popen(command, stdin=sp.PIPE,

stdout=sp.PIPE, stderr=sp.PIPE, bufsize=10**8)

if pipe.returncode != 0:

output, error = pipe.communicate()

print('Pipe failed: %d %s %s' % (pipe.returncode, output, error))

raise sp.CalledProcessError(pipe.returncode, command)

while True:

camera.wait_recording(0)

for i, image in enumerate(

camera.capture_continuous(

npimage,

format='bgr24',

use_video_port=True)):

pipe.stdout.write(npimage.tostring())

camera.stop_recording()

我也试过流写入,简单地创建ffmpeg的子进程,并写入到它的标准输入一个类文件对象(camera.start_recording()可以给出一个对象像这样,当你初始化picam):

class PipeClass():

"""Start pipes and load ffmpeg."""

def __init__(self):

"""Create FFMPEG subprocess."""

self.size = 0

command = [

'ffmpeg',

'-f', 'rawvideo',

'-s', '640x480',

'-r', '24',

'-i', '-',

'-an',

'-f', 'mpegts', 'udp://192.168.1.54:1234']

self.pipe = sp.Popen(command, stdin=sp.PIPE,

stdout=sp.PIPE, stderr=sp.PIPE)

if self.pipe.returncode != 0:

raise sp.CalledProcessError(self.pipe.returncode, command)

def write(self, s):

"""Write to the pipe."""

self.pipe.stdin.write(s)

def flush(self):

"""Flush pipe."""

print("Flushed")

usage:

(...)

with picamera.PiCamera() as camera:

p = PipeClass()

camera.start_recording(p, format='h264')

(...)

任何这帮助将是惊人的!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值