FFmpeg学习笔记(一):实现rtsp推流rtmp以及ffplay完成拉流操作 您所在的位置:网站首页 ffmpeg推流服务器崩溃 FFmpeg学习笔记(一):实现rtsp推流rtmp以及ffplay完成拉流操作

FFmpeg学习笔记(一):实现rtsp推流rtmp以及ffplay完成拉流操作

2023-08-18 17:46| 来源: 网络整理| 查看: 265

文章目录 了解ffmpeg安装Nginx安装rtsp转rtmp(终端显示)rtsp转rtmp(htlm显示)多个rtsp转rtmp(结合cmd运行)

了解

什么是RTSP?https://baike.baidu.com/item/RTSP/1276768?fr=aladdin 什么是RTMP?https://baike.baidu.com/item/rtmp/6113614?fr=aladdin 什么是ffmpeg?https://baike.baidu.com/item/ffmpeg/2665727?fr=aladdin 什么是nginx?https://baike.baidu.com/item/nginx/3817705?fr=aladdin

ffmpeg安装

ffmpeg的下载地址:https://www.gyan.dev/ffmpeg/builds/packages/ffmpeg-4.4-full_build.7z 下载后放入固定盘进行解压,把E:\ffmpeg\bin放入到系统环境变量下, 按win+R打开命令行窗口,输入ffmpeg -version,查看是否安装成功 在这里插入图片描述

Nginx安装 1.配置nginx文件,在conf文件夹里面有一个nginx-win.conf文件,将文件改名为nginx.conf,然后里面配置文件如下: 在这里插入图片描述

多加了下面这个代码,为了监听rtmp流的,这样才能正常拉流。 推流:指的是把采集阶段封包好的内容传输到服务器的过程。 拉流:是指服务器已有直播内容,用指定地址进行拉取的过程

2.使用cmd命令启动nginx,在命令窗口进入之前解压的文件夹根目录,然后输入start nginx.exe,会弹出一个窗口,闪一下就关闭3.然后在任务管理器的进程管理中,可以看到nginx.exe正在运行,到此nginx搭建完毕。 在这里插入图片描述在浏览器输入localhost或者127.0.0.1或者本机的IP地址,弹出如下页面表示搭建成功。 在这里插入图片描述 rtsp转rtmp(终端显示)

rtsp://admin:[email protected]:555//Streaming/Channels/1 rtsp://用户名:密码@摄像头IP地址:摄像头端口号//Streaming/Channels/1

rtmp://localhost:1935/live/1 rtmp://输出IP地址:端口号/live/1,这里的端口号/live/1需要和拉流的保持一致,如果你需要将视频流传到另一台电脑,那么只需要输入对应电脑下的IP地址即可,端口号和后面可保持不变。然后通过另一台来接收

windows转换代码如下:

# 本机拉流 ffmpeg -re -rtsp_transport tcp -i "rtsp://admin:[email protected]:555//Streaming/Channels/1" -f flv -vcodec libx264 -vprofile baseline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -flvflags no_duration_filesize -s 1280x720 -q 10 "rtmp://localhost:1935/live/1" # 其它机器拉流 ffmpeg -re -rtsp_transport tcp -i "rtsp://admin:[email protected]:555//Streaming/Channels/1" -f flv -vcodec libx264 -vprofile baseline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -q 10 "rtmp://10.16.55.26:1935/live/1"

windows接收代码如下:

# 本机拉流和其它机器拉流 ffplay “rtmp://127.0.0.1:1935/live/1”

linux转换/接收代码如下:

ffmpeg -re -rtsp_transport tcp -i "rtsp://admin:[email protected]:555//Streaming/Channels/1" -f flv -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -q 10 "rtmp://localhost:1935/live/1" ffmpeg -re -rtsp_transport tcp -i "rtsp://admin:[email protected]:555//Streaming/Channels/1" -f flv -vcodec libx264 -vprofile baseline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -q 10 "rtmp://localhost:1935/live/1" export DBUS_FATAL_WARNINGS=0 ffplay "rtmp://localhost:1935/live/1" ps -ef | grep nginx netstat -ano|grep 1935 /usr/local/nginx/nginx -s reload /usr/local/nginx/nginx -s stop /usr/local/nginx/nginx rtsp转rtmp(htlm显示)

转换代码如下:

