From 4eb47cb15ad5bda6193c54c507be16b17900c5b3 Mon Sep 17 00:00:00 2001 From: kelinlang Date: Fri, 13 Dec 2019 15:40:03 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A0=E5=85=A5=E6=96=B0=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 直播工具包/H265知识整理.md | 320 ++++++++++++++++++ 直播工具包/nginx.conf_bak | 98 ++++++ .../流媒体 nginx-1.9.9编译安装 | 36 +- 3 files changed, 450 insertions(+), 4 deletions(-) create mode 100644 直播工具包/H265知识整理.md create mode 100644 直播工具包/nginx.conf_bak diff --git a/直播工具包/H265知识整理.md b/直播工具包/H265知识整理.md new file mode 100644 index 0000000..e9e874f --- /dev/null +++ b/直播工具包/H265知识整理.md @@ -0,0 +1,320 @@ +#服务器 + +## nginx-rtmp 修改版 [已编译运行] + +支持rtmp、http-flv、http-ts、hls、hls+(内存切片) 直播服务( 支持mp3、h265编码 ) + +https://github.com/im-pingo/nginx-rtmp-module + +其它参考: + +https://github.com/adwpc/nginx-rtmp-module +https://github.com/aileone/nginx-rtmp-module <---重要 + +**已在内网服务器部署**,能正常rtmp推流和hls切片工作 + +``` +http://192.168.0.18/rtmp_stat +``` + + + +## ZLMediakit [已编译] + +打包多种流媒体协议(RTSP/RTMP/HLS/HTTP-FLV/Websocket-FLV),支持协议间的互相转换 + +https://github.com/xiongziliang/ZLMediaKit + + + +## media-server [参考] + +libmpeg + + https://github.com/ireader/media-server + + https://github.com/ireader/media-server/tree/master/libmpeg + + + +## SRS + +打入H265 patch后可支持h265 rtmp,但是无法保存hls文件 + +https://github.com/ossrs/srs + + + +## EasyDarwin + +RTSP推模式转发、RTSP拉模式转发、录像、检索、回放、关键帧缓存、秒开画面、RESTful接口、WEB后台管理、分布式负载均衡 + +https://github.com/EasyDarwin/EasyDarwin + + + +## gpac + + https://github.com/gpac/gpac + + + +## shaka-packager + + https://github.com/google/shaka-packager + + + + + +# 播放器 + +## 播放推流SDK + +daniuSDK 需收费 +https://github.com/daniulive/SmarterStreaming + + + +## OBS + +Obs Studio 插件,腾讯云支持rtmp H265+quic加速推流 + +https://mc.qcloudimg.com/static/qc_doc/e1f3e604039cfe8c824f99fbc0cb8880/doc-Mobile+Live+Video+Broadcasting-Obs+Studio+Plugin.pdf + + + +## ffmpeg + +libx265 encoder + + https://trac.ffmpeg.org/wiki/Encode/H.265 + +增加H265 rtmp推流支持 + +https://github.com/ksvc/FFmpeg/wiki/instructions +https://github.com/ksvc/FFmpeg/wiki + +https://github.com/CDN-Union/Code/tree/master/flv265-ChinaNetCenter +https://www.jianshu.com/p/ac7d4037add7 + +参考链接: + + https://blog.csdn.net/smallhujiu/article/details/81703434 + + + +## WEB播放器 + +### WasmVideoPlayer + +使用WASM、FFmpeg、WebGL、Web Audio等组件实现了一个简易的支持H265的Web播放器,作为探索、验证 + + https://github.com/sonysuqin/WasmVideoPlayer + + + +### 金山云H265 Web播放器 + +在支持WebAssembly的浏览器上播放FLVhttp-flv协议的直播视频和mp4格式的点播视频。 + + https://github.com/ksvc/h265webplayer + +demo: https://roblin.cn/wasm/ + +花椒直播 webassembly方案 +https://mlog.club/article/18560 + +在 Web 端进行软解码首先会想到使用 JavaScript。libde265.js 是用 C 开发的开源 H.265 编解码器 libde265 的 JavaScript 版本(确切地说是 libde265 的 asm.js 版本,后面会说明)。经测试,使用 libde265.js 并不是一个音视频播放的完善方案,存在帧率偏低和音视频不同步等问题。此外,JavaScript 作为解释型脚本语言,对于 H.265 解码这种重度 CPU 密集型的计算任务而言,也不是理想的选择,于是继续探寻更优方案。 + +Web端H.265播放器研发解密 + + https://fed.taobao.org/blog/2019/03/19/web-player-h265/ + + + +通过WebAssembly在移动端解码H.265 + + https://cloud.tencent.com/developer/article/1453425 + + + +## Android/iOS video player + +### ijkplayer + + h265 is disabled by default, you need to modify config/module-lite.sh to enable it, see README. + + https://github.com/bilibili/ijkplayer + +mpegts 支持H265只能在PC、Android浏览器上播放 iOS不行 +https://blog.csdn.net/smallhujiu/article/details/81703434 + +RTMP进行了标准扩展,播放器上ijkplayer也扩展了该修改。 + + + +### ZFPlayer + +基于AVPlayer,支持横屏、竖屏(全屏播放还可锁定屏幕方向),上下滑动调节音量、屏幕亮度,左右滑动调节播放进度。 + + https://github.com/Sky0372Lsk/ZFPlayer + + + +# 流媒体协议 + +## RTSP + +Server:ZLMediaKit 支持H265/H264/AAC codec. + +参考链接: + +RTP Payload Format for High Efficiency Video Coding (HEVC) + + https://www.rfc-editor.org/rfc/pdfrfc/rfc7798.txt + +如何支持RTSP播放H.265(HEVC)流 + + https://blog.csdn.net/renhui1112/article/details/81212213 + +如何对RTSP播放器做功能和性能评估 + + https://cloud.tencent.com/developer/article/1535580 + + + +## RTMP + +FLV H265直播相关 + + [https://toss156.github.io/2018/01/10/FLV%20H265直播相关/](https://toss156.github.io/2018/01/10/FLV H265直播相关/) + + https://github.com/WangLCG/C-plus-plus/tree/1599f6a32a1b7023f744f8d7a6e94a4669fccdb0 + +支持hevc flv ffmpeg已完成编译 + +``` +/root/ffmpeg_sources/ffmpeg +``` + +修改文件: + +``` +libavformat/flv.h +libavformat/flvenc.c +libavformat/flvdec.c +``` + +nginx-rtmp stat模块无法准确识别H265编码 + + + +测试推流命令行: + +``` +~/bin/ffmpeg -re -i rtsp://192.168.3.101/ch01 -c:v libx265 -profile:v main -c:a aac -b:a 128k -f flv rtmp://127.0.0.1:1935/live/test +``` + + + +## TS + +H265封装成TS流,查看openHEVC-ffmpeg-2.5源代码,及一些H265的TS流视频文件,基本的方式跟H264是一样的,这里主要注意的地方就是流类型不一样,H264的值为0x1b,H265的值为:0x24 + +**MPEG-2 TS** +https://blog.csdn.net/smallhujiu/article/details/80753765 + +转格式: + +``` +ffmpeg -i input.mp4 -c copy output.ts +ffmpeg -i input.mp4 -c copy output.flv +#从1.mp4 copy一个文件,使其moov头在尾部 +ffmpeg -i 1.mp4 -c copy -f mp4 output.mp4 +#从1.mp4 copy一个文件,使其moov头在头部: +ffmpeg -i 1.mp4 -c copy -f mp4 -movflags faststart output2.mp4 +#测试flv->ts +~/bin/ffmpeg -i rtmp://127.0.0.1:1935/live/testh265 -c copy -y -f mpegts 265.ts + +报错: +video:0kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown +``` + + + +GPAC可以把x265生成的hevc流(.hevc)打包成.mp4和.ts文件,其使用方法如下: + +**MP4Box** + +``` +./MP4Box -add name_of_annexB_bitstream.(bit,bin,265) -fps 50 -new output.mp4 +./MP4Box -v -add Catus_1920x1080_50_qp32.bin:FMT=HEVC -fps 50 -new output.mp4 +./MP4Client output.mp4 # to play HEVC mp4 content +``` + + + +**mp42ts** + +``` +./mp42ts -prog=hevc.mp4 -dst-file=test.ts +./mp42ts -prog=output.mp4 -dst-file=hevc.ts +./MP4Client test.ts # to play HEVC transport streams +``` + + + +## HLS + +ZLMediakia支持 RTSP[S] --> HLS H265 + +HEVC支持苹果HLS的几个关键问题 + + https://blog.csdn.net/vn9PLgZvnPs1522s82g/article/details/79237855 + + + +# 直播平台 和 CDN + +## 金山云 + + https://www.ksyun.com/proservice/cloud_live + + + +## 腾讯云 + + https://cloud.tencent.com/document/product/267/32831 + + + +## 京东云 + + https://www.jdcloud.com/cn/products/live-video + + + +## 虎牙直播 + + 虎牙直播目前支持H.264和H.265标准。 + +https://help.huya.com/298 + + + + + +# 市场情况 + +HEVC、AV1、VVC:如何理解2019年的编解码器世界 + + https://juejin.im/post/5d7f2f376fb9a06acd45529e + +编解码器之战:AV1、HEVC、VP9和VVC + + https://zhuanlan.zhihu.com/p/49503955 + +腾讯V265编码器:给用户以完备的265体验 + + https://blog.csdn.net/vn9PLgZvnPs1522s82g/article/details/100977340 diff --git a/直播工具包/nginx.conf_bak b/直播工具包/nginx.conf_bak new file mode 100644 index 0000000..050de7b --- /dev/null +++ b/直播工具包/nginx.conf_bak @@ -0,0 +1,98 @@ + +#user nobody; +worker_processes 1; + +#error_log logs/error.log; +#error_log logs/error.log notice; +#error_log logs/error.log info; + + +worker_rlimit_nofile 102400; +worker_rlimit_core 2G; +working_directory /tmp; + +#pid logs/nginx.pid; + + +events { + worker_connections 1024; +} + + + +stream_zone buckets=1024 streams=4096; + +rtmp { + server { + listen 1935; + application live { + send_all off; + zero_start off; + live on; + hls on; + hls_path /tmp/hls; + hls2memory on; + mpegts_cache_time 20s; + hls2_fragment 1300ms; + hls2_max_fragment 1800ms; + hls2_playlist_length 3900ms; + wait_key on; + wait_video on; + cache_time 2s; + low_latency on; + fix_timestamp 2000ms; + # h265 codecid, default 12 + hevc_codecid 12; + } + # HLS live config + application hls{ + live on; + hls on; + hls_path /home/workspace/install/nginx-1.17.6/www/hls; + hls_fragment 5s; + } + } +} + +http { + server { + listen 8080; + location / { + chunked_transfer_encoding on; + root html/; + } + location /flv { + flv_live 1935 app=live; + } + location /ts { + ts_live 1935 app=live; + } + location /rtmp_stat { + rtmp_stat all; + rtmp_stat_stylesheet /stat.xsl; + } + location /xstat { + rtmp_stat all; + } + location /sys_stat { + sys_stat; + } + location /hls { + # Serve HLS fragments + types { + application/vnd.apple.mpegurl m3u8; + video/mp2t ts; + } + root /home/workspace/install/nginx-1.17.6/www/; + add_header Cache-Control no-cache; + } + location /hls2 { + hls2_live 1935 app=live; + } + location /dash { + # Serve DASH fragments + root /tmp; + add_header Cache-Control no-cache; + } + } +} diff --git a/直播工具包/流媒体 nginx-1.9.9编译安装 b/直播工具包/流媒体 nginx-1.9.9编译安装 index 7c3de98..eec26d5 100644 --- a/直播工具包/流媒体 nginx-1.9.9编译安装 +++ b/直播工具包/流媒体 nginx-1.9.9编译安装 @@ -14,7 +14,7 @@ tar -zxvf xxxx.tar.gz ./configure --prefix=/home/kelinlang/workspace/install/nginx_rtmp/nginx-1.9.9 --with-pcre=/home/kelinlang/workspace/server/nginx/pcre-8.34 --with-openssl=/home/kelinlang/workspace/server/nginx/openssl-1.0.2d --add-module=/home/kelinlang/workspace/server/nginx/nginx-rtmp-module --add-module=/home/kelinlang/workspace/server/nginx/nginx-rtmp-module/hls 1.17.6版本配置 -./configure --prefix=/home/kelinlang/workspace/install/nginx_rtmp/nginx-1.17.6 --add-module=../nginx-client-module --add-module=../nginx-multiport-module --add-module=../nginx-toolkit-module --add-module=../nginx-rtmp-module --with-cc-opt="-Wno-error" +./configure --prefix=/home/kelinlang/workspace/install/nginx_rtmp/nginx-1.17.6 --add-module=../nginx-client-module --add-module=../nginx-multiport-module --add-module=../nginx-toolkit-module --add-module=../nginx-rtmp-module --with-http_ssl_module --with-cc-opt="-Wno-error" 3. 执行make -j8&& make install @@ -22,6 +22,8 @@ tar -zxvf xxxx.tar.gz ./configure --with-cc-opt="-Wno-error" CFLAGS = -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g -I/home/kelinlang/workspace/server/nginx/nginx-rtmp-module +修改连接地址:/etc/ld.so.conf ldconfig + 4.rtmp://192.168.3.157:1395/mylive/rtmpstream 5.启动 6.查进程 ps -ef | grep nginx @@ -39,12 +41,27 @@ ffmpeg -re -i E:\YunvaProject\视频文件\VID_20190104_111210.mp4 -f flv rtmp:/ ./ffmpeg -re -i /home/kelinlang/workspace/testFiles/E1.mp4 -c copy -f flv rtmp://192.168.0.18:1935/live/test ./ffmpeg -re -i /home/kelinlang/workspace/testFiles/E1.mp4 -c copy -f flv rtmp://192.168.2.162:1935/live/test + ./ffmpeg -re -i /home/kelinlang/workspace/testFiles/E1h265.mp4 -c copy -f flv rtmp://192.168.2.162:1935/live/test +./ffmpeg -re -i /home/kelinlang/workspace/testFiles/E1h265.mp4 -c copy -f flv rtmp://192.168.2.162:1935/hls/test + +./ffmpeg -re -i /home/kelinlang/workspace/testFiles/E1h265.mp4 -c copy -f rtsp rtsp://192.168.2.162:1935/live/test +./ffmpeg -re -i /home/kelinlang/workspace/testFiles/E1h265.mp4 -c copy -f rtsp rtsp://192.168.2.162:5555/live/test +./ffmpeg -i rtsp://192.168.2.162:5555/live/test -c copy -f flv rtmp://192.168.2.162:1935/hls/test + ./ffmpeg -re -i /home/kelinlang/workspace/testFiles/E1h265.mp4 -c copy -f flv rtmp://192.168.0.18:1935/live/test +./ffmpeg -re -i /home/kelinlang/workspace/testFiles/E1.mp4 -c copy -f flv rtmp://192.168.2.162:1935/live/test + ./ffmpeg -re -i /home/kelinlang/workspace/testFiles/E1h265.mp4 -c copy -f flv /home/kelinlang/workspace/testFiles/E1h265.flv +./ffmpeg -re -i /home/kelinlang/workspace/testFiles/E1.mp4 -c copy -f flv /home/kelinlang/workspace/testFiles/E1.flv + ./ffmpeg -re -i rtsp://192.168.3.101/ch01 -c:v libx265 -c:a aac -b:a 128k -f flv rtmp://192.168.0.18:1935/live/test -./ffmpeg -re -i rtsp://192.168.3.101/ch01 -c:v -c:a aac -b:a 128k -f flv rtmp://192.168.0.18:1935/live/test +./ffmpeg -re -i rtsp://192.168.3.101/ch01 -f flv rtmp://192.168.0.18:1935/live/test +./ffmpeg -re -i rtsp://192.168.3.101/ch01 -f flv rtmp://192.168.2.162:1935/live/test ~/bin/ffmpeg -re -i rtsp://192.168.3.101/ch01 -c:v libx265 -profile:v main -c:a aac -b:a 128k -f flv rtmp://192.168.2.162:1935/live/test +~/bin/ffmpeg -re -i rtsp://192.168.3.101/ch01 -c:v libx265 -profile:v main -c:a aac -b:a 128k -f flv /home/kiloview/ch01_h265.flv + + 端口查看命令:netstat -ntpl @@ -52,12 +69,23 @@ ffmpeg -re -i E:\YunvaProject\视频文件\VID_20190104_111210.mp4 -f flv rtmp:/ 8.播放 ./ffplay /home/kelinlang/workspace/testFiles/E1.mp4 ./ffplay /home/kelinlang/workspace/testFiles/E1h265.mp4 +./ffplay /home/kelinlang/workspace/testFiles/E1h265.flv +./ffplay rtmp://192.168.0.18:1935/live/test ./ffplay rtmp://192.168.2.162:1935/live/test +./ffplay http://192.168.2.162:8080/hls/test.m3u8 重封装 ./ffmpeg -re -i ./E1.mp4 -i ./Record-null.ts -map 0:0 -map 0:1 -map 1:0 -map 1:1 -c copy -program title=CCTV1:program_num=1:st=0:st=1 -program title=CCTV2:program_num=2:st=2:st=3 -f mpegts "udp://192.168.2.34:1234?pkt_size=1316" - +./ffmpeg -re -i /home/kelinlang/workspace/testFiles/E1.mp4 -i /home/kelinlang/workspace/testFiles/Record-null.ts -map 0:0 -map 0:1 -map 1:0 -map 1:1 -c copy -program title=CCTV1:program_num=1:st=0:st=1 -program title=CCTV2:program_num=2:st=2:st=3 -f mpegts /home/kelinlang/workspace/testFiles/tstest.ts +./ffmpeg -i /home/kelinlang/workspace/testFiles/E1.mp4 -f hevc /home/kelinlang/workspace/testFiles/E1_h265_2.mp4 FFmpeg编译 -./configure --enable-shared --enable-static --enable-ffplay --prefix=/home/kelinlang/workspace/install/ffmpeg \ No newline at end of file +./configure --enable-shared --enable-static --enable-ffplay --prefix=/home/kelinlang/workspace/install/ffmpeg +./configure --enable-shared --enable-static --enable-ffplay --prefix=/home/kelinlang/workspace/install/ffmpeg3.3 +./configure --enable-shared --enable-static --enable-ffplay --prefix=/home/kelinlang/workspace/install/ffmpegDev/3.3 +./configure --enable-shared --enable-static --enable-ffplay --prefix=/home/kelinlang/workspace/install/ffmpegDev/master + + +git config credential.helper store +git rm -r --cached \ No newline at end of file