赞
踩
使用OpenCV的cv2.VideoCapture(videoname)获取关于视频的对象,使用该对象的.read()返回帧,本例使用cv2.cvtColor()对每帧进行颜色变换,注释的部分是原样输出。
把读出的每一帧,写到匿名管道中,同时ffmpeg-python通过该管道输入视频,视频为rawvideo格式,所以必须指定pix_fmt和长宽信息。
为了调试方便,rtmp地址写的是本地,可以使用ffplay或者VLC等工具接收串流。
最后,别忘了用.release()释放视频对象
- # coding=utf-8
- import cv2
- import ffmpeg
-
- # 本地调试地址
- # ffplay -f flv http://127.0.0.1:8081
-
-
- def file2rtmp():
- # RTMP推流地址dst, 用opencv把各种处理后的流推到dst
- rtmp_url = 'http://127.0.0.1:8081'
- cap = cv2.VideoCapture(r"../video/mp4.mp4")
- fps = int(cap.get(cv2.CAP_PROP_FPS))
- width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
- height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
-
- process_stdin = (
- ffmpeg
- #.input('pipe:', format='rawvideo', pix_fmt='bgr24', s="{}x{}".format(width, height))
- .input('pipe:', format='rawvideo', pix_fmt='gray', s="{}x{}".format(width, height))
- .output(
- rtmp_url,
- vcodec='libx264',
- acodec='aac',
- #crf=20, preset='slower', movflags='faststart', pix_fmt='yuv420p',
- listen=1, # enables HTTP server
- f='flv')
- .overwrite_output()
- .run_async(cmd=["ffmpeg", "-re"],pipe_stdin=True)
- )
-
- while cap.isOpened():
- ret, frame = cap.read()
- # 如果正确读取帧,ret为True
- if not ret:
- print("Can't receive frame. Exiting ...")
- break
- gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
- #cv2.imshow('frame', gray)
- process_stdin.stdin.write(gray.tobytes())
- if cv2.waitKey(1) & 0xFF == ord('q'):
- break
- cap.release()
- #cv2.destroyAllWindows()
- process_stdin.stdin.close()
- process_stdin.wait()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。