当前位置:   article > 正文

使用 ffmpeg-python+命名管道进行图片转视频或推流_python ffmpeg推流

python ffmpeg推流

命名管道(Named Pipe),也被称为FIFO,是一种在UNIX、Linux和类Unix系统中用于实现进程间通信(IPC)的机制。在Python中,我们可以使用os模块来创建和操作命名管道。

命名管道实际上是个特殊的文件,需要先创建

  1. # 创建命名管道
  2. os.mkfifo(pipe_name)

读写前后需要打开关闭

  1. # 打开备写
  2. pipeout = os.open(pipe_name, os.O_WRONLY)
  3. # 写入数据
  4. os.write(pipeout, framedata)
  5. # 关闭管道
  6. os.close(pipeout)

ffmpeg从命名管道输入源的方法与普通文件输入类似

  1. # 从管道输入输入rawvideo
  2. video_in = ffmpeg.input(PIPE_VIDEO_PATH, format='rawvideo', pix_fmt='bgr24', s="{}x{}".format(VIDEO_WIDTH, VIDEO_HEIGHT))

完整代码,推流或生成视频仅需输入目标rtmp:

  1. # coding: utf-8
  2. import os
  3. import time
  4. import cv2
  5. import ffmpeg
  6. VIEW_PATH = 'view'
  7. VIDEO_WIDTH = 1280
  8. VIDEO_HEIGHT = 720
  9. PIPE_VIDEO_PATH = '/tmp/pipe'
  10. try:
  11. # 创建命名管道
  12. os.mkfifo( PIPE_VIDEO_PATH )
  13. except OSError:
  14. print("mkfifo error:", OSError)
  15. def main(rtmp='test.flv'):
  16. global VIDEO_HEIGHT
  17. global VIDEO_WIDTH
  18. filepath = os.path.join(VIEW_PATH, 'p640x1.jpg')
  19. src_img=cv2.imread(filepath)
  20. height, width, channels = src_img.shape
  21. VIDEO_HEIGHT = height
  22. VIDEO_WIDTH = width
  23. print('INFO', "height, width, channels : {} {} {}".format(height, width, channels))
  24. process_stdin = ffmpeg_process(rtmp)
  25. pipeout = os.open(PIPE_VIDEO_PATH, os.O_WRONLY) #打开命名管道准备写入
  26. s = time.time()
  27. count = 0
  28. while True:
  29. if count >= 10*25: #目标视频时长10秒
  30. break
  31. os.write(pipeout, src_img.tobytes())
  32. count+=1
  33. os.close(pipeout)
  34. process_stdin.stdin.close()
  35. process_stdin.wait()
  36. print(time.time()-s)
  37. return 0
  38. def ffmpeg_process(rtmp):
  39. # 从管道输入输入rawvideo
  40. video_in = ffmpeg.input(PIPE_VIDEO_PATH, format='rawvideo', pix_fmt='bgr24', s="{}x{}".format(VIDEO_WIDTH, VIDEO_HEIGHT))
  41. process_stdin = (
  42. ffmpeg
  43. .output(
  44. video_in,
  45. rtmp,
  46. #loglevel='quiet',
  47. vcodec='libx264',
  48. #acodec='aac',
  49. threads='3',
  50. # ac='2',
  51. # ar='44100',
  52. # ab='320k',
  53. preset='ultrafast',
  54. tune='zerolatency',
  55. f='flv'
  56. )
  57. .overwrite_output()
  58. #.run_async(cmd=["ffmpeg", "-re"],pipe_stdin=True) #推流
  59. .run_async(cmd=["ffmpeg"],pipe_stdin=True) #生成视频不用-re
  60. )
  61. return process_stdin
  62. if __name__ == '__main__':
  63. main()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/738721?site
推荐阅读
相关标签
  

闽ICP备14008679号