当前位置:   article > 正文

使用 ffmpeg-python + OpenCV + 匿名管道 推流_python ffmpeg创建无名管道

python ffmpeg创建无名管道

使用OpenCV的cv2.VideoCapture(videoname)获取关于视频的对象,使用该对象的.read()返回帧,本例使用cv2.cvtColor()对每帧进行颜色变换,注释的部分是原样输出。

把读出的每一帧,写到匿名管道中,同时ffmpeg-python通过该管道输入视频,视频为rawvideo格式,所以必须指定pix_fmt和长宽信息。

为了调试方便,rtmp地址写的是本地,可以使用ffplay或者VLC等工具接收串流。

最后,别忘了用.release()释放视频对象

  1. # coding=utf-8
  2. import cv2
  3. import ffmpeg
  4. # 本地调试地址
  5. # ffplay -f flv http://127.0.0.1:8081
  6. def file2rtmp():
  7. # RTMP推流地址dst, 用opencv把各种处理后的流推到dst
  8. rtmp_url = 'http://127.0.0.1:8081'
  9. cap = cv2.VideoCapture(r"../video/mp4.mp4")
  10. fps = int(cap.get(cv2.CAP_PROP_FPS))
  11. width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
  12. height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
  13. process_stdin = (
  14. ffmpeg
  15. #.input('pipe:', format='rawvideo', pix_fmt='bgr24', s="{}x{}".format(width, height))
  16. .input('pipe:', format='rawvideo', pix_fmt='gray', s="{}x{}".format(width, height))
  17. .output(
  18. rtmp_url,
  19. vcodec='libx264',
  20. acodec='aac',
  21. #crf=20, preset='slower', movflags='faststart', pix_fmt='yuv420p',
  22. listen=1, # enables HTTP server
  23. f='flv')
  24. .overwrite_output()
  25. .run_async(cmd=["ffmpeg", "-re"],pipe_stdin=True)
  26. )
  27. while cap.isOpened():
  28. ret, frame = cap.read()
  29. # 如果正确读取帧,ret为True
  30. if not ret:
  31. print("Can't receive frame. Exiting ...")
  32. break
  33. gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
  34. #cv2.imshow('frame', gray)
  35. process_stdin.stdin.write(gray.tobytes())
  36. if cv2.waitKey(1) & 0xFF == ord('q'):
  37. break
  38. cap.release()
  39. #cv2.destroyAllWindows()
  40. process_stdin.stdin.close()
  41. process_stdin.wait()

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/738727
推荐阅读
相关标签
  

闽ICP备14008679号