點燈坊

失くすものさえない今が強くなるチャンスよ

如何將 RTSP 轉 HLS ?

Sam Xiao's Avatar 2020-06-02

IP Camera 都是以 RTSP 釋出 Stream,但可惜 Browser 並不支援 RTSP,但支援 HLS,因次我們必須透過 Server 將 RTSP 轉成 HLS。

Version

Ubuntu 2020.04
FFmpeg 3.4.6
Nginx 1.18.0
Vue 2.6.11

Architecture

rtsp003

Backend 由 FFmpeg 負責將 RTSP 轉成 HLS,最後透過 Nginx 以 HTTP 傳給 browser。

Frontend 則由 Vue-video-player 解決跨 browser 顯示 HLS。

Install Nginx & FFmpeg

$ apt-get update
$ apt-get install nginx
$ apt-get install ffmpeg

Nginx

/etc/nginx/sites-enabled/default

48 行

location / {
  # First attempt to serve request as file, then
  # as directory, then fall back to displaying a 404.
  try_files $uri $uri/ =404;
  add_header Access-Control-Allow-Origin *;
}

加上 add_header Access-Control-Allow-Origin *;

rtsp000

FFmpeg

$ ffmpeg -fflags nobuffer -rtsp_transport tcp -i rtsp://170.93.143.139/rtplive/470011e600ef003a004ee33696235daa -vsync 0 -copyts -vcodec copy -movflags frag_keyframe+empty_moov -an -hls_flags delete_segments+append_list -f segment -segment_list_flags live -segment_time 1 -segment_list_size 3 -segment_format mpegts -segment_list /var/www/html/index.m3u8 -segment_list_type m3u8 -segment_list_entry_prefix http://172.20.10.10/ /var/www/html/%3d.ts

使用 ffmpeg 將 RTSP 轉成 m3u8,有幾個重要 argument 需要修改:

-i rtsp://170.93.143.139/rtplive/470011e600ef003a004ee33696235daa 

-i 指定 RTSP url,以上為公開的 RTSP 可供測試。

-segment_list /var/www/html/index.m3u8

-segment_list 指定 m3u8 要產生的目錄,其中 /var/www/html 為 Niginx 的預設 root directory。

-segment_list_entry_prefix http://172.20.10.10/

-segment_list_entry_prefix 指定 m3u8*.ts 的 prefix,此為 Nginx 的 url。

/var/www/html/%3d.ts

指定 *.ts 要產生的目錄,其中 /var/www/html 為 Niginx 的預設 root directory。

rtsp001

由 FFmpeg 根據 RTSP 陸續產生 m3u8ts

Browser

rtsp002

Conclusion

  • 別忘了在 Nginx 的 default.conf 加上 add_header Access-Control-Allow-Origin *;,否則僅管 m3u8ts 由 Nginx 送出,但 browser 仍然無法播放

Reference

Kelp, Convert RTSP to HLS using FFmpeg