# streaming_media
**Repository Path**: sunjiyun26/streaming_media
## Basic Information
- **Project Name**: streaming_media
- **Description**: 流媒体项目,实现在浏览器无插件形式播放视频,实现方式包含多种案例,将使用过的案例整合在一个项目之中,提供流媒体播放的方案参考!
- **Primary Language**: Java
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 21
- **Created**: 2024-08-19
- **Last Updated**: 2024-08-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# streaming_media
流媒体系列博文及资料:
博客:爱是与世界平行:流媒体栏目
- [整理关于流媒体服务,直播平台,流媒体直播,RTSP,RTMP,Nginx-http-flv-module,FFMpeg等思维导图](https://blog.csdn.net/An1090239782/article/details/108991681)
- [个人学习过程中,收集总结全网的流媒体资源-----持续更新!!!!](https://blog.csdn.net/An1090239782/article/details/108973950)
- [Flv.js全面解析](https://blog.csdn.net/An1090239782/article/details/108972491)
- [流媒体相关介绍](https://blog.csdn.net/An1090239782/article/details/108776514)


## 介绍
流媒体项目,实现在浏览器无插件形式播放视频,实现方式包含多种案例,将使用过的案例整合在一个项目之中,提供流媒体播放的方案参考!
1. 后端使用FFmpeg进行推拉流转换。(在centos上搭建ffmpeg,搭建较高版本,较低版本推拉流转换有时会出错!)
2. 使用nginx-http-flv-module进行推流。(参考博客或学习笔记中的相关内容,配置文件也有!)
3. 使用flv.js或者其他播放器进行视频播放。(推荐使用flv.js!)
### 项目使用说明
1. 克隆项目到本地。
2. 直接run即可。
3. commandManager需要修改的ffmpeg命令路径:在static/config目录下loadFFmpeg.properties中进行修改。
# 流媒体-ZLMediaKit+MediaServerUI
流媒体服务器采用ZLMediaKit,界面UI使用MediaServerUI。
# 常见播放器
DPlayer,video.js,ckplayer,WXInlinePlayer,vue-video-player,vue-DPlayer。
# ckplayer拉流播放
## 软件介绍
本软件为开源软件,遵守开源协议:MIT
## 功能介绍
用于在网页端播放视频,支持mp4,flv,m3u8及rtmp协议的直播,支持移动端,PC端
## 软件架构
软件分为两部分,1:javascript构建支持HTML5环境的播放器,2:actionscript3.0构建支持ie9以前支持flashplayer环境的播放器
## 安装教程
ckplayer不存在安装过程,将下载包里的ckplayer文件夹(该文件夹包含ckplayer.js,ckplayer.swf,ckplayer.json等文件)上传到网站环境中即可使用,在需要播放视频的页面上插入下面代码即可,注意引入ckplayer.js文件的路径
```javascript
播放器容器
```
## 使用说明
使用过程中碰到问题,请至官网查看手册:http://www.ckplayer.com/manual/
# EasyPlayer.js拉流播放
## 简介
EasyPlayer.js H5播放器,是一款能够同时支持HTTP、RTMP、HTTP-FLV、HLS(m3u8)视频直播与视频点播等多种协议,支持H.264、H.265、AAC等多种音视频编码格式,支持mse、wasm等多种解码方式,支持Windows、Linux、Android、iOS全平台终端的H5播放器。
## 功能说明
- 支持 HTTP-MP4 播放
- 支持 m3u8/HLS 播放;
- 支持 HTTP-FLV/WS-FLV 播放;
- 支持 H265 播放;
- 支持直播和点播播放;
- 支持全屏显示;
- 支持重连播放;
## 集成使用示例
### 普通集成
1.引入
copy EasyWasmPlayer.js 到项目中
copy libDecoder.wasm到项目或者www的根目录(一定要根目录)
2.在 html 中引用 EasyWasmPlayer.js
```html
EasyWasmPlayer-Demo
```
## 实例化参数
var player = new wasmPlayer(url,ID,callbackFun,{cbUserPtr:this, decodeType"auto" or "soft", openAudio"1" or "0", BigPlay"true" or "false", Height:" true" or "false});
| 参数 | 说明 | 类型 | 默认值 |
| ------------------ | ------------------------------------------------ | -------------------------- | ------ |
| url | 视频地址 | String | null |
| ID | 播放器实例的divID (必传) | String | - |
| callbackFun | 事件回调 | function | - |
| cbUserPtr | 自定义指针 (this的指向) | | this |
| decodeType | 解码类型(auto:默认,soft:强制H265解码) | String | auto |
| openAudio | 是否打开音频 | Boolean | false |
| BigPlay | 是否开启大的播放按钮 | Boolean | false |
| Height | 播放器尺寸是否继承父盒子的 | Boolean | false |
### 录像播放相关属性
#### 注意:currentTime属性只在播放录像m3u8 有结束标记(#EXT-X-ENDLIST)的的流时生效。
play(url,autoplay,currentTime)
| 属性 | 说明 | 类型 | 默认值 |
| -------- | -------------------------------------- | ------- | ------------------|
| url | 播放流地址 | String | - |
| autoplay | 是否自动播放 | Boolean | 默认0 |
| currentTime| 视频开始时间(换算成秒) | Number | 默认this |
## 事件
| 方法名 | 说明 | 参数 |
| ---------- | ------------ | --------------------- |
| play | 播放事件 | url:'流地址',autoplay: '自动播放',currentTime:'开始时间' |
| pause | 播放暂停 | - |
| destroy | 停止播放 | - |
| openAudio | 打开声音 | - |
| closeAudio | 关闭声音 | - |
| startLoding | 开始加载动画 | - |
| endLoding | 结束加载动画 | - |
| fullScreen | 开启或退出全屏 | - |
# rtsp-web-converter----->flv.js拉流播放
转码RTSP,RTMP或其他格式的流用于h5播放
---
SpringBoot---Javacv
---
测试页面:http://127.0.0.1:7081/flv.html
前端使用flvjs播放
转码接口
---
http://127.0.0.1:7081/live/{url}/live.flv url=base64(视频流地址)
(该接口直接响应flv格式视频流)
示列
---
var flvPlayer = flvjs.createPlayer({type: 'flv',url:'http://127.0.0.1:7081/live/{base64加密后的流地址}/live.flv',isLive: true});
flvPlayer.attachMediaElement(document.getElementById(id));
flvPlayer.load();
flvPlayer.play();
性能消耗
---
对于转包装方式一路流在i5 7500配置下cpu占用在1%左右
2020-07-17
更新了转码的方法,现在对输入的流没有任何要求了,对于符合H264,AAC的流会使用低性能消耗的转包装方式进行,其他格式会先进行转码操作
# nginx-http-flv-module (推拉流转换)
## rtmp直播限流,鉴权,播放人数统计等功能
## nginx.conf配置文件示例
```yaml
worker_processes 1; #运行在Windows上时,设置为1,因为Windows不支持Unix domain socket
#worker_processes auto; #1.3.8和1.2.5以及之后的版本
#worker_cpu_affinity 0001 0010 0100 1000; #只能用于FreeBSD和Linux
#worker_cpu_affinity auto; #1.9.10以及之后的版本
error_log logs/error.log error;
#如果此模块被编译为动态模块并且要使用与RTMP相关的功
#能时,必须指定下面的配置项并且它必须位于events配置
#项之前,否则NGINX启动时不会加载此模块或者加载失败
#load_module modules/ngx_http_flv_live_module.so;
events {
worker_connections 4096;
}
http {
include mime.types;
default_type application/octet-stream;
keepalive_timeout 65;
server {
listen 80;
location / {
root /var/www;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location /live {
flv_live on; #打开HTTP播放FLV直播流功能
chunked_transfer_encoding on; #支持'Transfer-Encoding: chunked'方式回复
add_header 'Access-Control-Allow-Origin' '*'; #添加额外的HTTP头
add_header 'Access-Control-Allow-Credentials' 'true'; #添加额外的HTTP头
}
location /hls {
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
root /tmp;
add_header 'Cache-Control' 'no-cache';
}
location /dash {
root /tmp;
add_header 'Cache-Control' 'no-cache';
}
location /stat {
#推流播放和录制统计数据的配置
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
root /var/www/rtmp; #指定stat.xsl的位置
}
#如果需要JSON风格的stat, 不用指定stat.xsl
#但是需要指定一个新的配置项rtmp_stat_format
#location /stat {
# rtmp_stat all;
# rtmp_stat_format json;
#}
location /control {
rtmp_control all; #rtmp控制模块的配置
}
}
}
rtmp_auto_push on;
rtmp_auto_push_reconnect 1s;
rtmp_socket_dir /tmp;
rtmp {
out_queue 4096;
out_cork 8;
max_streams 128;
timeout 15s;
drop_idle_publisher 15s;
log_interval 5s; #log模块在access.log中记录日志的间隔时间,对调试非常有用
log_size 1m; #log模块用来记录日志的缓冲区大小
server {
listen 1935;
server_name www.test.*; #用于虚拟主机名后缀通配
application myapp {
live on;
gop_cache on; #打开GOP缓存,减少首屏等待时间
}
application hls {
live on;
hls on;
hls_path /tmp/hls;
}
application dash {
live on;
dash on;
dash_path /tmp/dash;
}
}
server {
listen 1935;
server_name *.test.com; #用于虚拟主机名前缀通配
application myapp {
live on;
gop_cache on; #打开GOP缓存,减少首屏等待时间
}
}
server {
listen 1935;
server_name www.test.com; #用于虚拟主机名完全匹配
application myapp {
live on;
gop_cache on; #打开GOP缓存,减少首屏等待时间
}
}
}
```
# FFCH4J(原用名:FFmpegCommandHandler4java)--Java调用FFMpeg命令
FFCH4J项目全称:FFmpeg命令处理器,鉴于很多小伙伴们反馈原名太长,改为‘FFCH4J’
## 说明
Java封装的提供ffmpeg命令执行、停止、查询功能的简单管理器 。
FFCH4j不仅仅只支持ffmpeg命令,还支持执行多平台的命令行指令,不管是执行linux命令还是windows的命令行都是手到擒来(注意:本项目并未屏蔽某些敏感操作,比如rm -rf,当然这会产生一些风险,还请注意规避)。
除了保证命令行运行,还拥有独立的轻量级的保活线程来重启因为异常故障导致中断的任务。
## 特性
零依赖(不依赖任何第三方jar包,只需要java运行环境即可运行),完全接口化(所有内部组件都实现了完全接口化,开发人员可以方便的修改和扩展程序,比如自行实现持久层接口来替换默认的持久层)。
# easystream - 简单的rtsp转rtmp,hlv,hls播放流框架
easystream是一个对海康大华rtsp二次封装转换为web直播流的框架。
利用nginx实现rtmp、hlv、hls格式播放视频。
个人测试,还是有一些不太方便的地方,有带完善!
Gitee地址:https://gitee.com/null_166_0518/easystream