python利用ffmpeg進行rtmp推流直播
思路:
opencv讀取視訊 —> 將視訊分割為幀 —> 將每一幀進行需求加工後 —> 將此幀寫入pipe管道 —> 利用ffmpeg進行推流直播
pipe管道:
啥是pipe管道? 粗略的理解就是一個放共享檔案的地方(理解不是很深刻。。。)
利用這個特點, 把處理後的圖片放入管道, 讓ffmpeg讀取處理後的影像幀並進行rtmp推流即可
程式碼
import subprocess as sp
rtmpUrl = ""
camera_path = ""
cap = cv.VideoCapture(camera_path)
# Get video information
fps = int(cap.get(cv.CAP_PROP_FPS))
width = int(cap.get(cv.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv.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)
# read webcamera
while(cap.isOpened()):
ret, frame = cap.read()
if not ret:
print("Opening camera is failed")
break
# process frame
# your code
# process frame
# write to pipe
p.stdin.write(frame.tostring())
程式碼說明:
- rtmpUrl就是要接收視訊的伺服器了, 我做實驗時是在自己機子上配置了一個nginx伺服器接收視訊流(ubuntu 不要通過apt安裝哦, 請從原始碼安裝, 因為apt安裝的版本沒有rtmp協議, 需要下載nginx原始碼然後配合nginx-rtmp-module這個東西安裝 推薦一篇nginx安裝教程)
- camera_path就是要進行直播的視訊地址了
- 重點的程式碼其實就這幾句:
import subprocess as sp
# 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)
# write to pipe
p.stdin.write(frame.tostring())
- 我讀取的視訊是rtsp網路攝像頭的視訊流, 但是一旦執行沒多久就會出現 pipe broke 的報錯(1080p視訊), 不知道是什麼原因, 若有大神還請指點指點
WriteN, RTMP send error 104 (129 bytes)
更新: 我改1080p為720p 暫時沒出現這個問題
- 我在讀取視訊時候還遇到這個報錯
error while decoding xxx
經過一方百度, 是“FFMPEG Lib對在rtsp協議中的H264 vidos不支援”的問題, 解決方法: 程式開啟兩個執行緒, 一個執行緒讀取攝像頭的幀, 另一個執行緒處理這幀圖片, 這裡還推薦一個大佬用佇列處理視訊的方法 ,大家可以套用一下啊 飛機票 多執行緒處理的版本:
import queue
import threading
import cv2 as cv
import subprocess as sp
class Live(object):
def __init__(self):
self.frame_queue = queue.Queue()
self.command = ""
# 自行設定
self.rtmpUrl = ""
self.camera_path = ""
def read_frame(self):
print("開啟推流")
cap = cv.VideoCapture(self.camera_path)
# Get video information
fps = int(cap.get(cv.CAP_PROP_FPS))
width = int(cap.get(cv.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv.CAP_PROP_FRAME_HEIGHT))
# ffmpeg command
self.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',
self.rtmpUrl]
# read webcamera
while(cap.isOpened()):
ret, frame = cap.read()
if not ret:
print("Opening camera is failed")
# 說實話這裡的break應該替換為:
# cap = cv.VideoCapture(self.camera_path)
# 因為我這倆天遇到的專案裡出現斷流的毛病
# 特別是拉取rtmp流的時候!!!!
break
# put frame into queue
self.frame_queue.put(frame)
def push_frame(self):
# 防止多執行緒時 command 未被設定
while True:
if len(self.command) > 0:
# 管道配置
p = sp.Popen(self.command, stdin=sp.PIPE)
break
while True:
if self.frame_queue.empty() != True:
frame = self.frame_queue.get()
# process frame
# 你處理圖片的程式碼
# write to pipe
p.stdin.write(frame.tostring())
def run(self):
threads = [
threading.Thread(target=Live.read_frame, args=(self,)),
threading.Thread(target=Live.push_frame, args=(self,))
]
[thread.setDaemon(True) for thread in threads]
[thread.start() for thread in threads]
博主忙著做專案ing 能力也不是很高 歡迎和大家一起討論 但是有的是真不會呀 還請見諒
相關文章
- Android中使用ffmpeg編碼進行rtmp推流Android
- 使用linux的ffmpeg進行B站直播推流Linux
- ffmpeg 推流檔案,採用rtmp協議協議
- FFmpeg開發筆記(三十一)使用RTMP Streamer開啟APP直播推流筆記APP
- FFmpeg開發筆記(三十八)APP如何訪問SRS推流的RTMP直播地址筆記APP
- nginx 轉發 rtmp 直播流Nginx
- Android 如何直播 RTMP 流Android
- FFmpeg開發筆記(四十)Nginx整合rtmp模組實現RTMP推拉流筆記Nginx
- 實現直播帶貨系統推流,你進行推流監控了嗎?
- Nginx-RTMP推流(video)NginxIDE
- Nginx-RTMP推流(audio)Nginx
- day122:MoFang:OSSRS流媒體直播伺服器&基於APICloud的acLive直播推流模組實現RTMP直播推流伺服器APICloud
- FFMPEG 抓RTSP流,推送RTMP至FMS伺服器伺服器
- ffmpeg+nginx+rtmp+web實現視訊直播網站NginxWeb網站
- [RTMP] 國內各大視訊直播CDN廠商推流搶流行為分析
- Web直播系列4——ffmpeg實時推流+nginx負載均衡降低直播延時_1WebNginx負載
- NGINX如何實現rtmp推流服務Nginx
- [SRS流媒體]RTMP/HLS 直播伺服器simple-rtmp-server安裝伺服器Server
- 帶貨直播系統,透過ffmpeg推流實現首屏秒開
- FFmpeg總結(十三)用ffmpeg基於nginx實現直播功能,不用第三方SDK,自研推流拉流Nginx
- windows下利用ffmpeg進行視訊格式轉換Windows
- nginx+ffmpeg搭建流媒體伺服器(直播流)Nginx伺服器
- 基於SRS搭建RTMP直播流媒體伺服器伺服器
- RTMP推流平臺/視訊直播點播分析平臺/人臉識別系統EasyDSS如何實現RTMP負載均衡?負載
- OBS 配合 nginx_rtmp_module 模組 可以多路推流Nginx
- FFmpeg開發筆記(四十五)使用SRT Streamer開啟APP直播推流筆記APP
- 【OSS排查方案-4】OSS+RTMP推流的JAVA方法Java
- 利用nginx搭建RTMP視訊點播、直播、HLS伺服器Nginx伺服器
- FFmpeg開發筆記(四十一)結合OBS與MediaMTX實現SRT直播推流筆記
- FFmpeg實現監控攝像頭的RTSP協議轉RTMP協議直播協議
- ffmpeg+nginx將rtsp轉為rtmpNginx
- Nginx+FFmpeg實現RTSP轉RTMPNginx
- Ubuntu 中使用 Nginx+rtmp 搭建流媒體直播服務.mdUbuntuNginx
- NGINX如何實現rtmp推流服務--視訊快取Nginx快取
- 【開源專案】向Nginx-RTMP伺服器推流Nginx伺服器
- FFmpeg開發筆記(三十六)Linux環境安裝SRS實現影片直播推流筆記Linux
- 將海康大華等網路攝像機RTSP流進行網頁Flash rtmp和H5 hls直播的技術方案網頁H5
- python:利用asyncio進行快速抓取Python