ffmpeg -re -stream_loop -1 -rtsp_transport tcp -i "rtsp://admin:[email protected]:555//Streaming/Channels/1" -tune zerolatency -vcodec libx264 -preset ultrafast -b:v 400k -s 720x576 -r 25 -acodec libfaac -b:a 64k -f flv "rtmp://10.16.59.231:1935/live/1"

接收代码如下:

ffplay “rtmp://127.0.0.1:1935/live/1”

or通过下面这个代码直接打开对应的网页

DOCTYPE html> Video.js | HTML5 Video Player To view this video please enable JavaScript, and consider upgrading to a web browser that supports HTML5 video

结果如下图: 在这里插入图片描述 在这里插入图片描述

多个rtsp转rtmp(结合cmd运行) 思路 opencv读取视频 —> 将视频分割为帧 —> 将每一帧进行需求加工后 —> 将此帧写入pipe管道(放共享文件的地方) —> 利用ffmpeg进行推流直播 import cv2 import subprocess as sp url = 'rtsp://admin:[email protected]:555/h264/ch1/main/av_stream' ur2 = 'rtsp://admin:[email protected]:554/h264/ch1/main/av_stream' # cap = cv2.VideoCapture("rtsp://" + UserName + ":" + PassW + "@" + IpAddr + ":" + Port + "/Streaming/Channels/1") # 摄像头是否处于打开状态可以通过isOpened()方法进行判断 cap = cv2.VideoCapture(url) cap1 = cv2.VideoCapture(ur2) ret, frame = cap.read() ret1, frame1 = cap1.read() # 视频属性 自定义设定 size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))) sizeStr = str(size[0]) + 'x' + str(size[1]) fps = int(cap.get(cv2.CAP_PROP_FPS)) # 30p/self hz = int(1000.0 / fps) print('size:'+ sizeStr + ' fps:' + str(fps) + ' hz:' + str(hz)) # 视频属性 自定义设定 size1 = (int(cap1.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap1.get(cv2.CAP_PROP_FRAME_HEIGHT))) sizeStr1 = str(size1[0]) + 'x' + str(size1[1]) fps1 = int(cap1.get(cv2.CAP_PROP_FPS)) # 30p/self hz1 = int(1000.0 / fps1) print('size:'+ sizeStr1 + ' fps:' + str(fps1) + ' hz:' + str(hz1)) # ffmpeg推送rtmp 重点 : 通过管道 共享数据的方式 将图片帧 通过ffmpeg上传到服务器 上 command="ffmpeg -re -rtsp_transport tcp -i \"rtsp://admin:[email protected]:554//Streaming/Channels/1\" -f flv -vcodec libx264 -vprofile baseline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -q 5 \"rtmp://localhost:1935/live/2""" command1="ffmpeg -re -rtsp_transport tcp -i \"rtsp://admin:[email protected]:555//Streaming/Channels/1\" -f flv -vcodec libx264 -vprofile baseline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -q 5 \"rtmp://localhost:1935/live/1""" #管道特性配置 按需测试优化 # pipe = sp.Popen(command, stdout = sp.PIPE, bufsize=10**8) # print(command) pipe = sp.Popen(command, stdin=sp.PIPE) #,shell=False pipe1 = sp.Popen(command1, stdin=sp.PIPE) #,shell=False while ret: ret, frame = cap.read() ret1, frame1 = cap1.read() # cv2.imshow("frame",frame) pipe.stdin.write(frame.tostring()) # 存入管道用于直播 pipe.stdin.write(frame1.tostring()) # 存入管道用于直播 # if cv2.waitKey(1) & 0xFF == ord('q'): # break # cv2.destroyAllWindows() cap.release() cap1.release()

运行结果: 在这里插入图片描述 到这里推流成功,后面通过ffplay进行拉流,拉流的话这就取决于你设置的推理后面的IP地址,如果是本机,那么就可以直接通过本机的终端执行

ffplay “rtmp://127.0.0.1:1935/live/1” 或者 ffplay “rtmp://127.0.0.1:1935/live/2”

这里的1和2根据你前面rtsp后面部分设置的有关

执行效果如下: 在这里插入图片描述 上面这个代码由于是同步的关系很容易报存入管道的错误,你可以采用多线程的方式,多线程的方式可以看这篇博客 https://blog.csdn.net/m0_51004308/article/details/117487630



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有