利用??低曄鄼C拍出來的視頻是H265格式的,相比于常規(guī)的H264編碼,壓縮率更高,但因此如果直接用正常取流方法讀取,會出現(xiàn)無法讀取的情況
1. 如圖h265碼流取出圖片為灰屏
?2 、解決灰屏問題
import subprocess
import cv2
# 將h265流轉(zhuǎn)換opencv可編譯格式返回
def get_frame_from_rtsp(rtsp_url):
# ( linux,windwos) docker容器內(nèi)部使用 兩者兼容 當(dāng)環(huán)境為linux時將傳輸協(xié)議改為tcp,否則轉(zhuǎn)換失敗 ( '-rtsp_transport', 'tcp')
command = [
'ffmpeg',
# rtsp_transport 參數(shù),通過設(shè)定這個參數(shù)值為 tcp ,使得ffmpeg強制使用tcp協(xié)議傳輸RTSP流(RTSP流模式使用UDP方式傳輸)。
'-rtsp_transport', 'tcp',
# 設(shè)置探測大小,指定用于探測輸入流的大小。在這里,150M 表示 150 兆字節(jié)的探測大小。
'-analyzeduration', '150M',
'-probesize', '150M',
# 指定輸入文件(RTSP 流)的 URL。
'-i', rtsp_url,
'-vf', 'fps=1,scale=1920:1080', # 設(shè)置幀率和圖像大小
# 指定輸出格式為圖像流。在這里,將輸出格式設(shè)置為圖像流,以便后續(xù)通過管道讀取。
'-f', 'image2pipe',
# 設(shè)置像素格式為 BGR24。在這里,將像素格式設(shè)置為 24 位 BGR 格式,即每個像素占據(jù) 3 字節(jié)。
'-pix_fmt', 'bgr24',
# 設(shè)置視頻編解碼器為原始視頻。 如果設(shè)置為264需要額外增添參數(shù) '-vcodec', 'libx264'
'-vcodec', 'rawvideo', '-'
]
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# 從 ffmpeg 進程中讀取一幀數(shù)據(jù)
raw_frame = process.stdout.read(1920 * 1080 * 3)
if not raw_frame:
return None
# 將幀數(shù)據(jù)轉(zhuǎn)換為 numpy 數(shù)組
frame = np.frombuffer(raw_frame, dtype=np.uint8).reshape((1080, 1920, 3))
return frame
frame = get_frame_from_rtsp(path)
if frame is not None:
# FILE_SAVE_PATH保存路徑地址
img_path = os.path.join(FILE_SAVE_PATH,'2023')
cv2.imwrite(img_path, frame) # 存儲為圖像
else
print('無法獲取到圖像')
3、轉(zhuǎn)換完成h265碼流圖片?
文章來源地址http://www.zghlxwxcb.cn/news/detail-785799.html
文章來源:http://www.zghlxwxcb.cn/news/detail-785799.html
到了這里,關(guān)于利用ffmpeg cv2取h265碼流視頻(轉(zhuǎn)換圖片灰屏問題解決)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!