網站首頁 編程語言 正文
前言
流媒體協議,英文學名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())
總結
原文鏈接:https://blog.csdn.net/weixin_54338498/article/details/127733496
相關推薦
- 2023-01-31 Android四大組件之broadcast廣播使用講解_Android
- 2022-10-15 淺談React?useDebounce?防抖原理_React
- 2022-10-28 keepalived對nginx進行高可用搭建及原理詳解_nginx
- 2022-03-30 Android實現定時任務功能_Android
- 2022-09-05 Spark repartitionAndSortWithinPartitions
- 2022-11-30 Python利用裝飾器click處理解析命令行參數_python
- 2023-07-09 windows找不到gpedit.msc,請確定文件名是否正確
- 2022-07-12 oracle?指定類型和指定位數創建序列號的代碼詳解_oracle
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支