Python进行ffmpeg推流和拉流rtsp、rtmp实例详解
芝士不知世_ 人气:0前言
流媒体协议,英文学名Streaming Protocol,用一句人话来解释:流媒体协议是一种用于通过 Web 传递多媒体的协议。传统视频流协议:RTMP和RTSP,其中 RTMP 是基于 TCP 开发的,那么 RTSP 使用到了 UDP 。
1.RTMP(Real Time Messaging Protocol,实时消息协议)
- 底层协议:TCP
- 视频编解码器:H.264
- 音频编解码器:AAC
- 延迟:3 - 30 秒
RTMP 的最大优点是可以在服务器和客户端服务器之间保持稳定的连接,无论用户的互联网连接质量如何,它都可以无缝低延迟进行流媒体传输。这个技术主要通过将数据流分成相等的小部分(音频数据默认为 64 字节,视频数据默认为 128 字节)并将它们顺序传输到接收设备,然后将它们重新组合成视频流来实现的。
RTMP 工作原理 ⭐
- 摄像头捕获视频
- 通过编码器将视频流传输到视频平台服务器
- 视频平台处理视频流
- 通过CDN分发到离用户最近的服务器上
- 最后视频流就能成功的到达用户设备
那么这个环节中RTMP就起到了非常重要的作用,在视频从摄像头到服务器的过程中,RTMP将大量数据分割成小块并跨多个虚拟通道传输,在视频源和 RTMP 服务器之间提供了稳定和流畅的视频流。
2.RTSP(Real Time Streaming Protocol,实时流协议)
- 底层协议:TCP 和 UDP
- 视频编解码器:H.265
- 音频编解码器:AAC
- 延迟:2 秒
RTSP 工作原理 ⭐
- 用户设备向视频流平台发送 RTSP 请求
- 视频流平台返回可以操作的请求列表,比如播放、暂停等
- 用户设备向视频流平台发送具体的请求,比如播放
- 视频流平台解析请求并调用指定机制启动视频流处理
由于 RTSP 依赖于专用服务器,并且依赖于 RTP,因此该协议不支持加密视频内容或重传丢失的数据包。
3.FFmpeg
FFmpeg 是一款用于多媒体处理的自由软件工具,基于 GPL 许可证发布。FFmpeg 提供的最核心的命令行工具是 “ffmpeg”,“ffmpeg” 命令行工具的主要特征是输出过程快、输出品质高、输出文件小。“FFmpeg” 中 “FF” 表示 “Fast Forward”,“mpeg” 表示 “Moving Pictures Experts Group”。
FFmpeg 提供如下四个命令行工具:
- ffmpeg 音视频编码器/解码器
- ffplay 媒体播放器
- ffprobe 显示媒体文件信息
- ffserver 多媒体流广播服务器,使用 HTTP 和 RTSP 协议。FFmpeg 4.1 版本已经删除 ffserver,新的替代者还未添加进来。
命令行实现:(和VLC工具等效)
ffmpeg推流rtsp
ffmpeg -re -i 1.mp4 -vcodec copy -codec copy -f rtsp rtsp://127.0.0.1:554/stream
推摄像头视频
ffmpeg -f dshow -i video="Integrated Camera" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -rtsp_transport udp -f rtsp rtsp://127.0.0.1/stream
ffplay拉流播放
ffplay rtsp://127.0.0.1:554/stream
4.python实现ffmpge的rtsp和rtmp推流拉流(待更)
# 本地摄像头推流 import queue import threading import cv2 import subprocess as sp # 自行设置,url为推送的服务器地址 rtmpUrl = "rtmp://localhost:1935/live/test" cap = cv2.VideoCapture(0) fps = int(cap.get(cv2.CAP_PROP_FPS)) width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # ffmpeg command command = ['ffmpeg', '-y', '-f', 'rawvideo', '-vcodec', 'rawvideo', '-pix_fmt', 'bgr24', '-s', "{}x{}".format(width, height), '-r', str(fps), '-i', '-', '-c:v', 'libx264', '-pix_fmt', 'yuv420p', '-preset', 'ultrafast', '-f', 'flv', rtmpUrl] # 设置管道 p = sp.Popen(command, stdin=sp.PIPE) while True: ret, frame = cap.read() p.stdin.write(frame.tostring())
总结
加载全部内容