一、rtsp服务器搭建

  1. 下载rtsp-simple-server,根据自己电脑选择合适的版本 [https://github.com/aler9/rtsp-simple-server/releases](https://github.com/aler9/rtsp-simple-server/releases)

image.png
下载完毕后得到压缩包
image.png

  1. 使用tar -xvf filename.tar命令解压到rtsp文件夹,该文件夹目录下有两个文件

image.png image.png

  1. 在rtsp文件夹下使用./rtsp-simple-server命令运行服务器

image.png

若出现端口号被占用,可以杀死占用该端口号的进程,或者在rtsp-simple-server.yml文件里修改端口号

二、ffmpeg视频推流

修改rtsp_stream.py文件中rtspurl以及camera参数来源以后运行该文件,此时就会将视频流推到服务器上,客户端可进行拉流操作。
ffmpeg推流:
image.png
服务器端显示:
image.png

  1. import cv2
  2. import subprocess as sp
  3. rtspUrl = 'rtsp://192.168.144.112:8554/main.264' #这里改成本地ip,端口号不变,文件夹自定义
  4. # 视频来源 地址需要替换自己的可识别文件地址
  5. # filePath=''
  6. camera = cv2.VideoCapture('ccat.mp4') # 从文件读取视频
  7. # 视频属性
  8. size = (int(camera.get(cv2.CAP_PROP_FRAME_WIDTH)), int(camera.get(cv2.CAP_PROP_FRAME_HEIGHT)))
  9. sizeStr = str(size[0]) + 'x' + str(size[1])
  10. fps = camera.get(cv2.CAP_PROP_FPS) # 30p/self
  11. fps = int(fps)
  12. hz = int(1000.0 / fps)
  13. print('size:'+ sizeStr + ' fps:' + str(fps) + ' hz:' + str(hz))
  14. # 视频文件输出
  15. fourcc = cv2.VideoWriter_fourcc(*'XVID')
  16. #out = cv2.VideoWriter('res_mv.avi',fourcc, fps, size)
  17. # 直播管道输出
  18. # ffmpeg推送rtmp 重点 : 通过管道 共享数据的方式
  19. command = [
  20. 'ffmpeg',
  21. # 're',#
  22. # '-y', # 无需询问即可覆盖输出文件
  23. '-f', 'rawvideo', # 强制输入或输出文件格式
  24. '-vcodec','rawvideo', # 设置视频编解码器。这是-codec:v的别名
  25. '-pix_fmt', 'bgr24', # 设置像素格式
  26. '-s', sizeStr, # 设置图像大小
  27. '-r', str(fps), # 设置帧率
  28. '-b:v','2M',
  29. #'maxrate','2048k',
  30. '-i', '-', # 输入
  31. #'-bufsize','2000k',
  32. '-c:v', 'libx264',
  33. '-pix_fmt', 'yuv420p',
  34. '-preset', 'ultrafast',
  35. '-rtsp_transport','tcp',
  36. '-f', 'rtsp',# 强制输入或输出文件格式
  37. rtspUrl]
  38. #管道特性配置
  39. # pipe = sp.Popen(command, stdout = sp.PIPE, bufsize=10**8)
  40. pipe = sp.Popen(command, stdin=sp.PIPE) #,shell=False
  41. # pipe.stdin.write(frame.tostring())
  42. while (camera.isOpened()):
  43. ret, frame = camera.read() # 逐帧采集视频流
  44. if not ret:
  45. break
  46. ############################图片输出
  47. # 结果帧处理 存入文件 / 推流 / ffmpeg 再处理
  48. cv2.imshow('result',frame)
  49. cv2.waitKey(1)
  50. pipe.stdin.write(frame.tostring()) # 存入管道用于直播
  51. #out.write(frame) #同时 存入视频文件 记录直播帧数据
  52. camera.release()
  53. #out.release()