import subprocess as sp
import cv2 as cv
import subprocess
rtmpUrl = "rtmp://localhost:1935/live/home"
camera_path = 0
cap = cv.VideoCapture(camera_path)
# Get video information
fps = int(cap.get(cv.CAP_PROP_FPS))
width = int(cap.get(cv.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv.CAP_PROP_FRAME_HEIGHT))
# ffmpeg command
command = ['ffmpeg',
'-y',
'-f', 'rawvideo',
'-vcodec','rawvideo',
'-pix_fmt', 'bgr24',
'-s', "{}x{}".format(width, height),
'-r', str(fps),
'-i', '-',
'-c:v', 'libx264',
'-pix_fmt', 'yuv420p',
'-preset', 'ultrafast',
'-f', 'flv',
rtmpUrl]
# 管道配置
p = sp.Popen(command, stdin=sp.PIPE)
# read webcamera
while(cap.isOpened()):
ret, frame = cap.read()
frame_queue.put(frame)
if not ret:
print("Opening camera is failed")
break
# process frame
# your code
# process frame
# write to pipe
if frame_queue.empty() != True:
frame_new = frame_queue.get()
p.stdin.write(frame_new.tostring())
总结
初始目的:构建一套家用的视屏监控系统
可以支持如下功能:
- 录像
- 拍照
- 手机端、电脑端实时查看视频
- 外网可以实时查看视屏、已存储视频
现状:
用ffmpeg、nginx推rtmp视屏流,用vlc软件、手机app去看rtmp视频流。
1、会有3~5秒的卡顿,还是在局域网、性能较好的笔记本上运行,如果是树莓派延迟估计会更多。
2、如果继续优化延迟,估计要投入更多的时间和精力。
如果想实现初始目的,完全可以通过购买一个100多块钱的IP 摄像头来解决这个需求。
如果要是我自己搞的话:
树莓派 + 摄像头 : 会有延迟、需要自己写摄像头的存储、推流代码。
说白了吧,延迟太严重了,与其花时间解决难搞的延迟问题,不如买个IP摄像头。
【综上所述】:
1、已经完成整套系统,但是会有3~5秒的延迟。
2、不再花时间和精力解决延迟问题,如果后期真的需要,购买IP摄像头。