天天看點

ffmpeg rtmp 不清晰_GB28181學習筆記7 媒體流轉推rtmp一、說明二、準備工作三、實作

一、說明

本文接上篇,實作功能:

  1. 接收攝像頭的rtp流
  2. 推送rtp流到rtmp伺服器
  3. 使用vlc播放rtmp視訊

二、準備工作

1. 按前篇完成GB28181 invite解析

2. 安裝vls播放器、準備ffmpeg工具

3. 準備ZLMediaKit

https://github.com/xiongziliang/ZLMediaKit/wiki/ZLMediaKit%E6%8E%A8%E6%B5%81%E6%B5%8B%E8%AF%95

三、實作

1. 看看攝像頭是否有流推出來

經過前幾篇的功能,現在已經有媒體流推送到伺服器端口,如果使用ffmpeg和 nginx-rtmp,可以測試有沒有流:(這裡實際可以跳過,隻是驗證有流但不能正确播放)現在建立一個sdp檔案,放媒體資訊:

v=0o=34020000001320000001 0 0 IN IP4 媒體伺服器ips=Playc=IN IP4 媒體伺服器ipt=0 0m=video 10000 RTP/AVP 96 97 98a=sendrecva=rtpmap:96 PS/90000a=rtpmap:98 H264/90000a=rtpmap:97 MPEG4/90000y=00000000031234567891011
           

媒體資訊在攝像頭回複的invite資訊裡可以看到。執行指令:

ffmpeg -protocol_whitelist "file,rtp,udp,tls" -i test1.sdp -vcodec copy -acodec copy -f flv rtmp://nginx 位址:9092/hls/t_1_1
           

使用vlc打開rtmp位址:

rtmp://nginx位址:9092/hls/t_1_1
           

正常情況就有視訊出現了。但顯示的畫面很可能是不正常的,

ffmpeg rtmp 不清晰_GB28181學習筆記7 媒體流轉推rtmp一、說明二、準備工作三、實作

這是由于GB28181的封包格式是RTP承載PS流。下面使用ZL搭一個媒體伺服器。

2.安裝ZL作媒體伺服器

ZLMediaKit 是一個基于C++11的高性能營運級流媒體服務架構,目前在快速疊代更新中。其項目特點:

ffmpeg rtmp 不清晰_GB28181學習筆記7 媒體流轉推rtmp一、說明二、準備工作三、實作
  • 基于C++11開發,避免使用裸指針,代碼穩定可靠,性能優越。
  • 支援多種協定(RTSP/RTMP/HLS/HTTP-FLV/Websocket-FLV/GB28181/MP4),支援協定互轉。
  • 使用多路複用/多線程/異步網絡IO模式開發,并發性能優越,支援海量用戶端連接配接。
  • 代碼經過長期大量的穩定性、性能測試,已經線上上商用驗證已久。 支援linux、macos、ios、android、windows全平台。
  • 支援畫面秒開、極低延時(500毫秒内,最低可達100毫秒)。 提供完善的标準C API,可以作SDK用,或供其他語言調用。
  • 提供完整的MediaServer伺服器,可以免開發直接部署為商用伺服器。 提供完善的restful api以及web
  • hook,支援豐富的業務邏輯。 打通了視訊監控協定棧與直播協定棧,對RTSP/RTMP支援都很完善。
  • 全面支援H265/H264/AAC/G711。

可以從:https://github.com/xiongziliang/ZLMediaKit/releases下載下傳可執行檔案,這裡在CentOS系統使用docker:

# 建立dockerdocker run -id -p 10000:10000/udp -p 1935:1935 -p 8080:80 -p 554:554 -p 332:332 -p 9000:9000 gemfield/zlmediakit:20.04-runtime-ubuntu18.04
           

其它docker指令:

# 進入容器docker exec -it containerid /bin/bash# 啟動容器docker start containerid
           

ZLMediaKit預設使用10000端口收GB28181流。

ZLMediaKit收到流後,會列印:

ffmpeg rtmp 不清晰_GB28181學習筆記7 媒體流轉推rtmp一、說明二、準備工作三、實作

日志中相關字元串分别代表:

2020-04-10 12:51:52.331 I | regist rtsp __defaultVhost__ rtp 206442D7                                    ^           ^         ^      ^                                  schema      vhost      app stream_id
           

如果控制台提示:

onDecode unsupported codec type:STREAM_AUDIO_G711
           

就把攝像頭的音頻編碼格式調整一下。

使用vlc就可以打開視訊了:206442D7

rtsp://ip/rtp/206442D7rtmp://ip/rtp/206442D7
           

接下來對整個項目進行整合。