当前位置: 首页 > 面试题库 >

将原始OpenCV映像管道传输到FFmpeg

裴金鑫
2023-03-14
问题内容

这是一个使用OpenCV的python绑定读取网络摄像头的简单示例:

'''capture.py'''
import cv, sys
cap = cv.CaptureFromCAM(0)                    # 0 is for /dev/video0
while True :
    if not cv.GrabFrame(cap) : break
    frame = cv.RetrieveFrame(cap)
    sys.stdout.write( frame.tostring() )

现在,我想将输出通过管道传递给ffmpeg,如下所示:

$ python capture.py | ffmpeg -f image2pipe -pix_fmt bgr8 -i--s 640x480 foo.avi

可悲的是,我无法完全正确地实现ffmpeg魔咒,并且失败了

  libavutil 50.15。1 / 50.15。1个
  libavcodec 52.72。2 / 52.72。2
  libavformat 52.64。2 / 52.64。2
  libavdevice 52. 2. 0 / 52. 2. 0
  libavfilter 1.19。0 / 1.19。0
  libswscale 0.11。0 / 0.11。0
  libpostproc 51. 2. 0 / 51. 2. 0
输出#0,avi,到'out.avi':
    流#0.0:视频:flv,yuv420p,640x480,q = 2-31、19660 kb / s,90k tbn,30 tbc
[image2pipe @ 0x1508640]已达到max_analyze_duration
[image2pipe @ 0x1508640]从比特率估算持续时间,这可能不准确
从'pipe:'输入#0,image2pipe:
  持续时间:不适用,比特率:不适用
    流#0.0:视频:0x0000,bgr8、25 fps,25 tbr,25 tbn,25 tbc
swScaler:0x0-> 640x480缩放比例无效
  • 捕获的帧绝对是640x480。
  • 我很确定OpenCV图像类型(IplImage)的像素顺序是GBR,每个通道一个字节。至少,这似乎是从相机上脱落的。

我不是ffmpeg大师。有人成功做到了吗?


问题答案:

摆弄了一些摆弄,但我使用FFmpeg rawvideo demuxer弄清楚了:

python capture.py | ffmpeg -f rawvideo -pixel_format bgr24 -video_size 640x480 -framerate 30 -i - foo.avi

由于原始视频中没有标头来指定假定的视频参数,因此用户必须指定它们才能正确解码数据:

  • -framerate设置输入视频帧率。预设值为25。
  • -pixel_format设置输入视频像素格式。默认值为yuv420p。
  • -video_size设置输入视频尺寸。没有默认值,因此必须显式指定此值。

对于高级用户来说,这里还有一些额外的东西。相同,但使用VLC将实时输出流式传输到Web Flash格式:

python capture.py | cvlc --demux=rawvideo --rawvid-fps=30 --rawvid-width=320 --rawvid-height=240  --rawvid-chroma=RV24 - --sout "#transcode{vcodec=h264,vb=200,fps=30,width=320,height=240}:std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=:8081/stream.flv}"

编辑:使用ffmpeg和ffserver创建一个webm流

python capture.py | ffmpeg -f rawvideo -pixel_format rgb24 -video_size 640x480 -framerate 25 -i - http://localhost:8090/feed1.ffm


 类似资料:
  • (编辑:我现在试图将[]字节数组传输到ffmpeg,但是ffmpeg没有填满我的缓冲区: 但我得到以下错误: [mov,mp4,m4a,3GP,3G2,mj2@0x7FF05D002600]流0,偏移量0x5Ded:部分文件

  • 我目前正在使用一个名为s3-upload-stream的Node.js插件,将非常大的文件传输到Amazon S3。它使用multipart API,并且在很大程度上工作得很好。 是否有一种方法可以使aws-sdk成为我可以将流管道传输到的东西?

  • 我想把我的形象推广到Docker Hub。这项任务似乎很简单,但我对细节一无所知。 变量的值应该是什么,以及如何构造它?这些说明似乎可以解释,但我不明白。

  • 我正在尝试从管道(如stdin,named pipe等)加载图像。 这是我的示例代码: #包括“opencv2/opencv.hpp” 使用名称空间CV; int main(int argc,char**argv){ } 会有用的,但是 而且 不能工作,并且Mat img的行和列为0。 真正的文件和管道有什么区别?

  • 问题内容: 使用opencv在python中将RGB图像转换为RGBA的最佳方法是什么? 假设我有一个形状数组 另一个是带有形状的alpha蒙版 如何合并它们并保存到文件? 问题答案: 您可以用来将Alpha通道添加到给定的RGB图像,但是首​​先需要按照文档将RGB图像拆分为通道: Python:cv2.merge(mv [,dst]) mv –要合并的矩阵的输入数组或向量;mv中的所有矩阵必须

  • null (它也应该与ffprobe和ffplay一起工作)