前幾天經理給我安排了一個新任務,將網絡攝像頭用rtsp協議在頁面播放,因為我以前做的是http協議的,根據攝像頭的API來實現的,所以這一塊根本不懂,看了前輩們寫的博客,學習到了許多,在這里記錄下來,以后用的時候還能看看。
目前需要用到技術有ffmpeg、nginx、rtsp以及rtmp協議,頁面播放器VLC、flash、video.js都可以,在使用之前先對這些技術做一個大體的了解。
- RTSP
要知道什么是RTSP?點擊鏈接 - RTMP
什么是RTMP?點擊鏈接 - ffmpeg
什么是ffmpeg?點擊鏈接 - nginx
什么是nginx?點擊鏈接
ffmpeg的下載地址:https://ffmpeg.zeranoe.com/builds/win64/static/
nginx的下載地址:http://nginx-win.ecsds.eu/download/
根據需要下載自己所需要的版本之后,接下來開始搭建服務器。
##FFmpeg配置##
將下載下來的ffmpeg的壓縮文件解壓,然后到C盤下面,新建一個文件夾,名稱就是ffmpeg(在原來的路徑也可以,只不過路徑太麻煩了),然后將解壓的文件全部復制到C://ffmpeg文件夾下面,然后右擊我的電腦圖標——選擇屬性,選擇高級系統設置命令,然后在彈出的窗口中選擇環境變量
在系統變量點擊添加,新建一個Path變量,變量值為解壓的根文件夾,然后打開bin,我的是在C盤下,所以就是:
然后點擊確定,退出頁面。
按win+R打開命令行窗口,輸入ffmpeg -version,查看是否安裝成功,如果成功的話,顯示下圖。
步驟進行到這里,ffmpeg已經配置完成了。
##Nginx##
首先下載自己需要的版本,點擊鏈接進行下載,將下載的文件解壓到本地,然后再下載一個文件,nginx-rtmp-module-master,將此文件下載之后,解壓放到上面的文件根目錄下即可,下面是配置文件:
1、配置nginx文件,在conf文件夾里面有一個nginx-win.conf文件,將文件改名為nginx.conf(此處不改我也不知道可不可以,看到博客上這樣寫,我就改了),然后里面配置文件如下:
……
rtmp{
server{
listen 1935;
application live{
live on;
record off;
}
application hls{
live on;
hls on;
hls_path nginx-rtmp-module/hls;
hls_cleanup off;
}
}
}
http{
……
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
原文中還有許多配置,但是我引用之后報錯,不能夠實現,所以我就講其他的刪除了,有需要的可以看一下原文這個地方的配置信息。
2、使用cmd命令啟動nginx,在命令窗口進入之前解壓的文件夾根目錄,然后輸入start nginx.exe,會彈出一個窗口,閃一下就關閉,如下所示

然后在任務管理器的進程管理中,可以看到nginx.exe正在運行,到此nginx搭建完畢。

3、在瀏覽器輸入localhost或者127.0.0.1或者本機的IP地址,彈出如下頁面表示搭建成功。

接下來要做的就是把rtsp流轉換為rtmp流,可以在播放器中實時播放。
1、在cmd窗口中,打開nginx之后,輸入命令ffmpeg -i "rtsp://admin:SHENLAN%402016@192.168.1.64/Streaming/Channels/102" -vcodec copy -acodec copy -f flv "rtmp://127.0.0.1:1935/live/"之后顯示如下界面表示轉碼成功:
2、轉碼成功之后,將轉碼之后的地址,我這里是rtmp://127.0.0.1:1935/live,放在vlc播放器中查看實時視頻
3、使用ffplay命令也可以查看,在命令行輸入ffplay “rtmp://127.0.0.1:1935/live”,就會看到實時視頻。
4、如果要在頁面中使用的話,需要進行推流處理,就是將rtmp流通過命令進行推流操作,通過本條命令(start ffmpeg -re -i “rtmp://localhost:1935/live” -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -acodec copy -f flv "rtmp://localhost:1935/hls/mystream -loglevel quiet)可以將rtmp流視頻推送到rtmp://localhost:1935/hls/mystream,這個地址后面的mystream可以隨意寫,但是要跟前面推流過程中寫的一樣;
5、頁面中使用video.js來播放推送過來的rtmp視頻,頁面是要放到服務器中打開的,單獨打開靜態頁面是沒有用的。
6、還有一種方法,不需要轉碼兩次,直接將rtsp視頻轉碼為可以在頁面播放的rtmp流,命令行為(ffmpeg -re -i “rtsp://admin:123456@192.168.2.165:554/cam/realmonitor?channel=1&subtype=0&unicast=true&proto=Onvif” -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -acodec copy -f flv “rtmp://localhost:1935/hls/mystream”)或者(ffmpeg -i “rtsp://admin:123456@192.168.2.165:554/cam/realmonitor?channel=1&subtype=0&unicast=true&proto=Onvif” -f flv -r 25 -s 640*480 -an “rtmp://localhost:1935/hls/mystream”),即可在頁面使用rtmp://localhost:1935/hls/mystream來播放視頻。
頁面部分具體代碼:
<!DOCTYPE html>
<html lang="en">
<head>
<script src="jquery.js"></script>
<script src="video.js"></script>
<link href="video-js.css" rel="stylesheet">
<script>
videojs.options.flash.swf = "video-js.swf";
</script>
</head>
<body>
<video id="my-video" class="video-js vjs-default-skin vjs-big-play-centered" width="800" height="600">
<source src='rtmp://localhost:1935/hls/mystream' type='rtmp/flv'/>
</video>
<script>
var player = videojs('my-video');
player.play();
</script>
</body>
</html>