{"id":19832964,"url":"https://github.com/tinywan/rtmp-ts-dash-webrtc","last_synced_at":"2025-07-23T15:34:41.005Z","repository":{"id":41394792,"uuid":"98701234","full_name":"Tinywan/RTMP-TS-DASH-WEBRTC","owner":"Tinywan","description":":space_invader:  音视频解决方案 Audio and video solutions（AV1）","archived":false,"fork":false,"pushed_at":"2018-04-12T05:55:26.000Z","size":1512,"stargazers_count":159,"open_issues_count":0,"forks_count":58,"subscribers_count":9,"default_branch":"master","last_synced_at":"2024-10-31T20:13:01.808Z","etag":null,"topics":["av1","dash","ffmpeg","hls","hls-ios","hls-rtmp","nginx","nginx-rtmp","rtmp","webrtc"],"latest_commit_sha":null,"homepage":"","language":null,"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/Tinywan.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}},"created_at":"2017-07-29T01:54:55.000Z","updated_at":"2024-08-12T10:27:13.000Z","dependencies_parsed_at":"2022-08-30T17:11:30.726Z","dependency_job_id":null,"html_url":"https://github.com/Tinywan/RTMP-TS-DASH-WEBRTC","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/Tinywan%2FRTMP-TS-DASH-WEBRTC","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tinywan%2FRTMP-TS-DASH-WEBRTC/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tinywan%2FRTMP-TS-DASH-WEBRTC/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tinywan%2FRTMP-TS-DASH-WEBRTC/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Tinywan","download_url":"https://codeload.github.com/Tinywan/RTMP-TS-DASH-WEBRTC/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224269138,"owners_count":17283630,"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":["av1","dash","ffmpeg","hls","hls-ios","hls-rtmp","nginx","nginx-rtmp","rtmp","webrtc"],"created_at":"2024-11-12T11:39:05.790Z","updated_at":"2024-11-12T11:39:06.627Z","avatar_url":"https://github.com/Tinywan.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# NGINX MPEG-TS Live Module \u0026 Dash JS\n## 目录\n* [典型业务场景](/docs/DETAIL001.md)  \n* [解决方案架构](/docs/DETAIL002.md)  \n* 直播流程  \n* 流媒体直播功能   \n* WEB 直播技术  \n  * RTSP 协议   \n  * RTMP 协议    \n  * HLS 协议   \n  * HLS 与 RTMP 对比    \n* 环境搭建  \n* NGINX-RTMP-TS-DASH 直播方案   \n* HTML5 标准  \n* HLS 标准  \n* WebRTC 标准  \n* 参考资料  \n\n###  直播流程\n\n+ 视频直播：采集、前处理、编码、传输、解码、渲染    \n\n+ 采集： 一般是由客户端（IOS、安卓、PC或其它工具，如OBS）完成的，iOS是比较简单的，Android则要做些机型适配工作，PC最麻烦各种奇葩摄像头驱动。 \n\n+ 前期处理： 主要是处理直播美颜，美颜算法需要用到GPU编程，需要懂图像处理算法的人，没有好的开源实现，要自己参考论文去研究。难点不在于美颜效果，而在于GPU占用和美颜效果之间找平衡。  \n\n+ 编码： 要采用硬编码，软编码720p完全没希望，勉强能编码也会导致CPU过热烫到摄像头。编码要在分辨率，帧率，码率，GOP等参数设计上找到最佳平衡点。  \n\n+ 传输： 一般交给了CDN服务商，如：阿里云、腾讯云。  \n\n+ 解码： 是对之前编码的操作，进行解码，在 web 里需要解码是hls。  \n\n+ 渲染： 主要用播放器来解决，web中常用到的播放器有video.js，更多：[html5-dash-hls-rtmp](https://github.com/Tinywan/html5-dash-hls-rtmp)  \n\n+ 下面是腾讯云直播方案的整个流程图：  \n\n  ![Markdown](./image/tenent-live-soluet.png)\n\n###  流媒体直播功能\n\n+   支持的直播流输入协议是\n\n    +   RTMP 用于拉取和发布的流\n    +   RTSP 为拉和宣布的流\n    +   用于HTTP和UDP流的 MPEG-TS\n    +   SRT 用于听，拉和集合模式\n    +   UDT 用于听，拉和集合模式\n    +   HLS 为拉流\n\n+   单路路实时编码流传递（RTMP）\n\n![Markdown](./image/live_streaming_big.png)\n\n+   多路实时编码流传递（RTMP）\n\n![Markdown](./image/rtmp-republishing_big.png)\n\n### 环境搭建\n+   服务与模块\n    +   1、Openresty下载 \n\n        ```bash\n        https://openresty.org/download/openresty-1.11.2.3.tar.gz\n        ```\n    +   2、nginx-ts-module下载 \n\n        ```bash\n        git clone https://github.com/arut/nginx-ts-module.git\n        ```\n\n    +   3、ffmpeg 下载安装\n\n+   动态编译安装\n\n    +   1、Openresty环境配置\n\n        ```bash\n        apt-get install libreadline-dev libncurses5-dev libpcre3-dev \\\n        libssl-dev perl make build-essential\n        ```\n    +   2、动态编译安装\n\n        ```bash\n        ./configure --prefix=/opt/openresty --with-luajit --without-http_redis2_module \\\n        --with-http_iconv_module --add-dynamic-module=/root/nginx-ts-module\n        ...\n        make -j4\n        ...\n        sudo make install\n        ```\n\n    +   3、配置文件\n        +   `nginx.conf`\n\n            ```bash\n            # vim /opt/openresty/nginx/conf/nginx.conf\n            error_log  logs/error.log;\n\n            pid        logs/nginx.pid;\n\n            load_module \"/opt/openresty/nginx/modules/ngx_http_ts_module.so\"; # 加载模块\n\n            events {\n            }\n\n            http {\n                server {\n                    listen 8000;\n\n                    location / {\n                        root html;\n                    }\n\n                    location /publish/ {\n                        ts;\n                        ts_hls path=/var/media/hls segment=10s;\n                        ts_dash path=/var/media/dash segment=10s;\n\n                        client_max_body_size 0;\n                    }\n\n                    location /play/ {\n                        add_header Cache-Control no-cache;\n                        add_header 'Access-Control-Allow-Origin' '*' always;\n                        add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';\n                        add_header 'Access-Control-Allow-Headers' 'Range';\n\n                        types {\n                            application/x-mpegURL m3u8;\n                            application/dash+xml mpd;\n                            video/MP2T ts;\n                            video/mp4 mp4;\n                        }\n                        alias /var/media/;\n                    }\n                }\n            }\n            ```\n        +   流媒体存放文件夹建立\n\n          ```bash\n            cd /var \u0026 makedir media\n            cd media \u0026 makedir hls \u0026 makedir dash\n          ```\n    +   4、FFmpeg推流\n        ​\t\t\n        ```bash\n        ffmpeg -re -i rtmp://live.hkstv.hk.lxdns.com/live/hks -bsf:v h264_mp4toannexb \\\n        -c copy -f mpegts http://127.0.0.1:8000/publish/sintel\n        ```\n\n    +   5、客户端播放\n\n        ```html\n        \u003cscript src=\"http://cdn.dashjs.org/latest/dash.all.min.js\"\u003e\u003c/script\u003e\n        \u003cstyle\u003e\n            video {\n                width: 640px;\n                height: 360px;\n            }\n        \u003c/style\u003e\n        \u003cdiv\u003e\n            \u003cvideo data-dashjs-player autoplay src=\"http://1127.0.0.1:8000/play/dash/sintel/index.mpd\" \n                controls\u003e\u003c/video\u003e\n        \u003c/div\u003e\n        ```\n\n    +   6、如果不使用 ffmpeg 直接拉流到`http://127.0.0.1:8000/publish/sintel` 服务的解决方案？ \n        +   （1）nginx-rtmp-module下载 \n\n            git clone https://github.com/arut/nginx-rtmp-module.git\n\n        +   （2）和安装`nginx-ts-module`模块一样动态编译安装既可以，最后别忘记了的在配置文件load `nginx-rtmp-module.so`文件\n        +   （3）按照这个顺序：`OBS =\u003e nginx-rtmp =\u003e nginx-ts`推流，OBS也可以是别的网络推流设备\n        +   （4）通过以上我们可以不直接使用ffmpeg 去推流了，而是在Windows端口可以通过OBS很简单的去推流了\n        +   （5）使用VLC播放器测试，结果OK!\n    +   7、总结，一切顺利通过。   \n\n+   通过SSL加密和公开HLS媒体的来源（HLS）\n\n  ![Markdown](./image/http_restreaming_big.png)     \n\n###  NGINX-RTMP-TS-DASH 直播方案\n\n+   HLS、MPEG-DASH多路输入/输出流（HLS、MPEG-DASH）\n\n![Markdown](./image/rtmp-republishing-hls-dash_big.png)\n\n+   编译安装\n    +   1、下载nginx-rtmp-module模块：\n\n        ```bash\n        git clone https://github.com/arut/nginx-rtmp-module.git\n        ```\n    +   2、配置 --with-http_xslt_module 时提示 the HTTP XSLT module requires the libxml2/libxslt libraries，安装以下：\n      ​      \n        ```bash\n        sudo apt-get install libxml2 libxml2-dev libxslt-dev\n        sudo apt-get install libgd2-xpm libgd2-xpm-dev\n        ```\n    +   3、通过configure命令生成Makefile文件，为下一步的编译做准备：\n\n        ```bash\n        ./configure --prefix=/opt/openresty --with-luajit --without-http_redis2_module --with-http_iconv_module \\ \n        --with-http_stub_status_module --with-http_xslt_module --add-dynamic-module=/root/nginx-ts-module \\\n        --add-dynamic-module=/root/nginx-rtmp-module\n        ```\n    +   4、如果报下面的错误\n\n        ```bash\n        platform: linux (linux)\n            you need to have ldconfig in your PATH env when enabling luajit.\n        ```\n         \u003e 是因为找不到命令ldconfig, 这个命令一般是在/sbin/目录下的，所以先执行`export PATH=$PATH:/sbin`\n\n    +   5、如果出现：`./configure: error: the HTTP XSLT module requires the libxml2/libxslt` 错误，安装以下：\n\n        ```bash\n        sudo apt-get install libxml2 libxml2-dev libxslt-dev\n        ```\n\n+   `nginx.conf` 配置\n\n    ```bash\n    # vim /opt/openresty/nginx/conf/nginx.conf\n    user  www;\n    worker_processes  1;\n\n    error_log  logs/error.log;\n\n    pid        logs/nginx.pid;\n\n    load_module \"/opt/openresty/nginx/modules/ngx_http_ts_module.so\";\n    load_module \"/opt/openresty/nginx/modules/ngx_rtmp_module.so\";\n\n    events {\n        worker_connections  1024;\n    }\n     \n     http {\n         server {\n             listen 8000;\n     \n             # This URL provides RTMP statistics in XML\n             location /stat {\n                rtmp_stat all;\n                rtmp_stat_stylesheet stat.xsl;\n             }\n     \n             location /stat.xsl {\n                root html;\n             }\n     \n             location /hls {\n                 # Serve HLS fragments\n                add_header Cache-Control no-cache;\n                add_header 'Access-Control-Allow-Origin' '*' always;\n                add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';\n                add_header 'Access-Control-Allow-Headers' 'Range';\n            \n                types {\n                    application/vnd.apple.mpegurl m3u8;\n                    video/mp2t ts;\n                }\n            \n                root /tmp;\n             }\n\n             location /dash {\n                 # Serve DASH fragments\n                 add_header Cache-Control no-cache;\n                 add_header 'Access-Control-Allow-Origin' '*' always;\n                 add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';\n                 add_header 'Access-Control-Allow-Headers' 'Range';\n     \n                 types {\n                     application/dash+xml mpd;\n                     video/mp4 mp4;\n                 }\n\n                 root /tmp;\n             }\n         }\n     }\n\n     rtmp {\n         listen 1935;\n         chunk_size 4000;\n         idle_streams off;\n         ping 30s;\n         notify_method get;\n\n         server {\n             listen 1935;\n             chunk_size 4000;\n     \n             drop_idle_publisher 10s;\n             idle_streams off;\n            \n             application live {\n                 live on;\n             }\n     \n             application hls {\n                 live on;\n                 hls on;\n                 hls_path /tmp/hls;\n             }\n     \n             # MPEG-DASH is similar to HLS\n             application dash {\n                 live on;\n                 dash on;\n                 dash_path /tmp/dash;\n             }\n         }\n     }\n    ```\n\n+   拷贝xml文件：`cp /root/nginx-rtmp-module/stat.xsl /opt/openresty/nginx/html`    \n+   流状态查看：`http://127.0.0.1:8000/stat`    \n+   OBS推流地址：`rtmp://127.0.0.1/dash/123`    \n+   VLC观看RTMP直播流：`rtmp://127.0.0.1/dash/123`    \n+   DASH格式HTTP播放\n\n    ```html\n    \u003cscript src=\"http://cdn.dashjs.org/latest/dash.all.min.js\"\u003e\u003c/script\u003e\n    \u003cstyle\u003e\n        video {\n            width: 640px;\n            height: 360px;\n        }\n    \u003c/style\u003e\n    \u003cdiv\u003e\n        \u003cvideo data-dashjs-player autoplay src=\"http://127.0.0.1:8000/dash/123.mpd\" controls\u003e\u003c/video\u003e\n    \u003c/div\u003e\n    ```\n\n* **功能特点**    \n  支持RTMP、HTTP-FLV、HLS、HTML5等协议，面向Windows、iOS、Android等终端提供稳定流畅的视频直播、点播服务，支持微信直播和微信点播， 可部署在局域网和互联网，实现私有云和公有云应用，单设备高并发。\n  * **多屏播放** 支持Flash、HTML5播放，兼容Windows、Android、iOS、Mac等操作系统； \n  * **转码、上传** 转码、上传一体化设计，使视频资源转码后可立即面向互联网进行发布；\n  * **嵌入、分享** 上传视频后一键生成视频地址，以供用户分享、嵌入到网站、软件系统中；\n  * **丰富接口** 提供编程语言无关化的RESTful API接口，可以很简单的进行二次开发；  \n\n* **强大的WEB管理系统**  \n  采用业界优秀的流媒体框架模式设计，服务运行轻量、高效、稳定、可靠、易维护，是移动互联网时代贴近企业点播、直播需求的一款流媒体方案，可以形成一套完整的视频直播、录播解决方案，满足用户在各种行业场景的流媒体业务需求。  \n  * 1、视频上传\n  * 2、点播管理\n  * 3、直播流管理\n  * 4、正在直播\n  * 5、分享集成\n  * 6、接口在线调试  \n* **应用场景**  \n  视频门户网站、会议活动现场直播、网络电视台、远程监控、在线实时课堂、 科研方向等。\n\n## [HLS 协议标准](https://link.jianshu.com/?t=http://tools.ietf.org/html/draft-pantos-http-live-streaming)\n\n## 参考资料\n+ [FFmpeg功能命令集合](https://www.jianshu.com/p/053665062f22)\n+ [ffmpeg处理RTMP流媒体的命令大全](http://blog.csdn.net/leixiaohua1020/article/details/12029543)\n+ [FFmpeg常用推流命令](https://www.jianshu.com/p/d541b317f71c)\n+ [HTTP Live Streaming (HLS) - 概念](https://www.jianshu.com/p/2ce402a485ca)\n+ [HLS-iOS视频播放服务架构深入探究（一）](https://yangchao0033.github.io/blog/2016/01/29/hls-1/)\n+ [HLS-iOS视频播放服务架构深入探究（二）](https://yangchao0033.github.io/blog/2016/02/14/hls-2/)\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftinywan%2Frtmp-ts-dash-webrtc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftinywan%2Frtmp-ts-dash-webrtc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftinywan%2Frtmp-ts-dash-webrtc/lists"}