当前位置:   article > 正文

yolov8实战第五天——yolov8+ffmpeg实时视频流检测并进行实时推流——(推流,保姆教学)_java yolo8 视频流

java yolo8 视频流

yolov8实战第一天——yolov8部署并训练自己的数据集(保姆式教程)_yolov8训练自己的数据集-CSDN博客

yolov8实战第三天——yolov8TensorRT部署(python推理)(保姆教学)-CSDN博客

今天,我们继续yolov8的实战,实时视频流检测,可以将本地视频或视频流,进行yolov8检测后的结果,推成rtsp流,可以实时看到检测结果。

YOLOv8是YOLO目标检测算法的一个变种。它在YOLOv4的基础上进行了一些改进,如使用更大的图像尺寸、更深的网络结构、更多的训练数据等,从而获得更好的检测精度和更快的检测速度。

实时视频流目标检测是一种非常有用的应用场景。例如,在视频监控系统中,我们需要对视频流进行实时分析和检测,以便及时发现异常事件和行为。另外,实时视频流目标检测也可以用于自动驾驶、无人机等领域。

要将YOLOv8和FFmpeg结合起来进行实时视频流目标检测,通常的做法是使用FFmpeg将视频流转换为图像帧,并将这些图像帧输入到YOLOv8模型中进行目标检测。具体步骤如下:

  1. 定义视频流地址,并使用FFmpeg启动一个进程来读取视频流,并将其转换为图像帧。
  2. 加载YOLOv8模型,并设置相关参数,如输入图像尺寸、阈值等。
  3. 循环读取每一帧图像,并将其输入到YOLOv8模型中进行目标检测。
  4. 处理检测结果,如筛选出置信度高的检测框、绘制边界框等。
  5. 可以将处理后的图像帧保存到视频文件中,也可以直接在屏幕上显示图像帧(使用OpenCV等库)。

实施这个项目的意义在于,它可以帮助我们快速地对实时视频流进行目标检测,并及时发现异常事件和行为。这对于一些需要实时监控和分析的领域非常有用,如安防、交通、医疗等。另外,这个项目也可以为自动驾驶、无人机等领域的研究提供基础支持。

一、下载ffmpeg

下载 FFmpeg

E:\2345Downloads\ffmpeg-2023-12-18-git-be8a4f80b9-essentials_build\bin

ffmpeg -version

 二、(可选)搭建EasyDarwin开源流媒体服务器

第二章和第三章二选一 。

测试:

新建一个 demo.bat 的文件,添加内容为:ffmpeg -f gdigrab -i desktop -vcodec mpeg4 -acodec libmp3ame -r 30 -vf scale=1028*720 -f rtsp rtsp://localhost:554/desktopVideo

 http://localhost:10008

 vlc打开:

rtsp://localhost:554/desktopVideo

在cmd中运行 ffplay rtsp://localhost/desktopVideo 进行拉流。 

本地视频推流:

E:\yolov8>ffmpeg -re -i "E:/yolov8/视频/test.mp4" -rtsp_transport udp -vcodec h264 -f rtsp rtsp://localhost/testPushStream

开始推流 

访问: 

http://localhost:10008/

 

vlc打开:

rtsp://localhost:554/testPushStream

命令行推流完成。

三、(可选)Nginx搭建rtmp流媒体服务器

windows版nginx下载地址:Index of /download/

在conf文件夹下复制一份nginx-win.conf,命名为mynginx.conf

修改配置文件:mynginx.conf

改一下默认的http服务器端口,默认的是80端口,我改成了10080:

在本配置文件末尾添加rtmp的配置:

  1. rtmp {
  2. server {
  3. listen 1935;#监听端口,若被占用,可以更改
  4. chunk_size 4096;#上传flv文件块儿的大小
  5. application live { #创建一个叫live的应用
  6. live on;#开启live的应用
  7. allow publish 127.0.0.1;
  8. allow play all;
  9. }
  10. }
  11. }

这个配置完之后,推流地址就是:

rtmp://127.0.0.1:1935/live/xxxxxx

,其中xxxxxx可自定义名称。

1.使用命令行启动nginx:

nginx.exe -c conf/mynginx.conf

2. 使用ffmpeg推流:

ffmpeg.exe -re -i test.mp4 -vcodec libx264 -acodec aac -f flv rtmp://127.0.0.1:1935/live/stream

3.ffmpeg拉流 

ffplay.exe rtmp://127.0.0.1:1935/live/stream

如果需要停止nginx服务器,直接杀进程就可以:

四、yolov8推理代码推流

我这个代码使用的是nginx流媒体服务器。

1.先将服务打开:

2.运行检测推流代码: 

  1. import cv2
  2. import subprocess
  3. from ultralytics import YOLO
  4. # 载入 YOLOv8 模型
  5. model = YOLO('model/yolov8n.pt')
  6. # 获取视频内容
  7. cap = cv2.VideoCapture("视频/test.mp4")
  8. # 获取原视频的宽度和高度
  9. original_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
  10. original_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
  11. fps = int(cap.get(cv2.CAP_PROP_FPS))
  12. # 设置 FFmpeg 子进程,用于推流
  13. rtmp_url = 'rtmp://127.0.0.1:1935/live/stream' # 修改为您的 NGINX RTMP 服务器地址
  14. command = ['ffmpeg',
  15. '-y',
  16. '-f', 'rawvideo',
  17. '-vcodec', 'rawvideo',
  18. '-pix_fmt', 'bgr24',
  19. '-s', "{}x{}".format(original_width, original_height),
  20. '-r', str(fps),
  21. '-i', '-',
  22. '-c:v', 'libx264',
  23. '-pix_fmt', 'yuv420p',
  24. '-preset', 'ultrafast',
  25. '-f', 'flv',
  26. rtmp_url]
  27. # 启动 FFmpeg 进程
  28. proc = subprocess.Popen(command, stdin=subprocess.PIPE)
  29. # 循环遍历视频帧
  30. while cap.isOpened():
  31. # 从视频中读取一帧
  32. success, frame = cap.read()
  33. if success:
  34. # 对帧运行 YOLOv8 推理
  35. results = model(frame)
  36. # 在帧上可视化结果
  37. annotated_frame = results[0].plot()
  38. # 将处理后的帧写入 FFmpeg 进程
  39. proc.stdin.write(annotated_frame.tobytes())
  40. # 显示带有标注的帧
  41. cv2.imshow("YOLOv8 推理", annotated_frame)
  42. # 如果按下 'q' 键,则中断循环
  43. if cv2.waitKey(1) & 0xFF == ord("q"):
  44. break
  45. else:
  46. break
  47. # 释放视频捕获对象
  48. cap.release()
  49. # 关闭 FFmpeg 进程
  50. proc.stdin.close()
  51. proc.wait()
  52. # 关闭显示窗口
  53. cv2.destroyAllWindows()

3.vlc 打开:

rtmp://127.0.0.1:1935/live/stream

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号