日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Python進行ffmpeg推流和拉流rtsp、rtmp實例詳解_python

作者:芝士不知世_ ? 更新時間: 2023-02-15 編程語言

前言

流媒體協議,英文學名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

欄目分類
最近更新