{"id":20619713,"url":"https://github.com/twtrubiks/nginx-rtmp-tutorial","last_synced_at":"2025-04-15T11:55:16.330Z","repository":{"id":84518972,"uuid":"430974459","full_name":"twtrubiks/nginx-rtmp-tutorial","owner":"twtrubiks","description":"Docker Nginx 搭配 RTMP HLS 建立簡易直播 Server","archived":false,"fork":false,"pushed_at":"2021-11-28T02:23:59.000Z","size":205,"stargazers_count":53,"open_issues_count":1,"forks_count":12,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-15T11:55:10.606Z","etag":null,"topics":["docker","docker-compose","hls-stream","nginx","rtmp-server","rtmp-stream","tutorial"],"latest_commit_sha":null,"homepage":"","language":"XSLT","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/twtrubiks.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-11-23T05:40:37.000Z","updated_at":"2025-04-10T01:30:00.000Z","dependencies_parsed_at":"2023-03-02T04:30:27.264Z","dependency_job_id":null,"html_url":"https://github.com/twtrubiks/nginx-rtmp-tutorial","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twtrubiks%2Fnginx-rtmp-tutorial","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twtrubiks%2Fnginx-rtmp-tutorial/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twtrubiks%2Fnginx-rtmp-tutorial/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twtrubiks%2Fnginx-rtmp-tutorial/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/twtrubiks","download_url":"https://codeload.github.com/twtrubiks/nginx-rtmp-tutorial/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249067775,"owners_count":21207395,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker","docker-compose","hls-stream","nginx","rtmp-server","rtmp-stream","tutorial"],"created_at":"2024-11-16T12:12:20.903Z","updated_at":"2025-04-15T11:55:16.323Z","avatar_url":"https://github.com/twtrubiks.png","language":"XSLT","readme":"# Nginx 搭配 RTMP HLS 建立簡易直播 Server\n\n* [Youtube Tutorial - Nginx 搭配 RTMP HLS 建立簡易直播 Server - 概念 -part1](https://youtu.be/YIXgNUrvqp0)\n\n* [Youtube Tutorial - Nginx 搭配 RTMP HLS 建立簡易直播 Server - 實戰 -part2](https://youtu.be/oxnUUlCXpE8)\n\n簡易版架構圖\n\n![alt tag](https://i.imgur.com/gYWMjoX.png)\n\n## 教學\n\n請確認電腦有安裝 `ffplay` 以及 `ffmpeg`\n\nffplay 用來播放影片 (拉流)\n\n```cmd\nffplay -version\n```\n\nFFmpeg 用來將影片(轉檔)送到 server (推流)\n\n```cmd\nffmpeg -version\n```\n\n在 [docker-compose.yml](docker-compose.yml) 底下, 所使用的 docker image 是\n [nginx-rtmp](https://hub.docker.com/r/tiangolo/nginx-rtmp/)\n\n(注意, 這個容器底下是沒有 FFmpeg 的)\n\n底下的 [stat.xsl](stat.xsl) 是要看 server 推拉流的狀態.\n\n檔案來源為 [nginx-rtmp-module/blob/master/stat.xsl](https://github.com/arut/nginx-rtmp-module/blob/master/stat.xsl)\n\n[nginx_simple.conf](nginx_simple.conf) 則是簡易版的設定, 底下分別設定了 RTMP 以及 HLS 的參數.\n\n詳細參數說明可參考 [nginx-rtmp-module](https://github.com/arut/nginx-rtmp-module/wiki/Directives)\n\n啟動指令 `docker-compose up -d`\n\n可以先來看 server 推拉流的狀態\n\n[http://your_ip:8088/stat](http://your_ip:8088/stat)\n\n![alt tag](https://i.imgur.com/72TOzYq.png)\n\n## 推拉流\n\n推流\n\n將本地的影片以 stream 的方式推給 Nginx RTMP Server\n\n```cmd\nffmpeg -re -stream_loop -1 -i project_view.mp4 -c:v copy -c:a copy -f flv rtmp://your_ip:1935/live/test\n```\n\ntest 是你的 stream key, 可以定義自己喜歡的.\n\n![alt tag](https://i.imgur.com/KmlPV0B.png)\n\n指令說明\n\n`-stream_loop number (input)`\n\n`0` 代表不 loop\n\n`-1` 代表無限 loop\n\n`-re` 讀取輸入來源(流)原生的 frame rate\n\n`-i` 輸入來源\n\n`-c:v copy` 等於 `-vcodec copy` 影片格式，copy 代表與來源相同\n\n`-c:a copy` 等於 `-acodec copy` 聲源格式，copy 代表與來源相同\n\n`-f flv` 轉檔成 flv\n\n這邊是用 FFmpeg 來完成推流, 也可以用軟體, 像是最常見的 OBS 推流也是可以的.\n\n拉流\n\n從 Nginx server 拉流 (stream) 下來觀看\n\n`RTMP 拉流`\n\nRTMP (Real-Time Messaging Protocol) 延遲比較低.\n\n(但有可能被防火牆擋下來)\n\n```cmd\nffplay rtmp://your_ip:1935/live/test\n```\n\n剛剛設定的 stream key 是 test, 所以這邊也要選擇 test\n\n也可以禁用快取, 會比較沒有延遲\n\n```cmd\nffplay -fflags nobuffer rtmp://your_ip:1935/live/test\n```\n\n![alt tag](https://i.imgur.com/nrD1jBf.png)\n\n`http 拉流`\n\nHLS (HTTP Live Streaming) 延遲比較高.\n\n(比較不會被防火牆擋下來, 因為是以 http 為基礎)\n\n```cmd\nffplay http://your_ip:8088/test.m3u8\n```\n![alt tag](https://i.imgur.com/pxgNhEB.png)\n\n如果你到容器內的 `tmp/hls` 底下觀看,\n\n你會發現有一個 `.m3u8`, 然後很多個 `.ts`,\n\n`.m3u8` 是一個索引檔案, 會自動去尋找對應的 `.ts` 檔案.\n\n![alt tag](https://i.imgur.com/La3QjRG.png)\n\n除了用 ffplay 拉流之外, 也可以使用 VLC player 之類的工具觀看,\n\n這邊用 RTMP 拉流示範\n\n![alt tag](https://i.imgur.com/TVWERR4.png)\n\n![alt tag](https://i.imgur.com/EMWbyfg.png)\n\n其他推流\n\n推流搭配濾鏡 (加上logo)\n\n```cmd\nffmpeg -re -i project_view.mp4 -i demo.jpeg -filter_complex \"overlay=W-w\" -c:v libx264 -c:a aac -r 30 -preset ultrafast -f flv rtmp://your_ip:1935/live/test_logo\n```\n\n這邊的 stream key 設定為 test_logo\n\n`-r` set frame rate\n\n`-filter_complex overlay=W-w` 設定影片的濾鏡, 加在右上角\n\n`-preset ultrafast` 代表編碼速度\n\n拉流指令如下\n\n```cmd\nffplay http://your_ip:8088/test_logo.m3u8\n```\n\n或\n\n```cmd\nffplay rtmp://your_ip:1935/live/test_logo\n```\n\n![alt tag](https://i.imgur.com/w8LWmET.png)\n\n推流 (將電腦鏡頭的影像以及聲音推流到 server)\n\n找到 audio interface\n\n```cmd\narecord -L\n```\n\n`-L` 代表列出所有的裝置\n\n找到 webcam device\n\n先安裝 v4l-utils\n\n```cmd\nsudo apt-get install v4l-utils\n```\n\n列出全部的 webcam device\n\n```cmd\nv4l2-ctl --list-devices\n```\n\n指令 ( 將電腦鏡頭的影像以及聲音推流到 server )\n\n```cmd\nffmpeg \\\n    -f video4linux2 -framerate 25 -video_size 640x360 -i /dev/video0 \\\n    -f alsa -ac 2 -i default \\\n    -c:v libx264 -b:v 1600k -preset ultrafast \\\n    -x264opts keyint=50 -g 25 -pix_fmt yuv420p \\\n    -c:a aac -b:a 128k \\\n    -vf \"drawtext=fontfile=DejaVuSansMono-Bold.ttf: \\\ntext='CAMERA %{localtime\\:%Y-%m-%dT%T}': fontcolor=white@0.8: fontsize=20: x=100: y=10: box=1: boxcolor=black: boxborderw=8\" \\\n    -f flv \"rtmp://your_ip:1935/live/test_webcam\"\n```\n\n這邊的 stream key 設定為 test_webcam\n\n`-i /dev/video0` 我的視訊裝置\n\n`-i default` 我的音源裝置\n\n`-b:v` 代表 audio bitrate\n\n`-b:a` 代表 video bitrate\n\n`-vf` 設定影片的濾鏡\n\n拉流指令如下\n\n```cmd\nffplay http://your_ip:8088/test_webcam.m3u8\n```\n\n或\n\n```cmd\nffplay rtmp://your_ip:1935/live/test_webcam\n```\n\n![alt tag](https://i.imgur.com/sKb0Pfp.png)\n\n來看一下 RTMP Server 的狀態, 總共推了3個流\n\n`test` 正常影片\n\n`test_logo` 影片加上logo濾鏡\n\n`test_webcam` webcam\n\n![alt tag](https://i.imgur.com/HYFLK35.png)\n\n## 其他參考文章\n\n* [alfg/docker-nginx-rtmp](https://github.com/alfg/docker-nginx-rtmp) ,\n\n容器內有 FFmpeg 的 nginx-rtmp,\n\n更建議去參考裡面的設定 [master/nginx.conf](https://github.com/alfg/docker-nginx-rtmp/blob/master/nginx.conf) ,\n\n他的作法是透過 nginx server 裡的 FFmpeg 再處理後轉發出去 (當然也有可能是轉發到其他雲空間).\n\n* [Streaming video and audio of an USB webcam](https://fschuindt.github.io/blog/2020/12/31/streaming-video-and-audio-of-an-usb-webcam-to-multiple-users-of-a-website-with-ssl-basic-authentication-and-invideo-timestamps-ffmpeg-rtmp-nginx-hls-mpeg-dash.html)\n\n## Donation\n\n文章都是我自己研究內化後原創，如果有幫助到您，也想鼓勵我的話，歡迎請我喝一杯咖啡:laughing:\n\n![alt tag](https://i.imgur.com/LRct9xa.png)\n\n[贊助者付款](https://payment.opay.tw/Broadcaster/Donate/9E47FDEF85ABE383A0F5FC6A218606F8)","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftwtrubiks%2Fnginx-rtmp-tutorial","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftwtrubiks%2Fnginx-rtmp-tutorial","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftwtrubiks%2Fnginx-rtmp-tutorial/lists"}